プロセスごとに異なるネットワークインターフェイスを使用する方法


59

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

プログラム(Twinkleソフトフォン)には同様のオプションがないため、外部で設定する必要があると思います。

どうすればいいですか?

編集:サーバープロセスを特定のインターフェイスにバインドするのではなく、クライアントプログラムが特定のインターフェイスを使用してサーバーに接続するようにします。


クライアントはbind / connectも使用します。ircII(irc-clientプログラム)を特定のipに強制する方法のbind.c.txtドキュメントを参照してください: 'bashの例は、ircIIの発信ソースアドレスとして仮想IPを使用します: bind_addr = "あなたの-のvirt-IP" LD_PRELOAD = / bind.so ircIIの」。
アキラ

私はここでは異なるアプローチを見つけ、私はそれが参考に願っています(私は確信して説明したカーネルのポリシールーティングはデフォルトで有効になっている願って、今日):kindlund.wordpress.com/2007/11/19/...
サヴァスRadevic

回答:


48

あなたはを使用して、実行時にコードを置き換えることができますLD_PRELOAD(あなたが呼ばれる同様の手法を使用することができ@windows 迂回、かなり派手に)。これは、実行したいプロセスに最初にすべてのlibをロードし、その上にさらに追加するように動的リンカーに通知することです。通常は次のように使用します。

% 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です

同様のハッキングとツール:


7
うわー、一体何。+1
sinni800

1
こんにちは、これは本当にすてきなトリックのようですが、私にはうまくいきません。接続時に2つのインターフェイス(ppp0とppp1)を開く2つの3Gモデムがあります。2つのIPのいずれかを強制しようとすると、常に同じインターフェイスで送信されます(各インターフェイスに1つずつ、wiresharkのインスタンスが2つあるためにわかります)。また、bind.cからデバッグ出力を削除しましたが、実際には「オーバーロードされた」ライブラリがロードされていることがわかります。そのため、なぜ機能しないのかわかりません。
アンドレアスパダチーニ

3
有効なUIDが実際のUIDと異なる場合、LD_PRELOADは無視されます。
マティアスクルル

force_bindカタリンM. Boieによるプロジェクトは、IPv6をサポート
BurnsBA

うまく動作しますが、コンパイルを成功させるには#include <arpa / inet.h>を追加する必要がありました。
安野

31

ip netnsはこれを行うことができます。

TL; DR: ネットワーク名前空間を作成し、それらにインターフェイスを関連付けてから、「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はプロセスが使用するルートを制御しないためです。最初のルートを使用します。

そして、常に同じルートを使用するため、デフォルトではルートに登録されたインターフェースになります(これは私たちが望むものではありません)


2
回答に詳細を追加してみてください。
Renju Chandran chingath

4
eth0がパブリックネットワークインターフェイスである場合、リモートサーバーでこれを行わないでください。
ygrek14年

1
最後の行はなければなりませんip netns exec myNamespace firefox
meuh

1
「sudo ip netns del <namespace-name>」を使用して、必要に応じて名前空間を削除してください!
エドゥアルドルチオ

1
@EduardoLucioのように実行できるはずです sudo ip netns exec myNamespace su -u someUser -c firefox
。– olivervbk

2

プロセスに特定のインターフェイスを使用させることは不可能だと思います。

ただし、ipchain / iptablesを使用して、プロセスがリッスンしている特定のポートが特定のインターフェイスを介してのみパケットを受信するように強制できる可能性があると思います。

便利なHOWTO:http : //tldp.org/HOWTO/IPCHAINS-HOWTO.html


2
それ以外の場合、2つの上位投票の投稿が証明します。
ポール・ギア

2

以下の@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:「sudo」コマンドの「-b -u」フラグを使用すると、アプリケーションをユーザー(「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

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


1

通常、プログラムにリッスンインターフェイスを設定するオプションがない場合、すべてのインターフェイスでリッスンします。(これはで確認できますlsof -i)。

目に見えたくないインターフェース上のポートに向けられた着信トラフィックをドロップするiptablesファイアウォールルールを作成するのが最も簡単な方法です。


1

代替I:

ld_preloadを使用してインターフェイスゲートウェイを強制するhttps://github.com/Intika-Linux-Network/App-Route-Jail

特定のネットワークインターフェイスを使用するようにアプリケーションに強制する

ネットワークインターフェースが使用しているゲートウェイを見つけてから、そのゲートウェイをジェイルされたアプリケーションに強制し、アプリケーションを特定のネットワークインターフェースに強制的にバインドする必要があります。

  • インターフェイスゲートウェイを見つける方法(ここでゲートウェイを見つけるための多くの解決策があります。使用されたゲートウェイを見つけることを許可するいくつかのコマンドがあります)
$ route
$ route -n
$ ip rule list
$ ip route show
$ netstat -rn
$ cat /etc/network/interfaces
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
$ traceroute www.google.com
$ ip route show 0.0.0.0/0 dev eth0

アプリケーションゲートウェイごと

  • App-Route-Jailのビルド
git clone https://github.com/Intika-Linux-Network/App-Route-Jail.git
cd Approute-Utils
chown 755 make.sh
./make.sh
  • この例の将来のマークされたパケット(jailされたアプリケーション用)の192.168.1.1ルートを強制ゲートウェイとして使用します。このルートルールは他のアプリケーションに影響を与えません。このソリューションを毎日使用する
ip rule add fwmark 10 table 100
ip route add default via 192.168.1.1 table 100
  • 投獄するアプリケーションを起動します
MARK=10 LD_PRELOAD=./mark.so firefox
  • WAN IPアドレスのテスト
MARK=10 LD_PRELOAD=./mark.so wget -qO- ifconfig.me

代替案II:

Firejail https://firejail.wordpress.com/は、アプリケーションに特定のネットワークの使用を強制できますが、互換性は制限されています。

firejail --dns=8.8.8.8 --net=eth0 --ip=192.168.1.1

通常のユーザーにはマークを付けられないため、rootとして実行する必要があることに注意してください。
jornane

-2

サーバーに接続しているインターフェイス以外のインターフェイスを使用して、そのサーバーと通信するプログラムが必要なのはなぜですか?また、システムがサーバーに接続されたインターフェイスを使用してそのサーバーと通信しない場合は、システムレベル(ルーティングテーブル)の問題であり、どのプロセスがそのサーバーと通信したいかは関係ありません。

IPネットワーク上の異なるサーバーには異なるIPアドレスがあります。カーネルは、ルーティングテーブルに基づいて特定のIPアドレスに到達するために使用するインターフェイスを知っている必要があります。同じIPアドレスを持つ2つの異なるサーバーと通信しようとすると、システムが混乱します(特に、宛先アドレスによって内部的にのみ接続のインデックスが作成されるため)。これを機能させることはできますが、1つのサーバーをソフトウェアNATを介してのみマシンに接続されている別の論理ネットワークに配置するシステムレベルの修正です。

したがって、IPアドレスが異なる場合は、ルートを使用して正しいインターフェイスを選択してください。それらが同じIPアドレスを持っている場合、システムに対して異なるIPアドレスを持っているように見えるようにNATを使用する必要があります。


3
まず、クライアントとサーバー間に複数の有効なルートが存在する場合がありますが、異なるトラフィックタイプに適した異なる特性があります。たとえば、UMTS(Cellular Data)には費用がかかる場合がありますが、WiFiよりも範囲が広くなりますが、どちらもファイバー接続よりも低速です。アップストリームプロバイダーがソースフィルタリング(またはNAT)を行う場合、「正しい」インターフェイスを送信する以外に選択肢はありません。次に、ルーティングに影響を与えることが送信元アドレスを選択する唯一の理由ではありません。両方のアドレスが同じインターフェース上にある場合でも、サーバー

1つのケースは、異なるパブリックIPがあり、発信接続のためにそれぞれで新しいプロセスを起動する場合です。
Rfraile
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.