ループとして構成する必要があるネットワークがあります。これは 3 つのノードで構成され、各ノードには 2 つのインターフェースがあります。以下の図で説明します。
+--->(eth0) Node 1 (eth1)--->(eth0) Node 2 (eth1)--->(eth0) Node 3 (eth1)--->+
| 10.0.3.1 10.0.1.1 10.0.1.2 10.0.2.2 10.0.2.3 10.0.3.3 |
+--<----------------------------<--------------------------------------------+
ノード 1 からノード 3 に ping を実行して、要求がノード 2 を通過し、応答がノード 3 からノード 1 に直接送信されるようにします。
node1$ ping 10.0.2.3
ノードを次のように構成しました。
node1# route add -net 10.0.2.0/24 gw 10.0.1.2
node2# route add -net 10.0.3.0/24 gw 10.0.2.3
node3# route add -net 10.0.1.0/24 gw 10.0.3.1
ping を実行すると、ノード 1 からの要求がノード 3 に到着します。ただし、ノード 3 は応答せず、応答すら生成しません (少なくとも、Wireshark でキャプチャできるものは)。
何かヒントをいただけませんか?
TA
答え1
ノードがソース発信元のパケットの IP アドレス。特に制約がない限り、通常はパケットの宛先までのルート上の次のホップに「最も近い」 IP アドレスが選択されます。
ノード 1 の観点から見ると、ノード 3 への次のホップは です10.0.1.2
。 に最も近いノード 1 の IP アドレスは10.0.1.2
であり10.0.1.1
、 ではありません10.0.3.1
。(宛先と同じサブネット上の IP アドレスは、同じサブネット上にない IP アドレスよりも宛先に「近い」と見なされます。)
ping の送信元 IP アドレスを確認します。おそらく、 では10.0.1.1
なく です10.0.3.1
。ノード 3 に へのルートがない場合10.0.1.1
、応答できません。
答え2
ノードは、暴走ブリッジ ブロードキャストを防ぐために、正しくリピートに失敗しています。スパニング ツリー プロトコルを実行することをお勧めします。これにより、すべてのノード間に完全に機能するルートを配置できます。レイヤー 2 またはレイヤー 3 の特定のリンク間の接続を制限する意思がない限り、これを行う別の方法は思いつきません。
答え3
(/sbin/route
は非推奨です。ip route
代わりに を使用してください)。
パケットを一方向にのみ移動させたい場合、宛先がどこであっても、すべてのノードが次のノードをゲートウェイとして使用する必要があります。
node1# ip route add 10.0.0.0/22 via 10.0.1.2
node2# ip route add 10.0.0.0/22 via 10.0.2.3
node3# ip route add 10.0.0.0/22 via 10.0.3.1
ただし、ほとんどのディストリビューションでは、リバース パス フィルタリングがデフォルトで有効になっていることがよくあります。リバース パス フィルタリングは、着信パケットのフィルタであり、このパケットへの応答が、パケットを受信したのと同じインターフェイスに送信されるかどうかをチェックします。これは、ルーティングが対称である一般的なネットワークでは良いことですが、この場合は非対称ルーティングが必要なので、パケットを受信するインターフェイスでリバース パス フィルタリングを無効にするか、少なくともソース IP がルーティング可能かどうかをチェックするように減らす必要があります。
node1# sysctl -w net.ipv4.conf.eth0.rp_filter=2
node2# sysctl -w net.ipv4.conf.eth0.rp_filter=2
node3# sysctl -w net.ipv4.conf.eth0.rp_filter=2
リバース パス フィルタリングやその他のノブに関するドキュメントは、カーネル ドキュメント () で参照できますDocumentation/networking/ip-sysctl.txt
。ドキュメントの参照先はディストリビューションによって異なります (または、Web で を検索してくださいip-sysctl.txt
)。
ループを楽しんでください!