对 IP 转发端口的响应未返回

Response to IP Forwarded Port not coming back

tl;dr:我有一个问题,而端口转发工作不正常。尽管一直看到数据包,但响应似乎永远不会回来(超时)。

情况

简而言之:https://raspberry-ip:5555 应该加载 https://server-ip:9999 但它并没有加载,尽管端口转发似乎在工作。

但是,请求在浏览器上超时 (ERR_CONNECTION_TIMED_OUT)。

疑难解答

在 Raspberry Pi 上的端口 5555 上执行 tcpdump,我看到了传入的流量。示例:

16:54:56.447235 IP 192.168.250.18.57300 > 192.168.250.8.5555: Flags [S], seq 691303721, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 280675211 ecr 0,sackOK,eol], length 0

在服务器上的端口 9999 上执行 tcpdump 看起来不错,并且直接来自笔记本电脑:

16:55:55.710925 IP 192.168.250.18.57315 > 192.168.250.250.9999: Flags [S], seq 2427731411, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 280734035 ecr 0,sackOK,eol], length 0

从服务器到笔记本电脑(在笔记本电脑上)执行 tcpdump,我也可以看到交互:

17:12:43.653411 IP 192.168.250.250.9999 > 192.168.250.18.57998: Flags [S.], seq 1225747155, ack 4067090852, win 65160, options [mss 1460,sackOK,TS val 2493575411 ecr 281722216,nop,wscale 7], length 0

所有 3 台机器(我的笔记本电脑、树莓派和服务器)都在同一个 /24 子网上,并且所有路由都配置正确。此外,我可以 ping 通其中的机器。所以它看起来不像是路由问题。

问题如下

192.168.250.18    192.168.250.8  192.168.250.250
   [client] ------ [raspberry] ----- [server]

这里发生的是服务器从 raspberry pi 收到重定向的数据包,但会尝试 return 将数据包直接发送到客户端,因为它们属于同一子网(这是一个假设不过。你能确认所有设备都有 /24 网络吗?)。 然后客户端将丢弃它,因为它来自服务器的 IP (192.168.250.250) 地址,并且它不是客户端试图建立到 192.168.250.8 的初始 session 的一部分。

解决这个问题的一种方法是在树莓派上执行 SNAT

$ iptables -t nat -I POSTROUTING -p tcp -s 192.168.250.18 -d 192.168.250.250 -j MASQUERADE 

当 raspberry 将流量发送到服务器时,这将更改 IP 的来源 header,因此服务器将 return 流量发送到 raspberry,而不是直接发送到客户端。