Routing

將 unix 程序綁定到特定的網路介面

  • May 29, 2021

問題: 如何在確保通過特定網路介面綁定其網路訪問的同時啟動程序?

案例: 我想訪問具有相同 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}

以上是我想要的近似值,靈感來自通過primusrunoptirun完成的硬體綁定。

**挑戰:**正如相關執行緒中所建議的,所使用的介面不是由程序選擇的,而是由核心選擇的(因此上面範例中的預綁定語法)。

我找到了一些相關的解決方案,但並不令人滿意。它們基於通過使用者特定的網路黑名單綁定網路介面;即,以只能訪問單個特定網路介面的使用者身份執行程序。

對於 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

也可以使用unshareandnsenter命令在一定程度上管理網路名稱空間。這還允許您為 PID、使用者和掛載點創建單獨的空間。有關更多資訊,請參閱:

引用自:https://unix.stackexchange.com/questions/210982