Linux 通过多个接口发送/接收数据
我有两个基于linux的系统-一个具有2个接口(1个LAN、1个调制解调器)的客户端和一个服务器。Linux 通过多个接口发送/接收数据,linux,sockets,networking,Linux,Sockets,Networking,我有两个基于linux的系统-一个具有2个接口(1个LAN、1个调制解调器)的客户端和一个服务器。 我打开2个UDP套接字,并使用setsockopt和SO_BINDTODEVICE将每个套接字绑定到其接口。 然后,我通过每个套接字从客户端向服务器发送消息。 它们都到达服务器。服务器套接字读取它们,并向每一个发送回复。 然后我尝试在客户端上读取服务器的回复。 但是,只有一个回复。 另外,如果我运行tcpdump,我会看到这两个回复都是在它们的相关接口上接收的,在它们离开的同一端口上。然而,他们中
我打开2个UDP套接字,并使用setsockopt和SO_BINDTODEVICE将每个套接字绑定到其接口。
然后,我通过每个套接字从客户端向服务器发送消息。
它们都到达服务器。服务器套接字读取它们,并向每一个发送回复。
然后我尝试在客户端上读取服务器的回复。
但是,只有一个回复。
另外,如果我运行tcpdump,我会看到这两个回复都是在它们的相关接口上接收的,在它们离开的同一端口上。然而,他们中只有一个到达了插座。另一个丢失了?
“丢失”数据包不是随机的,它是“非”默认数据包。如果我的路由表为空,则调制解调器表将丢失。如果我从调制解调器接口添加到服务器ip的路由,丢失的数据包将是lan数据包。
然而,它们总是到达服务器,总是返回,总是在tcpdump中看到,但1从未到达套接字。这是怎么回事?有一个名为rp\u 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
我们需要看看您是如何设置路由的。