通过OpenVPN将流量中继到docker容器内的Tor

时间:2019-06-09 20:30:56

标签: docker routing iptables tor openvpn

我想拥有一个通过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的工作站。

enter image description here

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如何确定将数据包发送到哪个主机?如果有人为我解决了这个问题,那就太好了。

0 个答案:

没有答案