13.1. 反向路径过滤

默认情况下,路由器会路由所有数据,即使是那些“明显”不属于您网络的数据包。一个常见的例子是私有 IP 地址空间逃逸到互联网上。如果您有一个接口的路由为 195.96.96.0/24,您不希望来自 212.64.94.1 的数据包到达那里。

很多人可能想要关闭此功能,因此内核黑客使其变得容易。在 /proc 中有一些文件,您可以在其中告诉内核为您执行此操作。此方法称为“反向路径过滤”。基本上,如果对此数据包的回复不会从接收此数据包的接口发出,那么这是一个伪造的数据包,应该被忽略。

以下片段将为所有当前和未来的接口启用此功能。

# for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do
>  echo 2 > $i 
> done

以上面的例子为例,如果一个数据包到达 Linux 路由器的 eth1 接口,声称来自 Office+ISP 子网,它将被丢弃。同样,如果一个数据包来自 Office 子网,声称来自防火墙外部的某个地方,它也会被丢弃。

以上是完整的反向路径过滤。默认设置是仅基于直接连接网络上的 IP 地址进行过滤。这是因为完整的过滤在非对称路由的情况下会失效(数据包以一种方式进入,以另一种方式发出,例如卫星流量,或者如果您的网络中有动态路由(bgp,ospf,rip))。数据通过卫星天线下来,回复通过普通陆线返回。

如果此例外情况适用于您(您可能知道是否适用),您可以简单地关闭接收卫星数据的接口上的 rp_filter。如果您想查看是否有任何数据包被丢弃,同一目录中的 log_martians 文件将告诉内核将它们记录到您的 syslog 中。

# echo 1 >/proc/sys/net/ipv4/conf/<interfacename>/log_martians

FIXME: 设置 conf/{default,all}/* 文件是否足够? - martijn