networking - 对 IP 转发端口未返回的响应
问题描述
tl; dr:我有一个问题,而端口转发无法正常工作。尽管一路看到数据包,但响应似乎永远不会回来(超时)。
情况
简而言之:https://raspberry-ip:5555
应该加载https://server-ip:9999
但它没有,尽管端口转发似乎正在工作。
我有一台服务器,它通过网站回复端口 9999。我可以直接从我的笔记本电脑访问。
我有一个 Raspberry Pi,它将流量从本地端口 5555 转发到服务器端口 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]
这里发生的是服务器从树莓派接收重定向数据包,但会尝试将数据包直接返回给客户端,因为它们属于同一子网(虽然这是一个假设。你能确认所有设备都有 /24 网络吗? )。然后客户端将丢弃它,因为它来自服务器的 IP (192.168.250.250) 地址,并且它不是客户端尝试与 192.168.250.8 建立的初始会话的一部分。
解决此问题的一种方法是在树莓上执行 SNAT
$ iptables -t nat -I POSTROUTING -p tcp -s 192.168.250.18 -d 192.168.250.250 -j MASQUERADE
当 raspberry 向服务器发送流量时,这将更改 IP 标头的来源,因此服务器会将流量返回给 raspberry,而不是直接返回给客户端。
推荐阅读
- vba - 想要一个列表框显示1-10,但是下拉中显示的内容依赖于另一个列表项
- javascript - 最少 8 个字符的正则表达式,在字母旁边添加数字或符号或两者
- python - 如何在单页显示帖子和相关评论?
- c# - Unity - 将 2D 平面上的输入映射到 3D 对象
- javascript - 如何通过 api 获取大量用户?使用异步等待
- c# - 如何将文件写入位于非 Windows 机器上的映射文件夹
- swift - 使用 SwiftUI 定义 macOS 窗口大小
- java - 如何在 Android Room 中编写一对一(两个嵌入式实体的多个 pojo)
- amazon-web-services - EC2 无处生成,未找到自动缩放组
- android - AppCompatDelegate:appcompat-v7:28.0.0 失败