【发布时间】:2010-10-08 11:21:46
【问题描述】:
这可以被认为是this earlier SO question的延续。
理想情况下,无论如何,我都希望让进程只使用某个接口。它将建立 TCP 连接、发送 UDP 数据报并侦听 UDP 广播。目前,我正在做的是:
- 确定要使用的接口的 IP。
- 创建一个 IP 策略规则,将来自接口的所有数据包路由到该 IP
- 创建另一个 IP 策略规则以将来自该 IP 的所有数据包路由到该接口
- 为每个规则设置默认路由表
现在,这主要是可行的,但客户端进程也必须愿意配合。也就是需要绑定到它要使用的接口的具体IP,我想我也需要设置SO_BINDTODEVICE。 (然而,我一直在阅读关于SO_BINDTODEVICE 在使用 TCP 或 UDP 时是否真的有效的相互矛盾的信息。)幸运的是,客户端应用程序是 Python,我可以扩展套接字类以透明地完成所有这些工作。但我不确定它是否是一个完整的解决方案,尤其是在接收广播方面。
我的问题是:
SO_BINDTODEVICE在这里做我想做的事吗?还是仅对原始套接字有效?有人评论说,“套接字上的SO_BINDTODEVICE并不能保证套接字只会接收到达该物理接口的电线/天线上的数据包。”如果这确实是真的,那么做什么SO_BINDTODEVICE做什么?有没有办法让本地 IP 不必是唯一的?除了一个接口上的 DHCP 服务器可能会为其分配一个由另一个接口使用的 IP,从而混淆路由表之外,这不会是一个问题。
如何仅从特定接口接收广播?绑定到特定 IP 似乎使其忽略广播,这是有道理的,但并不是我想要的。
我在带有 Linux 内核 2.6.26 的 Ubuntu 8.04 上运行。能够同时通过两个不同的接口访问两个不同网络上的同一个子网是一个不可协商的要求,因此它(大部分)不受“不要那样做”的影响。 :)
【问题讨论】: