在一个接口上禁用rp_filter

我有一个Ubuntu 16.04服务器,充当具有多个(VLAN)接口的路由器。 缺省情况下,所有接口都使能了rp_filter (反向path过滤)。 我想保持这种方式,但只是一个接口的例外。 (来自这个接口的数据包应该被允许有一个源IP地址,这个IP地址不对应这个接口的任何路由目的地址。)

假设这个接口的名字是ens20.4 ,它的vlan-raw-device是ens20 ,目的接口(用于testing数据包stream)被命名为ens20.2 (尽pipe它适用于任何目标接口)。

我试图只为ens20.4设置rp_filter属性,但没有成功:

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

所以,出于testing目的,我还禁用了vlan-raw-device和testing目标接口的rp_filter

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

仍然没有成功,具有“欺骗”源IP地址的数据包仍然被丢弃。 只有当我禁用所有接口的rp_filter ,数据包才能通过:

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

但是,我仍然想保留所有其他接口的反向path过滤 – 我错过了什么?

那里的信息: https : //git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/tree/Documentation/networking/ip-sysctl.txt?h=v4.9#n1090

注意最后一句解释你的尝试:

在{interface}上进行源validation时,使用来自conf / {all,interface} / rp_filter的最大值。

所以这应该工作:

 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:没有源validation,只需再次检查其他接口是否仍然受到保护。

你也可以用值2来检查“松散”的rpf。如果数据包通常应该由另一个接口路由,那将比没有validation好。