複数NICのサーバーは、行きと帰りの異なる経路に要注意(非対称ルーティング)

見出し



■非対称ルーティング

ネットワーク構成などの都合で、パケットの行きと帰りが違ってしまう場合があります。これは非対称ルーティングと呼ばれます。
このような場合に、パケットが破棄される可能性があります。
パケットの破棄は、主にステートフルファイアウォールなどのネットワーク機器で発生するものですが、ネットワーク構成によってはサーバーの機能でも発生してしまう場合があります。

例えば、次のような場合です。
スイッチでルーティングされている2つのサブネット(192.168.0.0/24,192.168.1.0/24)があり、Linuxサーバの2つのインターフェースはそれぞれのサブネットに属しています。
PCやサーバのデフォルトゲートウェイはレイヤ3スイッチです。
サーバでは、特別なルーティングは設定していません。

この状態で、
①Vlan AのPC(192.168.0.2/24)から、サーバのeth1(192.168.1.1/24)にアクセスすると、
②PCへの応答パケットはeth0(192.168.0.1/24)から帰そうとします。
見事な非対称ルーティングですね。
サーバのルーティングテーブルでは、192.168.0.0/24 はConnectedであるため、自然とそちらにルーティングしてしまいます。

■解決策

非対称ルーティングのパケットが破棄されないように設定します。
Rocky Linux 8 の環境で動作確認しました。

Linuxサーバの設定ファイル「/etc/sysctl.conf」に、以下の内容を追記します。
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2

設定の変更を反映させるためには、次のコマンドを実行します。(またはOS再起動)
sysctl -p

■解説

「rp_filter」とは、リバースパスフィルタのことです。(Reverse Path Filter)
パケットの入力インタフェースと出力インタフェースが異なる場合に、パケットを破棄する機能です。
デフォルトの挙動は設定「1(破棄)」です。OSのバージョンにもよるようですが、恐らく最近のものは破棄です。
そのため、明示的に「2(許可)」を設定することで、非対称ルーティングでも通信できるようになります。

しかし基本的には、なるべく非対称ルーティング自体が発生しないようなネットワーク設計を心がけるべきだと思います。