2007年7月31日火曜日

rp_filter って?

linux ネットワークセキュリティのことはじめ。みたいなページに /proc/sys/net/conf/eth#/rpfilter は 1 にしましょう。らしき事が書かれており、盲目的にそーゆーモン。と信じていたが LSRR 試し始めてふと気になった。

本来ならば net/ipv4/fib_frontend.c の fib_validate_source() をフムフムと読みたいところなのだが... Understanding Linux Network Internals の力を借りる始末。曰く入ってきたデバイスの経路を調べて、そのデバイスを経由した到達の可否を判断 --- Reverse Path Filter --- ということらしい。淋しい自身の経路を示すと
# ip route ls
172.27.202.0/24 via 172.27.129.1 dev eth0 proto zebra metric 20
172.27.200.0/24 via 172.27.129.1 dev eth0 proto zebra metric 20
172.27.140.0/24 dev tap0 proto kernel scope link src 172.27.140.1
172.27.102.0/24 via 172.27.129.1 dev eth0 proto zebra metric 20
172.27.129.0/24 dev eth0 proto kernel scope link src 172.27.129.2
172.27.130.0/24 dev vmnet1 proto kernel scope link src 172.27.130.1
172.27.100.0/24 via 172.27.129.1 dev eth0 proto zebra metric 20
172.27.131.0/24 via 172.27.130.254 dev vmnet1 proto zebra
172.27.1.0/24 via 172.27.129.1 dev eth0 proto zebra metric 20
default via 172.27.129.1 dev eth0
となっている場合において vmnet1 は 172.27.130.0/24 と 172.27.131.0/24 のみ。よって、これら以外のソースアドレスを持ったパケットが vmnet1 に入ってきた場合は落とすよ。というお話。

名前から推測するという情けなさだが、先の fib_validate_source() を一瞥すると rpfilter エントリは
  rpf = IN_DEV_RPFILTER(in_dev);
さらにinclude/linux/inetdevice.h を眺めて
#define IN_DEV_ANDCONF(in_dev, attr) \
(IPV4_DEVCONF_ALL(attr) && IN_DEV_CONF_GET((in_dev), attr))
....
#define IN_DEV_RPFILTER(in_dev) IN_DEV_ANDCONF((in_dev), RP_FILTER)
となっているので vmnet1 というデバイスの場合であれば /proc/sys/net/ipv4/conf/all/rpfilter と /proc/sys/net/ipv4/conf/vmnet1/rpfilter 両方が 1 となっている場合のみ有効...らしい。FIB 周りっていつになったら理解できるんだろう。

0 件のコメント: