非常に単純なシナリオがあります。残念ながら、この問題に一致する答えは見つかりませんでした。異なる WAN (192.168.0.70 と 192.168.0.80) 用に 2 つの Linux ルーター (= ゲートウェイ) があります。どちらもポート 50000 を Linux サーバー 192.168.0.60 に転送しています。サーバーには、デフォルト ゲートウェイ 192.168.0.70 を持つインターフェイスが 1 つだけあります。追加の構成がない場合、次の動作になります。
192.168.0.70 経由の受信リクエスト -> 応答が機能している (デフォルト ゲートウェイのため)
192.168.0.80 経由の受信リクエスト -> 応答に 192.168.0.70 がかかるため動作しません
192.168.0.80 経由のリクエストが 192.168.0.80 経由で送り返されるようにするにはどうすればよいでしょうか?
答え1
新しい接続にマーカーを付け、そのマーカーに基づいて送信パケットを区別し、2つのルーティングテーブルのいずれかを使用して適切なゲートウェイにルーティングする必要があります。CONNTRACKモジュールをロードする必要がある可能性があります。
modprobe ip_conntrack
MAC70をゲートウェイ192.168.0.70のMACアドレス、MAC80を192.168.0.80のMACアドレスとします。
iptables -A INPUT -m state --state NEW -m mac --mac-source MAC70 -p tcp --dport 50000 -j CONNMARK --set-mark 1
iptables -A INPUT -m state --state NEW -m mac --mac-source MAC80 -p tcp --dport 50000 -j CONNMARK --set-mark 2
これらの2つのルールは、2つの単純なマーカーで新しい着信接続(TCPプロトコルの場合、必要に応じて変更してください)をマークします。マーカーは接続全体用です。つまりこの最初のパケットに属する、ESTABLISHED、RELATED タイプの後続のすべてのパケットには、同じマークが付きます。
各パケットの送信元IPアドレスは接続を開始したクライアントのIPアドレスであるため、ゲートウェイのMACアドレスに基づいてのみ区別することができます。ないゲートウェイのものです。したがって、WiFi フレームは MAC アドレスを伝送しないため、これはイーサネット接続にのみ適用されます。
今
ip rule add fwmark 1 table router70
ip rule add fwmark 2 table router80
これら 2 つのコマンドは、接続/パケット マークに応じて、使用するルーティング テーブル (2 つのうち) を指定します。
ここで、2 つのルーティング テーブルを設定します。
echo 200 router70 >> /etc/iproute2/rt_tables
echo 201 router80 >> /etc/iproute2/rt_tables
ip route add 192.168.0.0/24 dev eth0 table router70
ip route add 192.168.0.0/24 dev eth0 table router80
ip route add default via 192.168.0.70 table router70
ip route add default via 192.168.0.80 table router80
これは、イーサネット NIC が eth0 と呼ばれていることを前提としています。そうでない場合は、それに応じて変更してください。他のすべてのポートおよび/またはプロトコルのルーティングは、それが何であれ、既存のもののままです。
完了です。