如何强制套接字连接在 Linux 下使用特定的网络适配器?ip 路由问题?

如何强制套接字连接在 Linux 下使用特定的网络适配器?ip 路由问题?

我有多个网络适配器,需要能够指定我的套接字使用哪个适配器进行出站连接,以便我可以将一个或多个套接字绑定到每个网络。我查看了这个问题的其他答案,但似乎无法让它发挥作用。

将套接字绑定到IP address我想要连接的适配器不起作用。 SO_BINDTODEVICE似乎也不起作用,尝试传递适配器名称或适配器索引,调用成功但套接字无法连接。我找不到一个完整的示例来SO_BINDTODEVICE阐明正确的用法。

使用上述方法的症状是服务器接收到连接,但connect()客户端失败并显示错误代码 2 (?)。我了解到需要使用 ip route 来确保回复数据包通过接收数据包的同一适配器发送,但似乎无法正确使用 ip route 命令。

The tables Teth0 and Twlan0 have been added.  

For eth0, the IP address is 192.168.1.23, the gateway is 192.168.1.1
For wlan0, the IP address is 192.168.2.100, the gateway is 192.168.2.1

ip route add 192.168.1.1/32 dev eth0 src 192.168.1.23 table Teth0
ip route add default via 192.168.1.1 table Teth0
ip rule add from 192.168.1.23 table Teth0

ip route add 192.168.2.1/32 dev wlan0 src 192.168.2.100 table Twlan0
ip route add default via 192.168.2.1 table Twlan0
ip rule add from 192.168.2.100 table Twlan0

ip 路由刷新缓存

m using在 GumStix Overo (Omap3) 上打开嵌入式 Linux 2.6.36。

我在这里快要疯了,任何建议都将不胜感激;)

答案1

您正在尝试定义两条通往外界的默认路由。您应该只有一个默认网关/路由。

很可能正在发生以下情况:

  • 您正在使用无线适配器作为指示的出站连接/源 IP 地址
  • 内核检查从 wlan0 到目的地是否有路由
  • 由于无线设备具有默认网关/路由,因此存在可行的路由,并且三方握手从 wlan0 开始
  • 在传输了一些流量之后(显然是 2mb),内核会查看连接并决定,尽管这些流量已经穿越了无线网络,但路由表中第一个(也是唯一相关的)默认网关/路由是通过 eth0
  • 内核开始通过 eth0 发送
  • 远端开始从 eth0 接收流量,要么是源 IP 地址错误,要么是不知道如何通过 eth0 网络返回 wlan0 IP 的数据,并忽略它
  • Linux 上有一些质量适中的工具可以帮你解决这个问题,但是它们不适用于静态 IP 地址,而且绝对不适用于糟糕的路由表。

    相关内容