質問: ネットワークアクセスが特定のネットワークインターフェイスを介してバインドされるようにしながら、プログラムを起動するにはどうすればよいですか?
ケース: 同じIP(192.168.1.1)を使用しますが、2つの異なるネットワークインタフェース(eth1とeth2)を介して2つの異なるシステムにアクセスしたいと思います。
例:
net-bind -D eth1 -exec {Program 192.168.1.1}
net-bind -D eth2 -exec {Program 192.168.1.1}
上記は、以下を介して行われたハードウェアバインディングに触発され、私が望むもののおおよそのものです。プリマスレンそして最適化された操作。
挑戦:提案通り関連トピック、使用されるインタフェースはプログラムではなくカーネルによって選択されます(したがって、上記の例の事前バインドされた構文)。
いくつかの関連する解決策が見つかりましたが、どちらも満足できません。これは、ユーザー固有のネットワークブラックリストを介したバインディングネットワークインターフェースに基づいています。つまり、単一の特定のネットワークインターフェイスにのみアクセスできるユーザーとしてプロセスを実行します。
答え1
Linuxの場合、この質問はすでにSuperuserで回答されています。さまざまなプロセスにさまざまなネットワークインターフェイスを使用する方法は?。
最も人気のある回答は、LD_PRELOAD
プログラムのネットワークバインディングを変更するトリックを使用しますが、最新のカーネルは、プログラムで公開される「ネットワークネームスペース」というより柔軟な機能をサポートしていますip
。これ回答使用方法を示します。私自身の実験に基づいて、rootとして以下を行いました。
# 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
unshare
また、コマンドを使用してnsenter
ネットワークの名前空間をある程度管理することもできます。また、PID、ユーザー、およびマウントポイント用に別々のスペースを作成できます。詳細については、次を参照してください。
答え2
私はGraemeの答えを受け入れます。これは私の問題を解決するために彼の提案に対する変更を説明するためのフォローアップです。
名前空間内に物理インターフェイスをバインドする代わりに、ネットワーク名前空間に一方の端があり、ルートにもう一方の端を持つ仮想ネットワークインターフェイスのペアを作成しました。その後、パケットはこの仮想ネットワークを介してネームスペースからルートネームスペースに、物理インターフェイスにルーティングされます。 - したがって、特定のインターフェイスにのみアクセスできるプロセスを開始することに加えて、すべての一般的なデータ転送を実行できます。
# Create the eth0 network namespace
ip netns add eth0_ns
# Create the virtual network pair
ip link add v_eth0a type veth peer name v_eth0b
# Move v_eth0a to the eth0_ns namespace, the virtual pair is now split
# between two network namespaces.
ip link set v_eth0a netns eth0_ns
# Configure the ends of the virtual network pairs
ip netns exec eth0_ns ifconfig v_eth0a up {{NAMESPACE_IP}} netmask {{NAMESPACE_NETMASK}}
ifconfig v_eth0b up {{ROOT_NS_IP}} netmask {{ROOT_NS_NETMASK}}
# Setup routing from namespace to root
ip netns exec eth0_ns route add default gw {{ROOT_NS_IP}} dev v_eth0a
# Setup IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s {{ROUTE_SOURCE}}/24 -o {{NETWORK_INTERFACE}} -j SNAT --to-source {{ROUTE_TARGET}}
eth0 および eth1 とその名前空間 eth0_ns および eth1_ns にインターフェイスが設定されている場合は、次のように指定したインターフェイスでプログラムを実行できます。
ip netns exec eth0_ns fish
ip netns exec eth1_ns fish
答え3
解決策1:特定のライブラリをプリロード
アプリケーションルーティング刑務所:ld_preloadを使用してインターフェイスゲートウェイを強制します(良い考えですが、ルートまたはタグ機能が必要です)使用法の詳細については、以下の説明を参照してください。
プロキシバインディング:ld_preloadを使用して特定のアプリケーションにプロキシを強制します(インターフェイスではなくプロキシを使用します)。
強制バインディング:機能は多いがバインディングリーク(信頼できない)
インターフェイスIPバインディング:単純すぎて接続が漏れている(信頼できません)
IPバインディング:方法が簡単すぎて接続が漏れる(信頼できない)
解決策2:Linuxユーザースペース
クラシックLinuxユーザースペースIPネットワーク: 良いソリューションですが、root が必要で、インターフェイスは 1 つのユーザースペースにのみ存在できます。
地獄火:Firejailはアプリケーションが特定のネットワークを使用することを強制することができますが、互換性は制限されています(たとえば、トンインターフェイスとの非互換性)。 Firejailにはrootは必要ありません
firejail --dns=8.8.8.8 --noprofile --net=eth0 --ip=192.168.1.1 app-command
Netnsのある防火刑務所:Firejailは、アプリケーションが個別に作成された特定のユーザースペースを使用するように強制できます。これにより、ルートなしでネームスペースを指定できます。
firejail --dns=8.8.8.8 --noprofile --netns=nameOfyourNS app-command
仮面舞踏会と橋のある消防刑務所:Firejailはアプリケーションを強制的に使用することができます。iptablesで偽装した特定のインターフェース、素晴らしいとルートは必要ありませんしかし、これには ip_forward が必要で、セキュリティに影響を与える可能性があります。
firejail --net=br0 firefox
解決策 3: Linux iptables
この目的のためにiptablesを使用することができますしかし、これには ip_forward が必要であり、誤って設定されているとセキュリティに影響を与える可能性があります。実施例1、実施例2、実施例3、実施例4
ソリューション(I、II、III)注:
ワイヤーガード
VPN(特にwireguard)を使用しており、このソリューションをWireguardインターフェイス(ユーザースペースのあるワイヤーガード)リンクの指示に従って、wgインターフェース(したがってVPNインターフェースのみ)を含むユーザースペースを作成するか、firejail --netns=container
ルートなしでユーザースペースを使用してそれらを組み合わせることができます。
インターフェイスゲートウェイを見つける方法
ゲートウェイを見つけるためのソリューションはさまざまです。以下は、使用されているゲートウェイを見つけるためのいくつかのコマンドです。
$ 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-Root-Jail
chmod 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
- WAN IP アドレスのテスト
MARK=10 LD_PRELOAD=./mark.so wget -qO- ifconfig.me
答え4
別のソリューションがプリロードされています。
インターフェイスにバインド
インターフェイスにバインドプログラムが特定のインターフェースを使用するように強制するライブラリーをロードします。 intikaの応答を強制する他の3つのバインディングオプションは特定のIPアドレスにバインドされます。したがって、たとえば、192.168.178.68のすべてのインターフェイスにバインドできることを意味する0.0.0.0ではなく、このインターフェイスでのみ受信するようにバインドできます。ただし、接続が確立されると、デフォルトのルートテーブルが引き続き使用され、他のインターフェイスが使用されます。
BindToInterfaceは次のように動作しますBIND_INTERFACE=eth1 LD_PRELOAD=./bindToInterface.so <your command>
。 DNSサーバーを上書きすることもできます。これは、バインディングインターフェイスを介してプライマリDNSサーバーに接続できない場合に便利です。これにより接続速度が向上します。環境変数を使用してこれを制御できます。DNS_OVERRIDE_IP=8.8.8.8
プログラムが eth1 にバインドされると、localhost に接続できません。そのIPまたは他のIPに到達する必要がある場合は、そのIPを除外できますBIND_EXCLUDE=127.0.0.1
。
したがって、コマンドは次のようになります
BIND_INTERFACE=eth1 DNS_OVERRIDE_IP=8.8.8.8 BIND_EXCLUDE=127.0.0.1 LD_PRELOAD=./bindToInterface.so <your command>
。
いくつかのオプションがありますGithubページで説明されているインターフェイスにバインドします。。
現在(2020年3月)、FirejailソリューションはWi-Fi経由では利用できません。https://github.com/netblue30/firejail/issues/3000