私のシステムには2つのネットワークインターフェイスがあり、どちらも異なるIPアドレスを使用してインターネットに接続します。着信要求への応答を受信する同じインターフェイスを介して送信したいと思います。
ドイツのインターネットプロバイダの性質上、私のネットワークインターフェイスのパブリックIPアドレスは24時間ごとに変わります。これが同様の質問との主な違いです。受信と同じインターフェースで応答しますか?、対応する応答はすべて、インターフェイスのIPアドレスに基づいてIPルール定義に依存します。
IPアドレスの代わりにインターフェイスに基づいてルーティングテーブルを選択するようにIPルールを設定できますか?これまで持っているがまだうまく適用されていないアイデアは、iptables mangleを使用してオプションまたは設定をiif
使用することです。oif
fwmark
答え1
コメントのすべてのヒントに感謝します。これに基づいて、私は2つの可能な解決策を提案します。
オプション1:IPルール
2つのインターフェイスがあり、それが発信接続用の基本デバイスであると仮定し、eth1
このルーティングテーブルを使用して、着信要求に応答するIPルールを設定して使用する2番目のルーティングテーブルを定義します。eth2
eth1
eth2
eth2
iptables -t mangle -A INPUT -j CONNMARK -i eth2 --set-mark 2
iptables -t mangle -A OUTPUT -j CONNMARK -m connmark --mark 2 --restore-mark
ip route add 192.168.1.0/24 dev eth2 table 1234
ip route add default via 192.168.1.1 table 1234
ip rule add fwmark 2 lookup 1234
(IPv6についてもip6tables
同様に使用して繰り返しますip -6
。)
CONNMARK
マークを追加するつながる(応答を含む)とMARK
(受信)にタグを追加するバッグただ。このルールは着信要求とその応答をINPUT
設定します。 withルールはaにコピーされます。これは、ipルールの一致がsではなくsにのみ一致するために必要です。connmark
eth2
OUTPUT
--restore-mark
connmark
mark
fwmark
mark
connmark
タグOUTPUT
が-m connmark --mark 2
.connmark
そう2
でなければ、独自のタグに依存するWireguardが中断されるなど、すべての発信接続のタグを上書きするため、これを追加します。
ルーティング接続
上記のルールは、eth2
マシン自体が処理する着信接続のみと一致し、他のマシンにルーティングされた接続は一致しません。このユースケースをサポートするには、次の追加ルールを使用してください。
iptables -t mangle -A PREROUTING -j CONNMARK -m connmark --mark 2 --restore-mark
iptables -t mangle -A PREROUTING -j CONNMARK -i eth2 --set-mark 2
2番目のルールは通過するすべてのパケットを表示しますeth2
が、最初のルールはそのルールが通過するすべてのパケットを一致させます。つながるすでにチェックマークがあり、2
マークがコピーされます。つながる到着バッグ(元の受信パケットへの応答eth2
にもタグが付けられていることを確認してください。)
これを行うには、1234
ルート目的地マップテーブルに追加する必要があります!
解決策 2: IP 名前空間
このソリューションを使用すると、2つのネットワークインターフェイスが互いに完全に分離されます。各プロセスは名前空間の1つに割り当てられているため、2つのネットワークインターフェイスのうち1つのみを表示できます。これは、2つのネットワークインターフェイス(SSHなど)を介してアクセスできる必要があるサービスが、各名前空間に対して1回、2回開始される必要があることを意味します。プロセスとネットワークインターフェイスは互いに厳密に分離されているため、応答は自動的に正しいインターフェイスを介して送信されます。私が理解しているように、これは、特定のネットワークインタフェースを介してコンピュータにSSH接続するときに、そのSSHセッションで開始するすべての発信ネットワーク要求が常に同じネットワークインタフェースを使用することを意味します。
このソリューションは私のユースケースでは完璧ではないため、まだ試していませんが、オンラインで見つけることができる情報によると、次のように設定する必要があります。
ip netns add net2
ip link set eth2 netns net2
net2
その後、名前空間の範囲内ですべてのコマンドを実行できますip netns exec net2 <command>
。ネットワークインターフェイスを設定または使用するすべてのDHCPクライアントまたはその他のソフトウェアは、この方法で起動する必要があります。私の意見では、さまざまなLinuxディストリビューションのネットワーク構成ソリューション間のネームスペースに対する広範なサポートがまだないため、これを機能させるにはいくつかの手動スクリプトが必要になる場合があります。