iproute2 テーブルの継承またはコピー

iproute2 テーブルの継承またはコピー

次のコマンドを使用して、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が望ましくない新しいルーティングテーブルとルールを追加する一般的な方法は次のとおりです。

  1. 「例外」を含む新しいルーティングテーブルを作成します。FOO
  2. このテーブルを選択するには、条件を含むルールを追加します。FOO
  3. ルールの優先順位が低いため(より良い)、新しい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が望むものは次のとおりです。

  1. すべてのローカルトラフィックは、テーブルの共通パスを使用して処理する必要があります。main
  2. トラフィックがデフォルトルートから来る場合は、テーブル(ここ)192.168.1.0/24から取得する必要があります。FOOdev eth0
  3. それ以外の場合、トラフィックは「一般的な」デフォルトルートを使用します。

一般的な順序ではなく、この順序で実装してみましょう。結果は質問に記載されているものとまったく一致しない場合がありますが、目的の結果でなければなりません。解決しなければならない実際の問題とOPによって提供された正しい設​​定がないと、いくつかのことがぎこちないように見えることがあります(たとえば、テーブルからテーブルへのデフォルトパスをip route移動する再利用された出力)。maindefault

一般的なルールから始めてください。

# ip rule
0:  from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

テーブルは空でありdefault(デフォルトでは)自由に使用できます。

# ip route show table default
#
  1. main見つかったルールを低い優先順位に移動

    # ip rule add priority 32000 from all lookup main
    # ip rule del priority 32766
    
  2. 例外の実装

    # ip route add default dev eth0 table FOO
    # ip rule add priority 32100 from 192.168.1.0/24 lookup FOO
    
  3. ルール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 default253)の代わりに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の新しいネットワーキング方法についてはわかりません。

おすすめ記事