![Linux 路由问题](https://linux22.com/image/487039/Linux%20%E8%B7%AF%E7%94%B1%E9%97%AE%E9%A2%98.png)
对于我正在进行的驱动程序测试,我需要通过充当路由器的第三台 Linux 机器连接两台 Linux 机器。每台机器都有一个带有 2 个端口的专有网络设备,因此一个端口位于子网 11.xxx 下,第二个端口位于子网 12.xxx 下。我远程连接的服务端口位于 10.xxx 子网下。测试仅在 11 和 12 子网中的专有设备上进行。
机器配置说明:
A(11.0.0.1)<-> B(11.0.0.2)||- C(11.0.0.3)
A(12.0.0.1)-|| B(12.0.0.2)<-> C(12.0.0.3)
(图示的文字描述:A的第一个端口与B的第一个端口相连,B的第二个端口与C的第二个端口相连,且A的第二个端口,与C的第一个端口断开。)
我已经配置了 B(路由机器)来转发 IP 请求。然后我使用ip route
shell 命令配置了 A 和 C,如下所示:
A
ip route add "12.0.0.0/16" via 11.0.0.2
乙
ip route add "11.0.0.0/16" via 12.0.0.2
这有效。我从A任何数据包大小都可以,反之亦然。问题是我的 TCP 代码在A和C。它只适用于相邻的机器,例如A+乙和乙+C。
一个简单的 Python 脚本通过 TCP 发送"Hello World!"
字符串是可行的,但是当同一个脚本发送大于 1450 字节的消息时,什么都无法通过。两个主机之间建立了连接,但信息却无法通过。这里再次提到,使用大于 1450 字节的数据包进行 ping 是可行的。
我想我可能在这里做错了路由机器的配置或者配置不完整ip route
。
什么可能导致这样的问题?
答案1
只是一个想法,MTU(最大传输单元)通常为 1500 字节。使用 ifconfig 检查。1450 听起来非常接近 1500 - IP+TCP 标头。如果您在所有机器的两个接口上都提高 MTU,那么您是否能够传输更大的 TCP 数据包?
ifconfig <device> mtu 2000
我不知道 ping 大于 1450 字节的数据包是否有效。
答案2
确保路由器 (11.0.0.2 / 12.0.0.2) 上没有防火墙。使用 iptables -F。
确保已启用 IP 转发。如果只是更改 /etc/sysctl.conf,则需要重新启动。使用 sysctl net.ipv4.ip_forward 查看是否启用了 IP 转发。
如果上述方法不起作用,则在所有三个节点上运行 wireshark 或至少 tcpdump,然后运行您的程序。
答案3
路由器上是否运行网络过滤功能(如 iptables)?
如果您按状态过滤并允许 NEW,您也应该允许 RELATED 和 ESTABLISHED 数据包。否则,将只允许第一个数据包,这看起来就像您在这里看到的一样。
答案4
哇,我忽略了这个问题。从那时起我就换工作了。
但答案很简单——它之所以无法工作是因为驱动程序中的一个错误,而这正是我们正在测试的。驱动程序中一个如此基本的组件发生故障,以至于我们认为所描述的问题不可能是由驱动程序故障引起的。
不过还是感谢你的帮助 :)