這可以被認爲是this earlier SO question的延續。Linux:如何強制使用特定的網絡接口?
理想情況下,我想監獄一個進程只使用某個接口,無論如何。它將進行TCP連接,發送UDP數據報,並偵聽UDP廣播。目前,我正在做的是:
- 確定要使用的接口的IP。
- 創建知識產權政策規則路由從界面來該IP
- 創建另一個IP策略規則路由所有數據包從IP來該接口
- 設置默認的路由表中的每個規則的所有數據包
現在,這很有效,但客戶端過程也必須願意一起玩。也就是說,它需要綁定到它想要使用的接口的特定IP,我想我也需要設置SO_BINDTODEVICE
。 (但是,我一直在閱讀有關使用TCP或UDP時SO_BINDTODEVICE
實際上是否工作的衝突信息。)幸運的是,客戶端應用程序是Python,並且我可以擴展套接字類以透明地完成所有這些。但我不確定這是一個完整的解決方案,特別是在接收廣播方面。
我的問題是:
是否
SO_BINDTODEVICE
做什麼,我想在這裏?還是隻對原始插座有效?有人評論說,「套接字上的SO_BINDTODEVICE
不能保證套接字只接收在該物理接口的導線/天線上到達的數據包。」如果這確實如此,那麼SO_BINDTODEVICE
呢?有沒有辦法做到這一點,使本地IP不必是唯一的?除了一個接口上的DHCP服務器可能爲其分配一個正在被另一個接口使用的IP的事實之外,這不會成爲問題,因此會混淆路由表。
如何只接收來自特定接口的廣播?綁定到一個特定的IP似乎使它忽略廣播,這是有道理的,但不是我所期待的。
我在Ubuntu 8.04上運行w/Linux kernel 2.6.26。能夠通過兩個不同的接口同時訪問兩個不同網絡上的相同子網是一個不可協商的要求,因此使其(大部分)免於「不這樣做」。 :)
對於`net.ipv4.conf.all.rp_filter` sysctl變量,沒有IPv6 equivlant;但是相應的功能以netfilter的`rpfilter`模塊的形式存在。它記錄在[iptables-extensions](http://ipset.netfilter.org/iptables-extensions.man.html)手冊頁中。 [將rp_filter移動到netfilter](http://www.strlen.de/talks/rpfilter.pdf)注意到`rp_filter`可能會在未來的內核中完全從路由緩存代碼中移除。 – 2013-07-31 13:03:57