内容简介:http://stackoverflow.com/questions/563235/linux-how-do-i-force-a-specific-network-interface-to-be-used
的延续.
理想情况下,我想把一个进程只是使用某个界面,无论如何.它将进行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似乎使它忽略广播,这是有道理的,但不是我正在寻找.
我正在Ubuntu 8.04 / Linux内核2.6.26上运行.能够通过两个不同的接口同时访问两个不同的网络上的同一个子网是一个不可协商的要求,从而使其(大多数)免受“不这样做”的影响.
对于我的一般问题,似乎有几种方法可以做到:
涉及到路由表的复杂方式,每个进程的变化和协作.这是我上面描述的方式.它的一个优点是它可以从用户空间中工作.我已经附加了一些注释,并回答了我下面的具体问题.
>编写一个自定义内核模型,完全忽略路由表,如果设置了SO_BINDTODEVICE.但客户端进程仍然需要调用setsockopt(SOL_SOCKET,SO_BINDTODEVICE,dev).这个选择绝对不是为了微弱的心脏.
>虚拟化流程.这可能不适合很多人,它会带来自己的头痛,大多是配置.但值得一提的是.
选项1和2要求进程选择加入我们想要的工作.这可以通过创建一个动态库来部分缓解,该库劫持了用于创建套接字的socket()调用,然后在返回描述符之前立即将其绑定到设备.这更详细地描述了 here .
在进行了一些研究和大量的Google搜索之后,我可以得出关于 Linux 内核2.6.26的行为的一些结论.请注意,这些可能都是实现特定的行为,甚至是内核特定的行为.在决定根据我的单点数据实现功能之前,先测试自己的平台.
> SO_BINDTODEVICE确实做了它所说的,至少对于UDP.
因为我们使用路由表,所以每个接口的唯一IP似乎都是必要的.自定义内核模块可以绕过此限制.
>要在特定接口上接收广播,首先使用SO_BINDTODEVICE绑定到设备,然后用通常的bind()调用绑定到广播地址.设备绑定需要在其他任何事情之前完成.然后,套接字将只接收在该接口上到达的广播.
我通过首先创建一个套接字来测试它.然后我使用setsockopt(SOL_SOCKET,SO_BINDTODEVICE,dev)绑定到一个特定的接口.最后,我把它绑定到广播地址.从另一台计算机发送一个通过非接口接收的广播.设备绑定的套接字没有收到这个广播,这是有道理的.删除setsockopt(SOL_SOCKET,SO_BINDTODEVICE,dev)调用,广播将被接收.
还应该提到你也可以在这里使用setsockopt(SOL_SOCKET,SO_REUSEADDR,1).请注意,SO_REUSEADDR的语义随广播地址而变化.具体来说,如果两个套接字都设置了SO_REUSEADDR,则在同一台计算机上将两个套接字绑定到广播地址和同一端口.
更新:具有广播的SO_BINDTODEVICE似乎充满了危险,特别是广播帧的接收.我观察到在一个界面上收到的广播帧,但同时在另一个界面上消失.看来它们受到本地路由表的影响,但是不受IP策略规则的影响.但是,我不是100%肯定这一点,只要提到它是一个调查点,如果你想继续下去.所有这一切说:使用自己的风险.为了时间的考虑,我在界面上打开了一个原始套接字,并自动解析了以太网和IP头.
http://stackoverflow.com/questions/563235/linux-how-do-i-force-a-specific-network-interface-to-be-used
以上所述就是小编给大家介绍的《Linux:如何强制使用特定的网络接口?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 为什么阿里巴巴开发手册中强制要求接口返回值不允许使用枚举?
- golang的强制类型转换
- Lucene 段的强制合并(一)
- Lucene 段的强制合并(二)
- 什么是Python的强制()用于?
- 如何强制调用C#派生方法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Getting Real
Jason Fried、Heinemeier David Hansson、Matthew Linderman / 37signals / 2009-11-18 / USD 24.99
Getting Real details the business, design, programming, and marketing principles of 37signals. The book is packed with keep-it-simple insights, contrarian points of view, and unconventional approaches......一起来看看 《Getting Real》 这本书的介绍吧!