routing – 使用tor代理作为网络网关的正确iptables规则是什么?

给定一个主机(路由器)具有以下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规则有误.但那是什么错误以及如何解决?

(旁注:我怀疑它是否相关,但路由器实际上是一个docker容器.)

更新:这是路由器上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:*                           -

最佳答案 我需要更多信息来确认您的问题的解决方案.

你在1.2.3.4上运行的卷曲会收集什么?如果你没有托管任何东西,那么你将不会得到任何回报,这应该是显而易见的.

您是否尝试为您期望的数据包禁用TCP_NODELAY?看来您的连接正在等待发送数据包,并且由于没有任何数据包,它最终会超时.

我认为你的IP TABLE规则根本就不对,或者至少你呈现它们的方式似乎有意义.

所以,因为我没有更多信息:

>我会通过ping您认为在Docker上打开的端口进行故障排除,可能是它们没有或不对外开放,或者它们被映射到不同的端口而不是您的想法,或者selinux或类似的东西是块连接.您可能需要在Docker和外部明确允许所需的端口.
>我也会尝试增加权限,这意味着以sudo身份运行,尤其是docker run命令.使用docker exec调查实例并确保它正确打开并运行您期望的服务.

点赞