Ретрансляция трафика через OpenVPN на Tor внутри док-контейнера - PullRequest
1 голос
/ 09 июня 2019

Я хотел бы иметь службу VPN, которая передает трафик через Tor. Я настраиваю сервисы через докер, используя следующие изображения с небольшими изменениями для Tor, заставляя слушать его на внешнем интерфейсе вместо localhost, как это делается с помощью оригинального изображения.

Я определил сеть докеров, которая является общей для этих контейнеров (openvpn, tor). Затем в соответствии с этим руководством по эксплуатации я добавил iptables правила для передачи трафика из OpenVPN tun0 в хост Tor (Docker-контейнер). В оригинале цель REDIRECT используется для перенаправления на localhost. Я заменил его на DNAT для перенаправления на отдельный хост.

Итак, Tor прослушивает *:5353 для DNS и *:9040 для TCP внутри контейнера докера, имеющего IP 172.19.0.2 для eth0. OpenVPN host eth0 IP-адрес 172.19.0.3. Внутри openvpn контейнера iptables nat table выглядит так.

#  iptables -t nat -vL
Chain PREROUTING (policy ACCEPT 71 packets, 24535 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 9116  547K DNAT       tcp  --  tun0   any     192.168.255.0/24     anywhere             tcp flags:FIN,SYN,RST,ACK/SYN to:172.19.0.2:9040
  145  9500 DNAT       udp  --  tun0   any     192.168.255.0/24     anywhere             udp dpt:domain to:172.19.0.2:5353

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 60 packets, 4212 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  341 23987 DOCKER_OUTPUT  all  --  any    any     anywhere             127.0.0.11          

Chain POSTROUTING (policy ACCEPT 120 packets, 8424 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  341 23987 DOCKER_POSTROUTING  all  --  any    any     anywhere             127.0.0.11          
18337 1238K MASQUERADE  all  --  any    eth0    192.168.255.0/24     anywhere            
    0     0 MASQUERADE  all  --  any    eth0    192.168.254.0/24     anywhere            

Chain DOCKER_OUTPUT (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       tcp  --  any    any     anywhere             127.0.0.11           tcp dpt:domain to:127.0.0.11:46653
  341 23987 DNAT       udp  --  any    any     anywhere             127.0.0.11           udp dpt:domain to:127.0.0.11:44292

Chain DOCKER_POSTROUTING (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 SNAT       tcp  --  any    any     127.0.0.11           anywhere             tcp spt:46653 to::53
    0     0 SNAT       udp  --  any    any     127.0.0.11           anywhere             udp spt:44292 to::53

Единственное изменение, которое я сделал, - это два первых правила, которые я добавил в цепочку PREROUTING. Команды для них:

iptables -t nat -A PREROUTING -i tun0 -p udp -s 192.168.255.0/24 --dport 53 -j DNAT --to-destination 172.19.0.2:5353
iptables -t nat -A PREROUTING -i tun0 -p tcp -s 192.168.255.0/24 --syn -j DNAT --to-destination 172.19.0.2:9040

После этого DNS работает нормально. Проблема с TCP. Соединение может быть установлено, но ответ от удаленной стороны вообще отсутствует. Соединение просто закрыто. Например. tcpdump из wget http://check.torproject.org выглядит следующим образом. Исходный хост (192.168.255.6) - это моя рабочая станция, подключенная к OpenVPN, который я пытаюсь настроить.

enter image description here

Iptables filter цепочки таблиц пусты и имеют политику ACCEPT. Также я просмотрел похожие сообщения о сбое сервера и т. Д. (С той разницей, что они REDIRECT для localhost) и до сих пор не знаю, как решить эту проблему. Это Alpine Linux. Отслеживание соединения включено. Я вижу соединение с помощью инструмента conntrack, оно сразу закрывается.

Похоже, что серверные ответные пакеты, в которых четкие флаги TCP (SYN, ACK и т. Д.) Не являются не-DNAT, приводят к тому, что адрес источника (172.19.0.2) не заменяется фактическим IP-адресом check.torproject.org (138.201. 14.212) как-то.

Конфигурация Tor выглядит следующим образом

# cat /etc/torrc 
VirtualAddrNetworkIPv4 10.192.0.0/10
AutomapHostsOnResolve 1
TransPort 0.0.0.0:9040
DNSPort 0.0.0.0:5353

Таблица маршрутизации

# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.19.0.1      0.0.0.0         UG    0      0        0 eth0
172.19.0.0      *               255.255.0.0     U     0      0        0 eth0
192.168.254.0   192.168.255.2   255.255.255.0   UG    0      0        0 tun0
192.168.255.0   192.168.255.2   255.255.255.0   UG    0      0        0 tun0
192.168.255.2   *               255.255.255.255 UH    0      0        0 tun0

Где я не прав?

И второстепенный вопрос: я не могу понять, как Tor выясняет, на какой хост отправлять пакет, если исходный пункт назначения заменяется его IP (172.19.0.2)? Было бы здорово, если бы кто-то прояснил это для меня.

...