Linuxでのポリシーベースルーティングについての私の理解は、ルーティングテーブル、ルート、ルールという3つの主要なコンポーネントがあるということです。私は多くのガイドをたどりましたが、それぞれのガイドでこれは正しいようです。そのため、ルートテーブルを作成し、そこにルートを追加してから、このテーブルを使用するための適格なトラフィックのルールを追加します。
これは私には理にかなっているように見えます。ルールのリストがあり、トラフィックがルールに一致する場合、ルートテーブルを調べて宛先に到達する方法を指示しますが、これは私にはうまくいかないようで、今来ました他の多くの記事で、ルーティングテーブルを設定した直後に、サブジェクトは同じルートをメインルートテーブルに追加しますが、これが必要な理由がわからないのです。またはそれは動作しません。
Linux Advanced Routing&Traffic Control HOWTO からの良い例は次のとおりです(リンクが消えた場合):
T2とT2の2つの追加ルーティングテーブルを作成します。これらは/ etc/iproute2/rt_tablesに追加されます。次に、これらのテーブルでルーティングを次のように設定します。
ip route add $P1_NET dev $IF1 src $IP1 table T1
ip route add default via $P1 table T1
ip route add $P2_NET dev $IF2 src $IP2 table T2
ip route add default via $P2 table T2
何も素晴らしいことではありません。単一のアップストリームプロバイダーの場合と同様に、ゲートウェイへのルートを作成し、そのゲートウェイ経由でデフォルトルートを作成しますが、プロバイダーごとに個別のテーブルにルートを配置します。上記で指定したように、ゲートウェイを含むそのネットワーク内のホストを見つける方法を説明しているため、ネットワークルートで十分であることに注意してください。
次に、メインのルーティングテーブルを設定します。隣接ノードに接続されているインターフェイスを介して、直接隣接ノードにルーティングすることをお勧めします。 「src」引数に注意してください。これらは正しい発信IPアドレスが選択されていることを確認します。
ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2
次に、デフォルトルートの設定:
ip route add default via $P1
次に、ルーティングルールを設定します。これらは実際にルーティングするルーティングテーブルを選択します。対応する送信元アドレスがすでにある場合は、特定のインターフェイスを確実にルーティングする必要があります。
ip rule add from $IP1 table T1
ip rule add from $IP2 table T2
このコマンドセットにより、特定のインターフェイスに着信するトラフィックに対するすべての応答が、そのインターフェイスから確実に応答されるようになります。
わかりましたので、特別に作成された新しいルートテーブルにルートを追加した後、メインルートテーブルにルートを追加する理由はまったくわかりません。
実際、混乱はこれらの指示が2つのトピックを混合しているという事実から生じていると思います:
これらの3行
ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2
ip route add default via $P1
何らかの理由でポリシールートと一致しないトラフィックを処理するためにあります(たとえば、ルーターにループバックを追加し、それを管理に使用します)。それらはPBRが機能するために厳密に必要なわけではありませんが、それらをすべて同じ場所に置くことをお勧めします。