web-dev-qa-db-ja.com

1つのインターフェースでのrp_filterの無効化

複数の(VLAN)インターフェイスを持つルーターとして機能しているUbuntu 16.04サーバーがあります。デフォルトでは、rp_filter(リバースパスフィルタリング)がすべてのインターフェイスで有効になっています。その方法を維持したいのですが、1つのインターフェイスだけを例外にしています。 (このインターフェースからのパケットは、このインターフェースのルーティング宛先アドレスに対応しない送信元IPアドレスを持つことが許可されている必要があります。)

このインターフェースの名前がens20.4で、vlan-raw-deviceがens20であり、宛先インターフェース(パケットフローのテスト用)がens20.2であるとします(ただし、任意の宛先インターフェース)。

rp_filterプロパティのみをens20.4のみに設定しようとしましたが、成功しませんでした。

echo 0 > /proc/sys/net/ipv4/conf/ens20.4/rp_filter

したがって、テストの目的で、vlan-raw-deviceとテストの宛先インターフェイスのrp_filterも無効にしました。

echo 0 > /proc/sys/net/ipv4/conf/ens20/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/ens20.2/rp_filter

それでも成功しない場合、「スプーフィングされた」送信元IPアドレスを持つパケットは引き続きドロップされます。 allインターフェイスでrp_filterを無効にした場合のみ、パケットは通過します。

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter

ただし、他のすべてのインターフェイスのリバースパスフィルタリングを維持したいのですが、何が欠けていますか?

9
Cybran

そこの情報: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/tree/Documentation/networking/ip-sysctl.txt?h=v4 .9#n109

あなたの試みを説明する最後の文に注意してください:

Conf/{all、interface}/rp_filterの最大値は、{interface}でソース検証を行うときに使用されます。

だからこれはうまくいくはずです:

for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
    echo 1 > "$i"
done
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/ens20.4/rp_filter

ここで、max(conf/{all、ens20.4}/rp_filter == 0:ソースの検証なし。他のインターフェースが保護されていることを再確認してください。

また、値が2の「ルーズ」なrpfをチェックすることもできます。パケットが通常、他のインターフェイスによってルーティングされる必要がある場合は、検証しないよりも良いでしょう。

12
A.B