Linux 路由问题

Linux 路由问题

对于我正在进行的驱动程序测试,我需要通过充当路由器的第三台 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 routeshell 命令配置了 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 代码在AC。它只适用于相邻的机器,例如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

  1. 确保路由器 (11.0.0.2 / 12.0.0.2) 上没有防火墙。使用 iptables -F。

  2. 确保已启用 IP 转发。如果只是更改 /etc/sysctl.conf,则需要重新启动。使用 sysctl net.ipv4.ip_forward 查看是否启用了 IP 转发。

  3. 如果上述方法不起作用,则在所有三个节点上运行 wireshark 或至少 tcpdump,然后运行您的程序。

答案3

路由器上是否运行网络过滤功能(如 iptables)?

如果您按状态过滤并允许 NEW,您也应该允许 RELATED 和 ESTABLISHED 数据包。否则,将只允许第一个数据包,这看起来就像您在这里看到的一样。

答案4

哇,我忽略了这个问题。从那时起我就换工作了。

但答案很简单——它之所以无法工作是因为驱动程序中的一个错误,而这正是我们正在测试的。驱动程序中一个如此基本的组件发生故障,以至于我们认为所描述的问题不可能是由驱动程序故障引起的。

不过还是感谢你的帮助 :)

相关内容