rp_filter是防ip欺骗的核心机制,因其在内核网络栈最底层对接收包的源ip执行反向路由验证:若源ip无法通过同一接口(值为1)或任意接口(值为2)可达,则立即丢弃,阻止伪造包进入iptables等后续处理。

为什么rp_filter是防IP欺骗的核心机制
反向路径过滤(rp_filter)让内核在接收数据包时,自动检查该包的源IP地址是否能通过**同一接口**合理返回。如果系统查不到匹配的回程路由,就直接丢弃——这个判断发生在网络栈最底层,比iptables还早,伪造源地址的包根本进不了后续处理流程。
设置rp_filter=1或2并确保覆盖所有接口
值选1(严格模式)还是2(宽松模式)取决于你的网络结构:
- 值为1:要求“进哪出哪”,安全性高,适合单出口、路由对称的服务器
- 值为2:只要源IP能从任意接口发出即可,适合多网卡、策略路由或多ISP环境
必须同时配置全局和具体接口,避免防护缺口:
- 临时启用(重启失效):echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/rp_filter,再对每个外网接口执行类似命令,如echo 1 | sudo tee /proc/sys/net/ipv4/conf/eth0/rp_filter
- 永久生效:在/etc/sysctl.d/99-secure.conf中添加两行:
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1(把eth0换成你实际的对外网卡名) - 加载配置:sudo sysctl --system
验证是否真正生效
别只看配置文件,要确认内核当前值:
- 运行sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.eth0.rp_filter,两个都应返回1
- 也可直接读取:cat /proc/sys/net/ipv4/conf/all/rp_filter 和 cat /proc/sys/net/ipv4/conf/eth0/rp_filter
- 若业务出现异常连接失败,优先检查是否误用了严格模式(1)导致合法非对称流量被丢——此时可改设为2,并配合net.ipv4.conf.all.src_valid_mark = 1做更精细控制
必须配套关闭其他危险选项
单开rp_filter不够,攻击者可能绕过它:
- 禁用源路由:net.ipv4.conf.all.accept_source_route = 0
- 禁用ICMP重定向:net.ipv4.conf.all.accept_redirects = 0 和 net.ipv4.conf.all.send_redirects = 0
- 非路由器角色务必关闭IP转发:net.ipv4.ip_forward = 0
- 配置完后刷新路由缓存:sudo sysctl -w net.ipv4.route.flush=1











