Linux防火墙白名单必须先设默认拒绝再按序插入允许规则,iptables需用-I INPUT确保ACCEPT在DROP前,firewalld须用permanent rich rule并reload,ufw要先设default deny incoming,且均需检查云安全组。

直接设白名单不生效,八成是规则顺序或默认策略没调对。Linux防火墙白名单不是“加一条允许就行”,而是“先拒所有、再放指定”,顺序错一丁点就全失效。
iptables 白名单规则必须按顺序插入
规则匹配是自上而下,一旦遇到 -j DROP 或默认策略为 DROP,后续的 ACCEPT 就永远不会执行。
- 先查当前 INPUT 链顺序和默认策略:
iptables -nL INPUT --line-numbers,重点看最后一行是不是policy DROP - 如果默认策略是
ACCEPT,得手动在末尾加拒绝兜底:iptables -A INPUT -j DROP,但这条必须在所有ACCEPT规则之后 - 真正放行某 IP + 端口,要用
-I INPUT 1插入最前面(比如只许203.0.113.45连 SSH):iptables -I INPUT 1 -s 203.0.113.45 -p tcp --dport 22 -j ACCEPT - 别漏掉状态跟踪规则,否则 SSH 会立刻断开:
iptables -I INPUT 2 -m state --state ESTABLISHED,RELATED -j ACCEPT - 本地回环也得显式放行:
iptables -I INPUT 3 -i lo -j ACCEPT
firewalld 的 rich rule 才是真白名单
--add-source 只是把 IP 划进 zone,不是限制端口;要精确到「IP + 端口」,必须用 rich rule,否则可能意外放开所有服务。
- 只允
192.168.1.100访问8080TCP:firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="8080" protocol="tcp" accept' - 如果之前用
--add-port=8080/tcp全局开放过,得先删掉:firewall-cmd --permanent --remove-port=8080/tcp,否则 rich rule 被绕过 - 执行后必须重载:
firewall-cmd --reload,否则不生效 - 验证是否写进去了:
firewall-cmd --list-rich-rules,输出里要有accept,不能是reject或空
ufw 在 Debian/Ubuntu 上最省事但容易踩坑
ufw 默认策略宽松,default deny incoming 必须显式设,否则白名单形同虚设。
- 先设默认拒绝:
ufw default deny incoming(别跳过这步) - 再加单 IP 白名单(如只放
123.123.123.123的 SSH):ufw allow from 123.123.123.123/32 to any port 22 proto tcp -
/32不能省,否则可能误匹配网段 - 启用前确认当前 SSH 连接 IP 不在被拒范围内,否则连自己都断掉
- 启用:
ufw enable,然后ufw status verbose查规则是否加载成功
重启后规则丢失?保存动作因工具而异
所有临时添加的规则都不持久,系统重启后清空——这点最容易被忽略,尤其在生产环境。
- iptables:Debian/Ubuntu 用
iptables-save > /etc/iptables/rules.v4;CentOS 6 用service iptables save;CentOS 7+ 默认用 nftables,iptables 命令只是兼容层,保存无效 - firewalld:只要用了
--permanent参数,firewall-cmd --reload后就自动持久化,不用额外保存 - ufw:规则本身是持久的,
ufw enable即生效且开机自启,无需手动保存 - 云服务器(阿里云、腾讯云等):安全组是独立于系统防火墙的外层控制,即使本地规则全对,安全组没开对应 IP+端口,照样连不上


















