iptables规则未生效:直接访问服务器IP仍可绕过Cloudflare限制
看起来你遇到的问题和iptables规则的顺序、已有规则的优先级脱不了干系,咱们一步步拆解分析:
核心问题:规则匹配顺序搞反了(或被现有规则干扰)
iptables是从上到下按顺序匹配规则的,一旦流量匹配到某条规则就会执行对应的动作,不会继续往下走。你用-A参数是把规则追加到链的末尾,如果你的INPUT链在添加这些规则之前,已经存在允许本地访问、已建立连接的ACCEPT规则,那直接访问的流量可能早就被这些规则放行,根本轮不到你最后加的DROP规则生效。
从你贴的iptables -L -v -n输出来看,INPUT链默认策略是DROP,但只显示了两条Cloudflare IP的ACCEPT规则,却没看到你添加的DROP规则——要么是你没贴全输出,要么是这条规则被其他规则覆盖了,或者你在添加后没保存规则导致重启后丢失了。
解决步骤,手把手来:
先检查完整的规则列表(带编号)
运行这条命令,能看到每条规则的顺序和编号,方便排查:sudo iptables -L INPUT -v -n --line-numbers看看你添加的DROP规则是否存在,以及它的位置是不是在所有ACCEPT规则之后(如果前面有允许非Cloudflare IP访问443的规则,那DROP根本不会生效)。
备份现有规则,避免误操作
先把当前规则备份到临时文件,出问题了可以恢复:sudo iptables-save > /tmp/iptables-backup清理无效/冲突的规则
如果发现有允许所有IP访问443的ACCEPT规则,用编号删除它:sudo iptables -D INPUT <规则编号>比如规则编号是3,就执行
sudo iptables -D INPUT 3。按正确顺序重新添加规则
规则顺序很关键,一定要按这个顺序来:- 首先允许服务器的回环接口(本地程序访问本地服务需要):
sudo iptables -A INPUT -i lo -j ACCEPT - 允许已建立/相关的连接(服务器给客户端的响应流量需要放行):
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT - 添加所有Cloudflare的IPv4 IP段的ACCEPT规则(把你需要的Cloudflare IP都加上):
sudo iptables -A INPUT -p tcp --dport 443 -s 131.0.72.0/22 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -s 172.64.0.0/13 -j ACCEPT # 继续添加其他Cloudflare IPv4段... - 最后拒绝所有其他访问443端口的流量:
sudo iptables -A INPUT -p tcp --dport 443 -j DROP
- 首先允许服务器的回环接口(本地程序访问本地服务需要):
对IPv6做同样的配置
重复上面的步骤,把iptables换成ip6tables,确保IPv6的流量也被正确限制。测试验证
用非Cloudflare的IP直接访问服务器的443端口(比如用手机流量,不要走Cloudflare代理),应该无法打开网站;而通过Cloudflare代理的访问应该正常。
额外提醒:
如果你服务器上装了firewalld或者ufw这类防火墙管理工具,它们会自动生成自己的iptables规则,可能会干扰你手动添加的规则。最好是要么关闭这些工具,要么用它们来管理规则,不要混着用。
备注:内容来源于stack exchange,提问作者Charles Ziegenbein

