Linux路由问题

对于我正在进行的驱动程序testing,我需要通过第三台充当路由器的Linux机器连接2台Linux机器。 每台机器都有一个专有networking设备,带有2个端口,因此一个端口在子网11.xxx下,第二个在子网下12.xxx。我通过它远程连接的服务端口在10.xxx子网下。 testing仅在11和12子网中的专有设备上完成。

机器configuration的虚幻:

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的第一个端口断开连接。

我configuration了B(路由机器)转发IP请求。 然后我使用ip route shell命令configurationA和C,如下所示:

一个

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 ping 12.0.0.3,它的工作原理,反之亦然。 问题是我的TCP代码在AC之间无法正常工作。 它只适用于相邻的机器,如A + BB + C。

一个简单的python脚本,发送一个"Hello World!" 通过TCP工作的string,但是当相同的脚本发送大于1450字节的消息时,什么也不通过。 两个主机之间build立连接,但信息不通过。 在这里再次提到ping大于1450字节的数据包是很重要的。

我想我可能在路由器的configuration或ip route中的不完整的configuration这里做错了什么。

什么可能导致这样的问题?

只是一个想法,MTU(最大传输单位)通常是1500字节。 用ifconfig检查。 1450听起来非常接近1500 – IP + TCP头。 如果在所有机器上的两个接口上都提高MTU,那么您是否能够传输更大的TCP数据包?

 ifconfig <device> mtu 2000 

我不知道1450字节以上的ping数据包的作用。

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

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

  3. 如果上面的东西不工作,然后在所有三个节点上运行wireshark或至lesstcpdump,然后运行您的程序。

你有路由器上运行的networking过滤(如iptables)吗?

如果按状态筛选并允许NEW,则还应该允许RELATED和ESTABLISHED包。 否则只有第一个数据包将被允许,这看起来像你在这里。

只是一个小小的评论:你指定上述networking为/ 16,但这些通常是/ 8networking要互连。 是在11.0testing的目标主机。 和12.0。 是路由器设置为正确的networking?

哇,我忽略了这个问题。 从那以后,我换了一个工作场所。

但答案很简单 – 事实certificate,这并不是因为驱动程序中的错误而行不通,这正是我们正在testing的。 驾驶失败的原因正是这样一个基本的组成部分,我们不认为所描述的问题可能是驾驶员失败造成的。

感谢您的帮助,虽然:)