ソフトウェア ネットワーク接続を指定されたインターフェイスにルーティングする方法 (Linux)

ソフトウェア ネットワーク接続を指定されたインターフェイスにルーティングする方法 (Linux)
aprogram -> eth1 -> internet A
bprogram -> eth2 -> internet B
aprogram -> eth2 -> internet B
etc.

プログラム (例: Python スクリプト、curl) のネットワーク通信ルートを、カスタム メカニズムによって指定されたインターフェイスに設定します。

Linux (Debian または Ubuntu) でこれを解決するにはどうすればよいですか。

答え1

ポリシー ルーティングをownermatch (iptables) またはskuid/ skgid(nftables) と組み合わせて使用​​し、それらのプログラムを異なるユーザーで実行できます。

  1. 異なるテーブルに異なるネクストホップを追加します。
ip route add default via 192.0.2.1 table 101
ip route add default via 192.0.2.2 table 102
ip route add default via 192.0.2.3 table 103
  1. ファイアウォール マークに基づいて使用するためのルールを追加します。
ip rule add fwmark 1 lookup 101
ip rule add fwmark 2 lookup 102
ip rule add fwmark 3 lookup 103
  1. ソケット所有者に基づいてパケットにこれらのマークを割り当てるファイアウォール ルールを追加します。
nft add rule filter output meta skuid 1001 mark set 1
nft add rule filter output meta skuid 1002 mark set 2
nft add rule filter output meta skuid 1003 mark set 3

または

iptables -A OUTPUT -m owner --uid-owner 1001 -j MARK --set-mark 1
iptables -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 2
iptables -A OUTPUT -m owner --uid-owner 1003 -j MARK --set-mark 3

これで、UID 1001 で実行されるプログラムは を経由してルーティングされる192.0.2.1ようになります。

関連情報