当我尝试移除家庭网络中的一些以太网线时,我拿了一台装有 Linux 的旧笔记本电脑,并尝试将其用作某种以太网 2 WiFi NAT 路由器(Wi-Fi 卡不能充当桥接器,所以我不得不做 NAT)。基本上,这是可行的,但此 NAT 路由器后面的所有客户端在 TCP 连接上都会不时出现网络错误。
首先,这是完整的设置:
INTERNET > wire > Standard Wi-Fi Router > air > Linux Router > Clients
在对 Linux 路由器和客户端进行一些嗅探之后,我发现了以下情况:
- 客户端照常连接到远程服务器并检索一些数据
- 客户端变得繁忙(例如,将数据写入磁盘)并且接收窗口已满
- 然后客户端基本上告诉服务器等待;在我的例子中,在连接断开之前,我在捕获中看到的最后一个 ACK 要么是 win=0,要么是 win < MTU
- 在最后一个 ACK 传输过程中,仍有一些数据包从远程服务器到达
- Linux 路由器对每个数据包都发送 RST 消息给远程服务器,从而破坏连接
- 客户端感到困惑,因为它在响应客户端发送的下一个数据包时从服务器获得了 RST
所以 [5] 是我这里的问题,我想知道为什么会发生这种情况以及如何解决它。
其他值得一提的事情:
- 无线网络本身运行良好
- 所有不在 Linux 机器后面的客户端都工作正常
- 据我所知,UDP 工作正常
iptables
在 Linux 路由器上
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE iptables -I FORWARD -i eth1 -o eth0 -s 192.168.2.0/24 -d 192.168.1.0/24 -j ACCEPT #用于静态路由 iptables -I FORWARD -i eth0 -o eth1 -s 192.168.1.0/24 -d 192.168.2.0/24 -j ACCEPT #用于静态路由
我还发现将输入链的策略设置为丢弃有帮助,因为它会丢弃导致重置的不需要的数据包,但在我看来这只是一个肮脏的修复。