我想拥有一个通过Tor中继流量的VPN服务。我通过使用以下图像通过docker设置服务,而对Tor进行的更改很少,因此可以在外部接口(而不是localhost)上进行监听,因为它是由原始图像完成的。
我定义了在这些容器(openvpn,tor)之间共享的docker网络。然后根据this tor手册,我添加了iptables
规则以使流量从OpenVPN tun0
传递到Tor主机(docker容器)。最初,REDIRECT
目标用于重定向到本地主机。我将其替换为DNAT
,以重定向到单独的主机。
因此,Tor在*:5353
具有IP 172.19.0.2的docker容器内在*:9040
上侦听DNS,在eth0
上侦听TCP。 OpenVPN主机eth0
的IP地址是172.19.0.3。在openvpn
容器中,iptables nat表如下所示。
# 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的工作站。
Iptables filter
表链为空,并具有ACCEPT
策略。另外,我浏览了有关Server Fault等的类似文章(区别在于它们REDIRECT
到localhost),但仍然不知道如何解决此问题。它是Alpine Linux。连接跟踪已启用我通过conntrack
工具看到了连接,该连接立即关闭。
似乎服务器应答包中未清除TCP标志(SYN,ACK等)的Un-DNATed,导致未将源地址(172.19.0.2)替换为check.torproject.org的实际IP(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
我在哪里错了?
一个小问题是,如果原来的目的地被IP(172.19.0.2)替换,我不知道Tor如何确定将数据包发送到哪个主机?如果有人为我解决了这个问题,那就太好了。