2011-06-11 66 views
0

我有2个基于Linux的系统 - 一个带2个接口(1个LAN,1个调制解调器)和一个服务器的客户端。
我打开2个UDP套接字,并使用setsockopt和SO_BINDTODEVICE将每个套接字绑定到它的接口。
然后我通过每个套接字发送一条消息,从客户端到服务器。
他们都到达服务器。服务器套接字读取它们,并向它们中的每一个发送回复。
然后我尝试读取客户端上的服务器回复。
但是,只有1个回复。

此外,如果我运行tcpdump,我看到这两个答复是在他们相关的接口上,在他们离开的同一个端口上接收到的。然而,只有其中一个到达插座。另一个丢失了?

“丢失”数据包不是随机的,而是“非”默认数据包。如果我的路由表为空,则调制解调器丢失。如果我从调制解调器接口添加到服务器ip的路由,丢失的数据包将成为局域网的一部分。

然而,他们总是到达服务器,总是返回,始终在tcpdump中看到,但1永远不会到达套接字。怎么可能?通过多个接口发送/接收数据

+0

我们需要了解您如何设置路由。 – ninjalj 2011-06-11 11:31:53

回答

2

有一个名为rp_filter(反向路径验证过滤器)的ipv4网络配置参数。基本上,如果对数据包的回复不会出现这个数据包的接口,那么这是一个伪造的数据包,应该被忽略。这就是为什么当我在tcpdump上看到数据包时,它从未到达套接字。禁用它做了伎俩。

sysctl -w net.ipv4.conf.all.rp_filter=0 
sysctl -w net.ipv4.conf.eth0.rp_filter=0 
sysctl -w net.ipv4.conf.ppp0.rp_filter=0