
非対称ルーティングの問題で気が狂いそうです!
3 つの NIC を備えたマルチホーム サーバーを構築しようとしています。各 NIC は 3 つの異なるサブネットに接続されています。
eth0: LAN 接続、10.99.72.38; 機能: 管理トラフィック
eth1: LAN 接続、10.99.70.150; 機能: ユーザー トラフィック
eth2: WAN 接続、10.99.74.85; 機能: ユーザー トラフィック
私は Amazon Linux イメージ (Linux 3.14.20-20.44.amzn1.x86_64 x86_64) を使用していますが、本当に違いがある場合は CentOS に切り替えることができます。
実装しようとしている機能:
eth0: 管理トラフィック
- アドレス: 10.99.72.38
- これを「分離された」インターフェースにして、10.0.0.0/8 のアドレスのみを受け入れて応答するようにしたい
- これは「ローカル LAN からの ssh のみ」の NIC と考えてください。
- eth0経由でのみ応答できます
- 他のすべての宛先はブロックされており、このインターフェースを介して他の宛先に到達することはできません。
- eth0 に到着するトラフィックの応答トラフィックには eth1 または eth2 を使用しません。
eth1: LANとの間のユーザートラフィック
- 住所: 10.99.70.150
- LANから任意の宛先へのあらゆるユーザートラフィックを受け入れます
- 10.xxx宛のトラフィックのパケットをeth1経由でルーティングします。
- 他の宛先へのパケットを eth2 経由でルーティングします (デフォルト ルート)
- 受信パケットをeth0経由でルーティングしません
eth2: WANとの間のユーザートラフィック
- アドレス: 10.99.74.85
- eth1 からのすべてのユーザートラフィックを受け入れ、10.xxx 以外の宛先にパケットを eth2 から送信します。
- eth2 で応答パケットを受け入れ、10.xxx 宛てのトラフィックは eth1 経由でルーティングします。
- 受信パケットをeth0経由でルーティングしません
rt_tables に「mgmt」という iproute2 テーブルを作成し、このインターフェイスを分離するために高い優先度のポリシー ベースのルーティング ルールを追加しましたが、何を試しても、メイン ルーティング テーブルは依然として eth0 がデフォルト ルートとして呼び出されているようです。問題は次のとおりです。
- eth1 からの受信パケットは eth0 を経由してルーティングされます (これは望ましくありません)
- eth2 から 10.xxx 宛てに着信するパケットは eth0 を経由してルーティングされます (これは望ましくありません)。
- メインからデフォルトの eth0 ルートを削除すると、mgmt テーブルにルートがあっても eth0 の機能が完全に失われますが、eth1 は正しく応答します。
最初から、変更されていないルート テーブル (route -n) は次のとおりです。
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.99.72.1 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 10.99.70.1 0.0.0.0 UG 10001 0 0 eth1
0.0.0.0 10.99.74.1 0.0.0.0 UG 10002 0 0 eth2
10.99.70.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
10.99.72.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.99.74.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
変更されていない IP ルールは次のとおりです。
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
特定のルーティング ルール、テーブル、ルートを正しく定式化し、最終的なルーティング テーブルとルールがどのようになるかを示していただけると助かります。
答え1
eth0
およびのデフォルト ゲートウェイ設定を削除する必要がありますeth1
。その方法はディストリビューションによって異なります。
おそらく、ポリシー ルーティングは必要ありません。必要なことは、Netfilter / で実現するのが最適だと思いますiptables
。
iptables -I INPUT 1 -i eth0 ! -s 10.99.72.0/24 -j DROP
iptables -I FORWARD 1 -i eth0 -j DROP
iptables -I FORWARD 2 -o eth0 -j DROP
iptables -I INPUT 2 -i eth1 ! -s 10.0.0.0/8 -j DROP
iptables -I FORWARD 3 -i eth1 -j ACCEPT
iptables -I INPUT 3 -i eth2 -m conntrack --ctstate NEW -j DROP
iptables -I FORWARD 4 -i eth2 -j ACCEPT
これはおそらく、Netfilter を使用せずに、代わりにポリシー ルーティングを使用して実行できます。