如何為不同的進程使用不同的網路介面?

如何為不同的進程使用不同的網路介面?

我的 Linux PC 上有兩個網路接口,我需要手動設定給定進程將使用的介面。

該程式(Twinkle 軟體電話)沒有類似的選項,因此我認為它必須在外部設定。

我該怎麼做?

編輯:我並不是想讓伺服器進程綁定到特定的接口,而是讓客戶端程式使用特定的接口聯繫伺服器。

答案1

您可以使用以下命令在運行時替換程式碼LD_預先載入(@windows,您可以使用類似的技術,稱為走彎路,相當花俏)。它的作用是通知動態連結器首先將所有庫載入到要運行的進程中,然後在其上添加更多庫。你通常這樣使用它:

% LD_PRELOAD=./mylib.so ls

這樣你就改變了你ls所做的事情。

對於你的問題我會嘗試http://www.ryde.net/code/bind.c.txt,您可以這樣使用:

% BIND_ADDR="ip_of_ethX" LD_PRELOAD=./bind.so twinkle

以下是建置方法:

% wget http://www.ryde.net/code/bind.c.txt -O bind.c
% gcc -nostartfiles -fpic -shared bind.c -o bind.so -ldl -D_GNU_SOURCE

更長的方法是http://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html

類似的駭客和工具:

答案2

ip netns 可以做到這一點。

長話短說: 建立網路命名空間,將介面關聯到它們,然後執行“ip netns exec NAME cmd...”

只需檢查您的發行版是否支援 ip netns...(Backtrack 5r3 不支持,而 Kali 支援;))

更多細節:

#create netns
ip netns add myNamespace
#link iface to netns
ip link set eth0 netns myNamespace
#set ip address in namespace
ip netns exec myNamespace ifconfig eth0 192.168.0.10/24 up
#set loopback (may be needed by process run in this namespace)
ip netns exec myNamespace ifconfig lo 127.0.0.1/8 up
#set route in namespace
ip netns exec myNamespace route add default gw 192.168.0.1
#force firefox to run inside namespace (using eth0 as outgoing interface and the route)
ip netns exec myNamespace firefox

為什麼這比透過 LD_PRELOAD 綁定 ip 更好?因為LD_PRELOAD不控制進程使用的路由。它將使用第一條路線。

由於它總是使用相同的路由,因此它將預設使用註冊到該路由的介面。

答案3

基於@olivervbk 下面的答案是我的!

以“root”身份運行所有命令。

使用命令...

ip a

....找出您要使用的網路介面的名稱。

作為模板運行以下命令...

ip netns add [INTERFACE_NAME]_ns
ip link set dev [INTERFACE_NAME] netns [INTERFACE_NAME]_ns
ip netns exec [INTERFACE_NAME]_ns ifconfig [INTERFACE_NAME] 10.1.1.10/24 up
ip netns exec [INTERFACE_NAME]_ns ifconfig lo 127.0.0.1/8 up
ip netns exec [INTERFACE_NAME]_ns route add default gw 10.1.1.1
ip netns exec [INTERFACE_NAME]_ns dhcpcd [INTERFACE_NAME]
ip netns exec [INTERFACE_NAME]_ns sudo -b -u [YOUR_USER] [APP_NAME] 2> /dev/null 1> /dev/null &
  • [INTERFACE_NAME] - 替換為所選網路介面的名稱。
  • [YOUR_USER] - 替換為您的使用者名稱。
  • [APP_NAME] - 將在命名空間「[INTERFACE_NAME]_ns」中執行的應用程式的名稱。例如:「火狐」。

註一:-b -u「」命令中的「」標誌允許sudo應用程式使用您的使用者(而不是「root」)運行並在背景釋放終端。該2> /dev/null 1> /dev/null &程式碼片段是為了防止在終端上列印“[APP_NAME]”的輸出。
註二:ip「10.1.1.10」和「10.1.1.1」的值是任意的。
註三:為了為我工作,我必須運行dhcpcd [INTERFACE_NAME]命令。

若要刪除命名空間,請使用...

ip netns del [INTERFACE_NAME]_ns

.... 或者...

ip -all netns delete

...刪除任何存在的。

答案4

我認為不可能強制一個行程使用某個介面。

但是,我認為您可能可以使用 ipchain/iptables 並強制您的進程正在偵聽的某個連接埠僅接收透過特定介面發送的資料包。

有用的方法: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html

相關內容