Linux PCには2つのネットワークインターフェイスがあり、特定のプロセスが使用するインターフェイスを手動で設定する必要があります。
プログラム(Twinkleソフトフォン)には同様のオプションがないため、外部で設定する必要があると思います。
どうすればいいですか?
編集:サーバープロセスを特定のインターフェイスにバインドするのではなく、クライアントプログラムが特定のインターフェイスを使用してサーバーに接続するようにします。
Linux PCには2つのネットワークインターフェイスがあり、特定のプロセスが使用するインターフェイスを手動で設定する必要があります。
プログラム(Twinkleソフトフォン)には同様のオプションがないため、外部で設定する必要があると思います。
どうすればいいですか?
編集:サーバープロセスを特定のインターフェイスにバインドするのではなく、クライアントプログラムが特定のインターフェイスを使用してサーバーに接続するようにします。
回答:
あなたはを使用して、実行時にコードを置き換えることができます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です
同様のハッキングとツール:
force_bind
カタリンM. Boieによるプロジェクトは、IPv6をサポート
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はプロセスが使用するルートを制御しないためです。最初のルートを使用します。
そして、常に同じルートを使用するため、デフォルトではルートに登録されたインターフェースになります(これは私たちが望むものではありません)
ip netns exec myNamespace firefox
sudo ip netns exec myNamespace su -u someUser -c firefox
プロセスに特定のインターフェイスを使用させることは不可能だと思います。
ただし、ipchain / iptablesを使用して、プロセスがリッスンしている特定のポートが特定のインターフェイスを介してのみパケットを受信するように強制できる可能性があると思います。
便利なHOWTO:http : //tldp.org/HOWTO/IPCHAINS-HOWTO.html
以下の@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 &
注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
...存在するものを削除します。
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
git clone https://github.com/Intika-Linux-Network/App-Route-Jail.git
cd Approute-Utils
chown 755 make.sh
./make.sh
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
MARK=10 LD_PRELOAD=./mark.so wget -qO- ifconfig.me
Firejail https://firejail.wordpress.com/は、アプリケーションに特定のネットワークの使用を強制できますが、互換性は制限されています。
firejail --dns=8.8.8.8 --net=eth0 --ip=192.168.1.1
サーバーに接続しているインターフェイス以外のインターフェイスを使用して、そのサーバーと通信するプログラムが必要なのはなぜですか?また、システムがサーバーに接続されたインターフェイスを使用してそのサーバーと通信しない場合は、システムレベル(ルーティングテーブル)の問題であり、どのプロセスがそのサーバーと通信したいかは関係ありません。
IPネットワーク上の異なるサーバーには異なるIPアドレスがあります。カーネルは、ルーティングテーブルに基づいて特定のIPアドレスに到達するために使用するインターフェイスを知っている必要があります。同じIPアドレスを持つ2つの異なるサーバーと通信しようとすると、システムが混乱します(特に、宛先アドレスによって内部的にのみ接続のインデックスが作成されるため)。これを機能させることはできますが、1つのサーバーをソフトウェアNATを介してのみマシンに接続されている別の論理ネットワークに配置するシステムレベルの修正です。
したがって、IPアドレスが異なる場合は、ルートを使用して正しいインターフェイスを選択してください。それらが同じIPアドレスを持っている場合、システムに対して異なるIPアドレスを持っているように見えるようにNATを使用する必要があります。