linux防ip欺骗关键在于启用内核rp_filter=1反向路径过滤、禁用accept_source_route和icmp重定向,并辅以iptables封禁私有及非法地址段;必须全局与接口级同步配置,确保防护无缺口。

Linux 防火墙防止 IP 地址欺骗,不能只靠 iptables 规则“堵”,关键得让内核在数据包刚进来时就识别并丢弃伪造源地址——这才是真正高效、底层的防护。
启用反向路径过滤(rp_filter)
这是防 IP 欺骗最核心的机制。它检查:从 eth0 收到的包,其源 IP 是否能通过 eth0 路由回去?如果不行,大概率是伪造的。
- 推荐设为
1(宽松模式):只要路由表里有任意一条路径能到达该源 IP,就接受;适合绝大多数服务器环境 - 必须同时设置全局和具体接口:
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter echo 1 > /proc/sys/net/ipv4/conf/eth0/rp_filter # 替换 eth0 为你的外网接口名
- 永久生效:在
/etc/sysctl.conf中添加net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.eth0.rp_filter = 1
然后运行
sysctl -p
禁用源路由与 ICMP 重定向
这两项常被攻击者用于绕过防火墙或篡改路由,非路由器角色的服务器必须关闭:
- 关闭 IPv4 源路由:
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route echo 0 > /proc/sys/net/ipv4/conf/eth0/accept_source_route
- 关闭 IPv4 和 IPv6 的 ICMP 重定向收发:
在/etc/sysctl.conf中加入net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv6.conf.default.accept_redirects = 0
执行
sysctl -p并用sysctl -a | grep redirect确认全部为0
iptables 补充封禁非法源地址段
内核参数管路径校验,iptables 管地址段过滤,两者配合才完整。规则只加在外网入口(如 eth0 的 INPUT 链),切勿应用在 lo 或内网接口:
- 封禁私有地址(RFC1918):
iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
- 封禁明显不可路由地址:
iptables -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP iptables -A INPUT -i eth0 -s 169.254.0.0/16 -j DROP iptables -A INPUT -i eth0 -s 224.0.0.0/4 -j DROP iptables -A INPUT -i eth0 -s 0.0.0.0/8 -j DROP iptables -A INPUT -i eth0 -s 240.0.0.0/4 -j DROP
- 注意:多播地址(224.0.0.0/4)若用于 UDP 是正常的,但其他协议来源一律拒绝,无需额外判断协议
验证与持续确认
- 检查 rp_filter 是否生效:
sysctl net.ipv4.conf.all.rp_filter和sysctl net.ipv4.conf.eth0.rp_filter应都返回1 - 查看当前 iptables 规则:
iptables -L INPUT -v --line-numbers - 保存规则(避免重启失效):
iptables-save > /etc/iptables/rules.v4(Debian/Ubuntu)或service iptables save(RHEL/CentOS)
不复杂但容易忽略











