Я хотел бы иметь службу 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](https://i.stack.imgur.com/vAZVi.png)
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)? Было бы здорово, если бы кто-то прояснил это для меня.