rp_filter 的功能可以简单概括为 源进源出
net.ipv4.conf.all.rp_filter
是 Linux 内核中的一个网络功能,它用于控制逆路径过滤(Reverse Path Filtering),该功能旨在防止 IP 假冒和网络攻击。
作用
- rp_filter = 0 表示禁用逆路径过滤,这意味着系统将不会检查传入数据包的源地址是否从其路由的正确接口到达。
- rp_filter = 1 表示启用严格模式的逆路径过滤,系统将仅对来自合法接口的流量进行响应。如果数据包的源地址与出接口不一致,则会被丢弃。
- rp_filter = 2 表示启用松散模式的逆路径过滤,数据包的源地址可以通过任意接口到达,系统仅会检查路由表以确保源地址是有效的。如果数据包的源地址可通过其他接口路由,请求将被允许。
安全和性能影响
安全影响
- 如果设为 0(禁用) :
- 增加了 IP 假冒的风险,攻击者可以通过伪造的源地址发送恶意流量,渗透网络安全防护机制。
- 更容易受到中间人攻击等网络攻击的威胁。
- 如果设为 1(启用严格模式) :
- 提高了安全性,通过确保数据包的源地址与路由一致,可以有效防止伪造和路由相关的攻击。
- 如果设为 2(启用松散模式) :
- 提供了平衡,既能防止伪造攻击,又允许某些合法的场景(如 VPN 和负载均衡器)通过多条路径传递流量。
性能影响
- 启用逆路径过滤会增加一些系统开销,因为需要对每个接收的数据包进行额外的源地址检查。
- 在高流量或高负载的网络环境中,这种检查可能会导致一些性能下降,特别是在低配置的设备上。
- 对于小型或低流量的环境,影响通常不明显。
如何修改
要修改 net.ipv4.conf.all.rp_filter
的值,可以使用以下命令:
-
临时修改(重启后失效):
bashsudo sysctl -w net.ipv4.conf.all.rp_filter=1 # 启用严格模式 sudo sysctl -w net.ipv4.conf.all.rp_filter=0 # 禁用 sudo sysctl -w net.ipv4.conf.all.rp_filter=2 # 启用松散模式
-
永久修改 (在系统重启后依然有效): 编辑
/etc/sysctl.conf
文件,添加或修改以下行:confnet.ipv4.conf.all.rp_filter = 1 # 启用严格模式 net.ipv4.conf.all.rp_filter = 0 # 禁用 net.ipv4.conf.all.rp_filter = 2 # 启用松散模式
然后运行以下命令使更改生效:
bashsudo sysctl -p
总结
在大多数情况下,建议将 rp_filter
设置为 1 或 2,尤其是当网络环境较复杂时,以提高安全性。若在特定场景下对于性能有严格要求并且充分了解网络环境的情况下,可以考虑将其设置为 0,但需谨慎评估可能带来的安全风险。
环境测试
bash
▶ sysctl -a | grep rp_filter | grep -v arp_filter
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.bond0.rp_filter = 0
net.ipv4.conf.bond0/12.rp_filter = 0
net.ipv4.conf.bond0/34.rp_filter = 0
net.ipv4.conf.bond0/56.rp_filter = 0
net.ipv4.conf.br-28205e3147e3.rp_filter = 0
net.ipv4.conf.br-800d2a03a456.rp_filter = 0
net.ipv4.conf.br-dc00623f6fbe.rp_filter = 0
net.ipv4.conf.br0.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.docker0.rp_filter = 0
net.ipv4.conf.enp44s0.rp_filter = 0
net.ipv4.conf.enp45s0.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.tap0.rp_filter = 0
net.ipv4.conf.utun.rp_filter = 0
net.ipv4.conf.veth21e5fe3.rp_filter = 0
net.ipv4.conf.veth304353d.rp_filter = 0
net.ipv4.conf.veth4908770.rp_filter = 0
net.ipv4.conf.veth60d6c7f.rp_filter = 0
net.ipv4.conf.veth659f826.rp_filter = 0
net.ipv4.conf.veth784e37e.rp_filter = 0
net.ipv4.conf.veth7fcd4e9.rp_filter = 0
net.ipv4.conf.vethd5fb89c.rp_filter = 0
net.ipv4.conf.vethdade94f.rp_filter = 0
net.ipv4.conf.vethf4946f6.rp_filter = 0
net.ipv4.conf.wlo1.rp_filter = 0
如果一开始 net.ipv4.conf.all.rp_filter 为 0,那么操作系统启动后,所有网卡接口都为0,但是如果后来想启用源进源出的限制,那么就必须要把 net.ipv4.conf.all.rp_filter 设置为 1,同时把其他接口都手动改掉(当然重启一次操作系统也行)。
否则就会出现全局不一致的情况。
在Linux内核中,rp_filter
(反向路径过滤)是一种用于增强网络安全性的功能,它可以防止IP欺骗攻击。rp_filter
的配置可以在全局级别和接口级别进行。
-
全局配置:
net.ipv4.conf.all.rp_filter = 0
:这表示对所有网络接口关闭反向路径过滤,即全局级别的反向路径过滤禁用。
-
接口特定配置:
net.ipv4.conf.enp45s0.rp_filter = 1
:这表示对特定接口enp45s0
启用反向路径过滤。
整体效果:
- 虽然全局配置已禁用反向路径过滤,但由于接口
enp45s0
的配置启用了此功能,因此该接口仍然会进行反向路径过滤。 - 换句话说,针对
enp45s0
接口的反向路径过滤规则将生效,而其他接口将遵循全局设置,即不进行反向路径过滤。
总结:
enp45s0
接口会进行反向路径过滤,帮助防止IP欺骗,而其他接口则不会执行此过滤。这种配置可以灵活应对不同接口的安全需求。