4

给定一个具有以下 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:*                           -
4

1 回答 1

1

我需要更多信息来确认您的问题得到解决。

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

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

我认为您的 IP TABLE 规则根本没有错,或者至少您呈现它们的方式似乎是有道理的。

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

  1. 我会通过 ping 您认为在您的 docker 上打开的端口进行故障排除,可能它们没有或没有向外部开放,或者它们映射到与您想象的不同的端口,或者 selinux 或类似的东西是块连接。您可能需要在 Docker 和外部显式允许您需要的端口。

  2. 我也会尝试增加权限,这意味着以 sudo 的方式运行,尤其是 docker run 命令。使用 docker exec 调查实例并确保它正确打开并运行您期望的服务。

于 2018-02-09T01:13:31.107 回答