这可以被视为对这个早期的SO问题的延续。
理想情况下,我希望能够将一个进程监禁在仅使用某个接口上,无论如何。它将建立TCP连接,发送UDP数据报和监听UDP广播。目前,我的做法是:
- 确定要使用的接口的IP。
- 创建一个IP策略规则,将所有来自该接口的数据包路由到该IP。
- 创建另一个IP策略规则,将所有来自该IP的数据包路由到该接口。
- 为每个规则设置默认路由表。
现在,这基本上是可行的,但客户端进程也必须愿意配合。也就是说,它需要绑定到它想要使用的接口的特定IP,并且我认为我还需要设置SO_BINDTODEVICE
。(但是,我一直在阅读关于是否在使用TCP或UDP时SO_BINDTODEVICE
实际上有效的互相矛盾的信息。)幸运的是,客户端应用程序是Python,我可以扩展Socket类以透明地完成所有这些操作。但我不确定它是否是一个完整的解决方案,特别是关于接收广播方面。
我的问题是:
SO_BINDTODEVICE
在这里是否起到我想要的作用?还是它只对原始套接字有效?有人评论说:“套接字上的SO_BINDTODEVICE
不能保证套接字只接收到在该物理接口的电线/天线上传输的数据包。”如果这确实是真的,那么SO_BINDTODEVICE
到底是做什么的?是否有一种方法可以使本地IP不必是唯一的?除了DHCP服务器可能分配给一个已经被另一个接口使用的IP地址之外,这将不会是一个问题,从而混淆了路由表。
如何只从特定接口接收广播?绑定到特定IP似乎会忽略广播,这很合理,但不完全符合我的要求。
我在运行Ubuntu 8.04 w/ Linux kernel 2.6.26。通过两个不同的接口同时访问两个不同网络的同一子网是一个不可妥协的需求,因此它(大部分)免受“不要这样做”的影响。:)