異なるプロセスに異なるネットワーク インターフェイスを使用するにはどうすればよいでしょうか?

異なるプロセスに異なるネットワーク インターフェイスを使用するにはどうすればよいでしょうか?

Linux PC に 2 つのネットワーク インターフェイスがあり、特定のプロセスが使用するインターフェイスを手動で設定する必要があります。

プログラム(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" で実行されるアプリケーションの名前。例: "firefox"。

注I:「 」コマンド-b -uの「」フラグにより​​、sudoアプリケーションをユーザー(「root」ではない)を使用してバックグラウンドで実行し、ターミナルを解放することができます。この2> /dev/null 1> /dev/null &スニペットは、「[APP_NAME]」からの出力がターミナルに印刷されるのを防ぐためのものです。
注 II:ip「10.1.1.10」と「10.1.1.1」の値は任意です。
注III:私の場合、これを機能させるにはdhcpcd [INTERFACE_NAME]コマンドを実行する必要がありました。

名前空間を削除するには... を使用します。

ip netns del [INTERFACE_NAME]_ns

... または...

ip -all netns delete

...存在するものを削除します。

答え4

プロセスに特定のインターフェースの使用を強制することはできないと思います。

ただし、ipchain/iptables を操作して、プロセスがリッスンしている特定のポートが特定のインターフェースを介して送信されるパケットのみを取得するように強制することはできると思います。

役に立つHOWTO: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html

関連情報