1543 字
8 分钟
内核参数:rp_filter

好的,我们来详细解释一下 Linux 中的 rp_filter

什么是 rp_filter?#

rp_filter是 ​​Reverse Path Filtering(反向路径过滤)​​ 的缩写。它是 Linux 内核提供的一种安全机制,主要用于验证网络数据包的 ​​ 来源(源 IP 地址)是否可信 ​​。

其核心原理是:​​ 检查接收到的数据包,其源 IP 地址是否可以通过接收到这个数据包的网络接口(网卡)路由出去 ​​。如果检查失败,内核会认为这个包可能是“伪造”的(即 IP 地址欺骗),并选择丢弃它。

rp_filter 的作用是什么?#

它的主要作用是 ​​ 防止 IP 地址欺骗(IP Spoofing)​​,从而提高网络安全性。

  • ​IP 欺骗攻击 ​​:攻击者发送源 IP 地址被伪造成信任主机的数据包,以期绕过安全检查或发动 DDoS 攻击(如 Smurf 攻击)。
  • ​rp_filter 的防御 ​​:假设你的服务器有两张网卡:
    • eth0: 连接到公网,IP 是 1.2.3.4
    • eth1: 连接到私有内网,IP 是 192.168.1.10 如果一个数据包从 eth1(内网口)进来,但声称它的源 IP 地址是 8.8.8.8(一个公网 IP),那么 rp_filter就会工作。系统会查路由表:“发送到 8.8.8.8应该走哪个接口?” 答案肯定是 eth0(公网口),而不是接收到这个包的 eth1。检查不通过,这个包就会被丢弃。这样就有效防止了来自内网的公网 IP 欺骗。

rp_filter 的工作模式#

该机制有三个可配置的模式,通过设置 0, 1, 2这三个值来切换。你可以在 /proc/sys/net/ipv4/conf/目录下针对 ​​ 所有接口 ​​、​​ 特定接口 ​​ 或 ​​ 默认设置 ​​ 进行配置。

# 全局默认设置(所有未单独设置的接口会继承这个值)
/proc/sys/net/ipv4/conf/default/rp_filter
# 针对所有接口的设置
/proc/sys/net/ipv4/conf/all/rp_filter
# 针对特定接口的设置,例如 eth0
/proc/sys/net/ipv4/conf/eth0/rp_filter

​ 模式值含义:​

  1. ​0 - 关闭 (Off)​

    • 不进行任何源地址验证。​​ 最不安全,但性能最好 ​​。通常用于信任所有流量的内部网络或特殊场景(如非对称路由)。
  2. ​1 - 严格模式 (Strict Mode)​

    • ​ 默认值 ​​(在许多发行版中,如 CentOS、Rocky Linux)。
    • 严格执行反向路径验证。系统会检查 ​​ 接收到的数据包,其源地址是否可以通过接收到它的同一个网卡路由出去 ​​。如果不是,则丢弃包。
    • 这是最安全的方式。
  3. ​2 - 松散模式 (Loose Mode)​

    • 执行松散的反向路径验证。系统只检查 ​​ 接收到的数据包,其源地址是否可以通过系统中的任意一个网卡路由出去 ​​(而不仅仅是接收它的那个网卡)。如果可以,就允许通过。
    • 这种模式在 ​​ 非对称路由(Asymmetric Routing)​​ 环境中非常有用。

关键场景:非对称路由 (Asymmetric Routing)#

​ 非对称路由 ​​ 是指数据包的 ​​ 来回路径不一致 ​​。这在复杂的网络架构(如多线 BGP、负载均衡集群)中很常见。

​ 例子:​

假设你有一台服务器,也有两个网卡:

  • eth0: 联通线路
  • eth1: 电信线路

一个请求数据包从 eth0(联通)进入你的服务器。但你的服务器处理完后,根据路由策略,响应数据包可能选择了更优的路径,从 eth1(电信)发送回去。

​ 这时问题来了:​

如果 rp_filter设置为严格模式 (1):

  1. 一个请求包从 eth0进来,源 IP 是 X.X.X.X
  2. 系统会查路由表:“去往 X.X.X.X应该走哪个接口?” 假设查表结果是 eth1(电信线路更优)。
  3. 系统发现:这个包从 eth0进来,但根据路由表,去往源地址的出口是 eth1。​​ 接口不一致,检查失败!​
  4. 请求包被丢弃,连接无法建立。

​ 解决方案:​

在这种非对称路由的环境中,你需要将相关接口的 rp_filter设置为 ​​ 松散模式 (2)​​ 或者直接 ​​ 关闭 (0)​​。

  • ​ 松散模式 (2)​​:系统检查“去往源 IP X.X.X.X的路由是否存在?”(无论出口是哪个网卡)。只要系统知道怎么去往 X.X.X.X,就允许包通过。这解决了非对称路由问题,同时保留了一定的安全性(完全伪造的、系统不知道如何路由的 IP 包还是会被丢弃)。
  • ​ 关闭 (0)​​:完全不检查。最不安全,但能解决所有路由问题。

如何检查和配置?#

​ 查看当前配置:​

# 查看所有接口的配置
sysctl -a | grep \\.rp_filter
# 查看特定接口(如eth0)的配置
cat /proc/sys/net/ipv4/conf/eth0/rp_filter

​ 临时修改(重启后失效):​

# 将eth0的rp_filter设置为松散模式(2)
echo 2 > /proc/sys/net/ipv4/conf/eth0/rp_filter
# 使用sysctl命令修改
sysctl -w net.ipv4.conf.eth0.rp_filter=2

​ 永久修改(通过 sysctl 配置文件):​

编辑 /etc/sysctl.conf文件,添加以下行:

# 为特定接口设置
net.ipv4.conf.eth0.rp_filter = 2
# 或者为所有接口设置默认值(谨慎操作)
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2

保存后,执行 sysctl -p使配置生效。

总结#

特性说明
​ 名称 ​Reverse Path Filtering (反向路径过滤)
​ 作用 ​​ 安全机制 ​​,通过验证数据包源 IP 的可达性来 ​​ 防止 IP 地址欺骗攻击 ​​。
​ 模式 ​​0​​ (关闭):不检查,不安全,性能好。
​1​​ (严格模式):默认,严格检查,最安全,但会导致非对称路由问题。
​2​​ (松散模式):折中方案,只检查源 IP 是否可达,用于非对称路由环境。
​ 应用场景 ​​ 严格模式(1)​​:普通服务器、边界网关,注重安全。
​ 松散模式(2)或关闭(0)​​:网络架构复杂,存在非对称路由的节点(如核心路由器、负载均衡器)。

简单来说,rp_filter是一个在 ​​ 安全 ​​ 和 ​​ 网络兼容性 ​​ 之间做权衡的配置。在遇到网络不通的问题时,如果怀疑是源地址验证导致,检查并调整 rp_filter是一个重要的排错步骤。