Routing
將 unix 程序綁定到特定的網路介面
問題: 如何在確保通過特定網路介面綁定其網路訪問的同時啟動程序?
案例: 我想訪問具有相同 IP(192.168.1.1)的兩台不同的機器,但可以通過兩個不同的網路介面(eth1 和 eth2)訪問。
例子:
net-bind -D eth1 -exec {Program 192.168.1.1} net-bind -D eth2 -exec {Program 192.168.1.1}
以上是我想要的近似值,靈感來自通過primusrun和optirun完成的硬體綁定。
**挑戰:**正如相關執行緒中所建議的,所使用的介面不是由程序選擇的,而是由核心選擇的(因此上面範例中的預綁定語法)。
我找到了一些相關的解決方案,但並不令人滿意。它們基於通過使用者特定的網路黑名單綁定網路介面;即,以只能訪問單個特定網路介面的使用者身份執行程序。
對於 Linux,超級使用者已經回答了這個問題 -如何為不同的程序使用不同的網路介面?.
最流行的答案使用一種
LD_PRELOAD
技巧來更改程序的網路綁定,但現代核心支持一個更靈活的功能,稱為“網路名稱空間”,它通過ip
程序公開。這個答案顯示瞭如何使用它。根據我自己的實驗,我做了以下(作為根):# Add a new namespace called test_ns ip netns add test_ns # Set test to use eth0, after this point eth0 is not usable by programs # outside the namespace ip link set eth0 netns test_ns # Bring up eth0 inside test_ns ip netns exec test_ns ip link set eth0 up # Use dhcp to get an ipv4 address for eth0 ip netns exec test_ns dhclient eth0 # Ping google from inside the namespace ip netns exec test_ns ping www.google.co.uk
也可以使用
unshare
andnsenter
命令在一定程度上管理網路名稱空間。這還允許您為 PID、使用者和掛載點創建單獨的空間。有關更多資訊,請參閱: