鉴于一个主机(路由器),使用以下netfilter规则,以便将传入的TCP数据包重定向到它的代理服务:
-A PREROUTING -p tcp --syn -j REDIRECT --to-ports 9040
还将第二主机(客户端)配置为使用tor路由器作为网关:
sudo ip route add 1.2.3.4 via ${TOR_ROUTER_IP}
现在,当我建立到1.2.3.4的TCP连接(HTTP)时,它会在“TCP_NODELAY set”挂起一段时间,最后超时:
curl -v https://1.2.3.4
* Trying 1.2.3.4...
* TCP_NODELAY set
当我运行此命令时,我可以看到路由器上的相应计数器不断增加,使用以下命令:
iptables -t nat -L -v -n
这证实了实际应用开头提到的规则。但是,显然没有响应返回给客户端(curl命令)。
因此,我怀疑iptables规则有误。但那是什么错误以及如何解决?
(旁注:我怀疑它是否相关,但路由器实际上是一个泊坞容器。)
更新:以下是路由器上netstat -tulpen
的输出:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:9040 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:9050 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.11:36045 0.0.0.0:* LISTEN -
udp 0 0 127.0.0.11:45140 0.0.0.0:* -
udp 0 0 0.0.0.0:5353 0.0.0.0:* -
答案 0 :(得分:1)
我需要更多信息来确认您的问题的解决方案。
你在1.2.3.4上运行的卷曲会收集什么?如果你没有托管任何东西,那么你将不会得到任何回报,这应该是显而易见的。
您是否尝试为您期望的数据包禁用TCP_NODELAY?看来您的连接正在等待发送数据包,并且由于没有任何数据包,它最终会超时。
我认为你的IP TABLE规则根本就不对,或者至少你提出它们的方式似乎有意义。
因为我没有更多信息:
我会通过ping您认为在Docker上打开的端口进行故障排除,可能是它们没有或不对外开放,或者它们被映射到不同于您想到的端口,或者selinux或类似的东西是阻止连接。您可能需要在Docker和外部明确允许所需的端口。
我也会尝试增加权限,这意味着以sudo身份运行,尤其是docker run命令。使用docker exec调查实例并确保它正确打开并运行您期望的服务。