13.1. 戻り経路フィルタ (Reverse Path Filtering)

デフォルトでは、ルータはすべてをルーティングします。 パケットが「明らかに」自分のネットワークには属していなくてもです。 よくある例は、プライベートの IP 空間がインターネットに漏れてしまう問題です。 195.96.96.0/24 に向かう経路があるインターフェースに対しては、 212.64.94.1 から発したパケットは、本来到着しないはずです。

ほとんどの人はこの機能を無効にしたいと思うはずですから、 カーネルハッカー達はこれを簡単できるようにしてくれました。 /proc 以下にあるファイルを使うと、カーネルに対してこの指示ができます。 この方法は戻り経路フィルタ (Reverse Path Filtering) と呼ばれています。基本的には、あるパケットに対する返信が、 そのパケットの入ってきたインターフェースに向かわない場合、 このパケットはインチキだとみなされて無視されることになります。

以下のコマンドを使うと、現在存在するインターフェース (と将来作られるインターフェース) すべてに対して、 この機能を有効にできます。

# for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do
>  echo 2 > $i 
> done

上記の例を実行しておくと、Linux ルータの ISP 側インターフェースに到着したパケットが、 オフィスからやって来たよ、と称していると、そのパケットは破棄されます。 同様に、オフィスのサブネットからきたパケットが、 ファイアウォールの外側からやって来た、と称していると、 それも同じように破棄されます。

これは完全な戻り経路フィルタです。 デフォルトでは、直接接続しているネットワークの IP だけに基づいてフィルタを行います。 完全なフィルタを行うと、非対称なルーティングで問題が出るからです (パケットの入ってくる経路と出て行く経路が違う場合です。 例えば衛星通信や、動的 (bgp, ospf, rip) 経路がネットワークにある場合など。 衛星のパラボラからやって来たデータには、 通常の地上回線を通して返信することになります)。

もしこの例外があなたの環境に当てはまる (実際にそうかは、おそらくご存じでしょう) 場合は、 衛星データがやって来るインターフェースで rp_filter を無効にすれば良いです。 パケットが破棄されているかを確認したければ、 同じディレクトリにある log_martians ファイルを使って、 それらのイベントを syslog に記録するようカーネルに伝えます。

# echo 1 >/proc/sys/net/ipv4/conf/<interfacename>/log_martians

FIXME: conf/{default,all}/* ファイルに設定するだけでいいのか? - martijn