本来ならば net/ipv4/fib_frontend.c の fib_validate_source() をフムフムと読みたいところなのだが... Understanding Linux Network Internals の力を借りる始末。曰く入ってきたデバイスの経路を調べて、そのデバイスを経由した到達の可否を判断 --- Reverse Path Filter --- ということらしい。淋しい自身の経路を示すと
となっている場合において vmnet1 は 172.27.130.0/24 と 172.27.131.0/24 のみ。よって、これら以外のソースアドレスを持ったパケットが vmnet1 に入ってきた場合は落とすよ。というお話。# 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
名前から推測するという情けなさだが、先の fib_validate_source() を一瞥すると rpfilter エントリは
さらにinclude/linux/inetdevice.h を眺めてrpf = IN_DEV_RPFILTER(in_dev);
となっているので vmnet1 というデバイスの場合であれば /proc/sys/net/ipv4/conf/all/rpfilter と /proc/sys/net/ipv4/conf/vmnet1/rpfilter 両方が 1 となっている場合のみ有効...らしい。FIB 周りっていつになったら理解できるんだろう。#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)