![iptables DNAT 适用于第一个 curl 请求,然后挂起](https://linux22.com/image/787561/iptables%20DNAT%20%E9%80%82%E7%94%A8%E4%BA%8E%E7%AC%AC%E4%B8%80%E4%B8%AA%20curl%20%E8%AF%B7%E6%B1%82%EF%BC%8C%E7%84%B6%E5%90%8E%E6%8C%82%E8%B5%B7.png)
我想要将接口 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 wg0
并route 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等)