我有2个基于Linux的系统 - 一个带有2个接口的客户端(1个LAN,1个调制解调器)和一个服务器
我打开2个UDP套接字,并使用带有SO_BINDTODEVICE的setsockopt将每个套接字绑定到它的接口。
然后我通过每个插槽从客户端向服务器发送消息
它们都到达服务器。服务器套接字读取它们,并向它们发送回复
然后我尝试在客户端上阅读服务器的回复
但是,只有1个回复。
此外,如果我运行tcpdump,我会看到两个回复都是在相关接口上,在它们离开的同一端口上收到的。然而只有其中一个达到了插座。另一个丢了?
“丢失”数据包不是随机的,而是“非”默认数据包。如果我的路由表为空,则调制解调器丢失。如果我从调制解调器接口添加到服务器ip的路由,则丢失的数据包将是LAN。(
然而,他们总是到达服务器,总是返回,总是在tcpdump中看到,但1永远不会到达套接字。怎么会这样?
答案 0 :(得分: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