在一个接口上禁用 rp_filter

Cyb*_*ran 13 linux routing kernel filtering ubuntu-16.04

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

假设这个接口有 name ens20.4,它的 vlan-raw-device 是ens20,并且目标接口(用于测试数据包流)被命名ens20.2(尽管它应该适用于任何目标接口)。

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

echo 0 > /proc/sys/net/ipv4/conf/ens20.4/rp_filter
Run Code Online (Sandbox Code Playgroud)

因此,出于测试目的,我还禁用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
Run Code Online (Sandbox Code Playgroud)

仍然没有成功,带有“欺骗”源 IP 地址的数据包仍然被丢弃。只有当我关闭rp_filter所有的接口,数据包打通:

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
Run Code Online (Sandbox Code Playgroud)

但是,我仍然希望为所有其他接口保留反向路径过滤 - 我错过了什么?

A.B*_*A.B 16

那里的信息: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
Run Code Online (Sandbox Code Playgroud)

现在 max(conf/{all,ens20.4}/rp_filter == 0 :没有源验证。只需仔细检查其他接口是否仍然受到保护。

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

  • 谢谢,解释的很好!特别感谢“宽松”的 rpf 建议,这确实是我设置的更好选择。也不需要将 all/rp_filter 设置为 0,这是最受欢迎的。 (3认同)