CentOS 7 の rp_filter でハマった件

CentOS 7 のネットワーク設定でハマった話.

例えば,インターフェイスを2つもち,次のようにそれぞれ別のサブネットに接続していたとする.

eth0 192.168.0.2/24
eth1 192.168.1.2/24

CentOS7の標準設定の場合このマシンに外部,例えば 192.168.2.3/24, から ping をうつとどちらか片方にしか届かない.

なぜか.CentOS7は標準設定では入力インターフェイスと出力インターフェイスが異なるトラフィックを破棄するように設定してあるから.上のような場合,デフォルトルートが設定してあり, ping の入力インターフェイスは ping の宛先により変化するが, ping の返信(ICMP echo reply) は必ずデフォルトルートのインターフェイスから発信され, ping の宛先に依存しない.よって,入力インターフェイスと出力インターフェイスが異なる非対称ルーティングとなる.

上のようなパケットを一時的に許可するには次のコマンドを実行する.

echo 2 > /proc/sys/net/ipv4/conf/default/rp_filter
echo 2 > /proc/sys/net/ipv4/conf/all/rp_filter

永続的に許可するには /etc/sysctl.conf に次を追加する.なお,上のリンクの記述と違い CentOS7 では net.ipv4.conf.default.rp_filter ではなく net.ipv4.conf.all.rp_filter と設定する必要がある模様.

net.ipv4.conf.all.rp_filter = 2

もしくはインターフェイス毎に列挙する.

net.ipv4.conf.eth0.rp_filter = 2
net.ipv4.conf.eth1.rp_filter = 2

ちなみに,なぜこのような設定になっているのかというと,通常は2つ以上インターフェイスがある場合は一つが WAN 用で,残りが LAN 用となっていることが多い.このような場合,このマシン宛にWANから来たトラフィックはWAN用インターフェイスから出力され,このマシン宛にLANから来たトラフィックはLAN用インターフェイスから出力される.そして,WANから来てLANインターフェイスから出力されるようなトラフィックは攻撃の可能性が高いので破棄するような設定になっているというわけだ.

また,次のようにポリシベースルーティングにより対称ルーティングを達成する方法もある.