OpenVPN 인터페이스를 통해 Tinyproxy 나가는 연결 라우팅

OpenVPN 인터페이스를 통해 Tinyproxy 나가는 연결 라우팅

Ubuntu 16.04 lxd 컨테이너를 만들고 여기에 Stunnel, Tinyproxy 및 OpenVPN 클라이언트를 설정했습니다.

목표는 Stunnel을 통해 Tinyproxy에 연결하고 Tinyproxy가 나가는 연결에 OpenVPN의 인터페이스를 사용하도록 하는 것입니다.

Stunnel -> Tinyproxy가 제대로 작동합니다. 브라우저의 페이지가 예상대로 로드되지만 OpenVPN 서비스를 시작하자마자 클라이언트 측의 Stunnel이 시간 초과로 인해 실패하고 브라우저가 계속 응답을 기다리고 있습니다.

Tinyproxy 1.8.3(ubuntu 16.04의 최신 버전)은 나가는 연결을 특정 인터페이스에 바인딩하는 옵션을 지원하지 않기 때문에 OpenVPN이 인터페이스를 통해 기본 경로를 추가하도록 해야 했습니다 tun0.

OpenVPN 클라이언트는 확장된 방식으로 작동합니다. 컨테이너의 모든 패킷은 VPN을 통과합니다. 컨테이너가 있는 호스트는 공용 IP를 사용하는 원격 호스트입니다. DNAT가 컨테이너에 설정되었습니다.

나는 내부 라우팅에 대해 잘 알지 못하며 SNAT/DNAT를 설정하고 iptables로 필터링만 할 수 있었습니다. 그러므로 문제의 근본 원인을 이해할 수 없습니다.

환경의 가장 중요한 매개변수는 다음과 같습니다.

ifconfig

$ ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:16:3e:5f:46:ba
          inet addr:10.227.60.197  Bcast:10.227.60.255  Mask:255.255.255.0
          inet6 addr: fe80::216:3eff:fe5f:46ba/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:16291 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15632 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:5044056 (5.0 MB)  TX bytes:4171187 (4.1 MB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:2446 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2446 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:2483699 (2.4 MB)  TX bytes:2483699 (2.4 MB)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.8.0.3  P-t-P:10.8.0.3  Mask:255.255.255.0
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:3 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:252 (252.0 B)  TX bytes:252 (252.0 B)

노선

$ route -v -e
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         10.8.0.1        128.0.0.0       UG        0 0          0 tun0
default         10.227.60.1     0.0.0.0         UG        0 0          0 eth0
10.8.0.0        *               255.255.255.0   U         0 0          0 tun0
10.227.60.0     *               255.255.255.0   U         0 0          0 eth0
128.0.0.0       10.8.0.1        128.0.0.0       UG        0 0          0 tun0
<vpn server IP> 10.227.60.1     255.255.255.255 UGH       0 0          0 eth0

stunnel.cong

...
accept = 10.227.60.197:8081
connect = 127.0.0.1:8080
...

tinyproxy.conf

...
Port 8080
Listen 127.0.0.1
...

vpnclient.conf

dev tun
proto udp
remote <vpn server ip> 1195
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
cipher AES-256-CBC
key-direction 1
verb 3
#route-nopull 
...

iptables비어 있습니다.

답변1

문제는 라우팅 테이블 구성에 있었습니다.

OpenVPN에 의해 ​​추가된 경로를 제거할 때 다음과 같은 사실을 발견했습니다.

Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         10.8.0.1        128.0.0.0       UG        0 0          0 tun0

을 사용하여 패킷을 수행 ping 8.8.8.8 -I tun0하고 동시에 모니터링 하려고 시도하면 tcpdump -nn icmp응답 ICMP 요청이 실제로 히트했지만 eth0더 이상 진행되지 않습니다. 몇 가지 조사 끝에 tun0서버에 2개의 인터페이스가 있으므로 이에 대한 별도의 라우팅 테이블과 규칙도 있어야 한다는 것을 알게 되었습니다 .

결국 아웃바운드 인터페이스를 지정할 수 있도록 Tinyproxy를 최신 버전으로 업데이트하고 OpenVPN을 비활성화하여 위에서 제거한 것과 같은 기본 경로를 푸시했습니다.

그런 다음 다음에 테이블을 추가했습니다 /etc/iproute2/rt_tables.

...
12 vpn

이 테이블과 규칙에 경로를 추가했습니다.

ip route add 10.8.0.0/24 dev tun0 src 10.8.0.3 table vpn
ip route add default via 10.8.0.1 dev tun0 table vpn

ip rule add from 10.8.0.3/32 table vpn
ip rule add to 10.8.0.3/32 table vpn

그 후 모든 것이 예상대로 작동하는 것으로 나타났습니다.

관련 정보