在一个接口上禁用rp_filter


9

我有一台Ubuntu 16.04服务器,它充当具有多个(VLAN)接口的路由器。默认情况下,rp_filter所有接口都启用(反向路径过滤)。我想保持这种状态,但要为一个接口做一个例外。(应该允许来自此接口的数据包具有与该接口的任何路由目标地址都不对应的源IP地址。)

假设此接口的名称为ens20.4,其vlan-raw-device为ens20,并且命名了目标接口(用于测试数据包流)ens20.2(尽管它适用于任何目标接口)。

我尝试仅设置该rp_filter属性ens20.4,但没有成功:

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

因此,出于测试目的,我还禁用rp_filter了vlan-raw-device和测试目标界面:

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

但是,我仍然要为所有其他接口保留反向路径筛选-我缺少什么?


进一步的测试表明,如果将全部或入站接口的rp_filter设置为1,则反向路径过滤将处于活动状态。虽然仍在寻找确定的答案或文档参考,但到目前为止我还找不到。
Cybran

Answers:


12

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

请注意最后一句话可以解释您的尝试:

在{interface}上执行源验证时,将使用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:无源验证,只需仔细检查其他接口是否仍受保护。

您还可以使用值2来检查“松散”的rpf。如果数据包通常应由其他接口路由,那总比没有验证要好。


2
谢谢,这很好地解释了!特别感谢“宽松”的rpf建议,这确实是我设置的更好选择。同时也不必将all / rp_filter设置为0,这是非常受欢迎的。
Cybran's
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.