在一个接口上禁用 rp_filter

在一个接口上禁用 rp_filter

我有一台 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_filtervlan-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

但是,我仍然想保留所有其他接口的反向路径过滤 - 我缺少什么?

答案1

那里的信息: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。如果数据包通常应该由其他接口路由,那么这比没有验证要好。

相关内容