给定一台具有以下netfilter规则的主机(路由器),以便将传入的TCP数据包重定向到它的tor代理服务:

-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上,curl会收集到什么?如果您没有托管任何东西,那么您将不会得到任何回报,这很明显。

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

我认为您的IP TABLE规则完全没有错,或者至少您提出它们的方式似乎是合理的。

因此,由于我没有更多信息:


我可以通过ping您认为在docker上打开的端口来进行故障排除,很可能它们没有或没有对外部打开,或者它们映射到的端口与您想象的不同,或者是selinux或类似的块连接。您可能需要显式允许Docker和外部所需的端口。
我还将尝试提升权限,这意味着将其作为sudo运行,尤其是docker run命令。使用docker exec调查实例,并确保实例正确打开并运行您期望的服务。

关于routing - 使用Tor代理作为网络网关的正确iptables规则是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48602056/

10-08 23:28