iptables DNAT 适用于第一个 curl 请求,然后挂起

iptables DNAT 适用于第一个 curl 请求,然后挂起

我想要将接口 wlan0 上到达 192.168.1.10:8070 的所有数据包转发到接口 wg0 上的 10.59.99.4:8080。

我在 iptables 中添加了以下两条规则:

-A PREROUTING -p tcp --destination 192.168.1.10 --dport 8070 -j DNAT --to-destination 10.59.99.4:8080
-A POSTROUTING -p tcp --destination 10.59.99.4 --dport 8080 -j SNAT --to-source 192.168.1.10:8070

因为我使用 ufw 作为防火墙,所以我在 /etc/ufw/before.rules 中设置了它们

我也在net/ipv4/ip_forward=1/etc/ufw/sysctl.conf 中设置

我将这些规则添加到 ufw:route allow in on wlan0 out on wg0route allow in on wg0 out on wlan0确保允许两个接口之间的流量转发。我可以使它们更加严格,但我想确保 ufw 规则不是问题所在。

使用这些设置,curl 192.168.1.10:8070第一次执行时可以完美地工作,但如果我再次执行它,它会挂起几秒钟然后失败:

curl -v 192.168.1.10:8070
*   Trying 192.168.1.10:8070...
* connect to 192.168.1.10 port 8070 failed: Timed out
* Failed to connect to 192.168.1.10 port 8070 after 21060 ms: Couldn't connect to server
* Closing connection 0
curl: (28) Failed to connect to 192.168.1.10 port 8070 after 21060 ms: Couldn't connect to server

如果我等待几分钟,它会第一次再次工作,然后再次失败。

我尝试将数据包转发到同一接口上的其他地址,但发生了同样的情况。我还尝试将标头设置'Connection: close'为请求,认为保持连接完好可能会导致问题,但这没有帮助。

我认为这与连接状态无关,否则第一个 curl 也不会起作用,因为它来回发送多个数据包。

使用 tcpdump 我可以看到,对于第二个请求,192.168.1.10 接收来自 curl 的请求,但没有向 10.59.99.4 发送任何内容,所以问题可能就出在这里。

造成这种现象的原因可能是什么?我该如何解决?

我尝试在网上查找这个问题,但似乎只有我一个人遇到了这个问题。唯一与此问题相近的是,但我认为它不适用,因为它是关于REDIRECT,而不是NAT,并且它们只能发送第一个数据包,而在我的情况下,第一个curl请求能够发送多个数据包(SYN,ACK等)

相关内容