次のコマンドを使用して、Linuxの「ルータ」でソースポリシールーティングを設定しました。
ip rule add from 192.168.1.0/24 table FOO
ip route add default dev eth0 table FOO
このサブネットから転送されたパケットはインターネット宛先に到達します。
問題は、FOOテーブルがメインテーブルからローカル接続パスを継承しないことです。
ローカル接続用のパスを手動で追加できますが、これは脆弱でメンテナンスが必要です。
テーブルFOOがプライマリテーブルのすべてのパスを継承するようにするには、「ipパスの追加デフォルト値...」の代わりに「ipパス変更デフォルト値」を使用できます。
プライマリテーブルのプライマリパスは別のサブネットに残る必要があります。
どうすればいいですか?
答え1
OPが望ましくない新しいルーティングテーブルとルールを追加する一般的な方法は次のとおりです。
- 「例外」を含む新しいルーティングテーブルを作成します。
FOO
- このテーブルを選択するには、条件を含むルールを追加します。
FOO
- ルールの優先順位が低いため(より良い)、新しい
FOO
テーブルが最初に読み込まれるため、そのテーブルは通常完全に無視されますmain
。この問題を「修正」するには、main
テーブルのパスをテーブルにコピーしますFOO
。
ルールは次のとおりです。
# ip rule
0: from all lookup local
32765: from 192.168.1.0/24 lookup FOO
32766: from all lookup main
32767: from all lookup default
OPは、パスが変更されると管理負担が増えるため、3を実行する必要はありません。
私が理解したところによると、OPが望むものは次のとおりです。
- すべてのローカルトラフィックは、テーブルの共通パスを使用して処理する必要があります。
main
- トラフィックがデフォルトルートから来る場合は、テーブル(ここ)
192.168.1.0/24
から取得する必要があります。FOO
dev eth0
- それ以外の場合、トラフィックは「一般的な」デフォルトルートを使用します。
一般的な順序ではなく、この順序で実装してみましょう。結果は質問に記載されているものとまったく一致しない場合がありますが、目的の結果でなければなりません。解決しなければならない実際の問題とOPによって提供された正しい設定がないと、いくつかのことがぎこちないように見えることがあります(たとえば、テーブルからテーブルへのデフォルトパスをip route
移動する再利用された出力)。main
default
一般的なルールから始めてください。
# ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
テーブルは空でありdefault
(デフォルトでは)自由に使用できます。
# ip route show table default
#
main
見つかったルールを低い優先順位に移動# ip rule add priority 32000 from all lookup main # ip rule del priority 32766
例外の実装
# ip route add default dev eth0 table FOO # ip rule add priority 32100 from 192.168.1.0/24 lookup FOO
ルール32100で例外がトリガーされるように、「一般的な」デフォルトパスをテーブルから
main
テーブルに移動しました。default
以前に一致するものが見つからなかった場合、ルール32767はまだテーブルにデフォルトのパスを提供し、default
接続損失は発生しません。# ip route add $(ip route show 0.0.0.0/0) table default # ip route del default
今ルールは次のようになります。
# ip rule
0: from all lookup local
32000: from all lookup main
32100: from 192.168.1.0/24 lookup FOO
32767: from all lookup default
コンテナのいくつかの例(関連するテーブルだけを見るとあまり意味がありません):
# ip -br link
lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
eth0@if12 UP 66:d4:11:94:49:5f <BROADCAST,MULTICAST,UP,LOWER_UP>
local0@if9 UP 00:16:3e:6a:c1:e9 <BROADCAST,MULTICAST,UP,LOWER_UP>
# ip -4 -br a
lo UNKNOWN 127.0.0.1/8
local0@if9 UP 10.0.3.66/24
# ip route
10.0.3.0/24 dev local0 proto kernel scope link src 10.0.3.66
# ip route show table FOO
default dev eth0 scope link
# ip route show table default
default via 10.0.3.1 dev local0
# ip -o route get 10.0.3.2
10.0.3.2 dev local0 src 10.0.3.66 \ cache
# ip -o route get 8.8.8.8
8.8.8.8 via 10.0.3.1 dev local0 table default src 10.0.3.66 \ cache
# ip -o route get 8.8.8.8 from 192.168.1.2 iif local0
8.8.8.8 from 192.168.1.2 dev eth0 table FOO \ cache iif local0
それはすべてです。唯一の使用法の違いは、「一般的な」デフォルトパスをtable default
(253
)の代わりにtable main
()に設定する必要があることです254
。これを処理するには、起動スクリプトを調整する必要があります。設定ではデフォルトパスまたはゲートウェイを指定しないでください。これを行うには、追加のカスタムスクリプトを実行する必要がありますip route add default ... table default
。 Debianの場合、これは次のコマンドで行うことができますpost-up
(例えば post-up ip route add default via xxx table default || :
)存在する/etc/network/interfaces
。 RHEL7の場合、これを行う必要があります。パス-XXX文書。 systemdの新しいネットワーキング方法についてはわかりません。
答え2
ただ追加してください
ip rule add from 192.168.1.0/24 table main suppress_prefixlength 0
パケットは移動してtable main
ルートを探しますが、デフォルトtable main
ルートは使用されません。
その後、パケットはに移動してtable FOO
にルーティングされますeth0
。