【问题标题】:send/receive data through multiple interfaces通过多个接口发送/接收数据
【发布时间】:2011-09-13 00:21:04
【问题描述】:

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

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

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

然而,它们总是到达服务器,总是返回,总是在 tcpdump 中看到,但 1 从未到达套接字。怎么可能?

【问题讨论】:

  • 我们需要看看您是如何设置路由的。

标签: linux sockets networking


【解决方案1】:

有一个名为 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2015-04-21
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多