linux防火墙白名单本质是默认拒绝再放行指定ip,需按顺序配置回环、已有连接、目标ip端口规则并兜底拒绝,否则因规则匹配顺序或缺失关键项导致失效。

Linux上配置防火墙白名单,本质是拒绝所有流量、再放行指定IP——iptables 和 nftables 都能做,但默认策略和规则顺序稍有不同,直接照搬网上“加一条允许规则”往往无效。
为什么只加 -A INPUT -s 192.168.1.100 -j ACCEPT 不起作用?
因为规则是顺序匹配的,一旦前面有 -j DROP 或默认策略为 DROP,后续的 ACCEPT 就根本没机会执行。常见错误是:没检查默认策略、没把白名单规则放在拒绝规则之前、忽略了 established/related 连接导致 SSH 断连。
实操建议:
- 先查当前默认策略:
iptables -L INPUT -n --line-numbers,看最后一行是否是policy DROP - 如果策略是
ACCEPT,必须显式加-A INPUT -j DROP在白名单规则之后——但顺序不能错 - 务必在白名单规则前插入状态允许规则:
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT(iptables)或ct state established,related accept(nftables),否则 SSH 会立即断开 - 本地回环(
127.0.0.1)和 IPv6(::1)也建议放行,避免服务异常
iptables 白名单完整命令示例(SSH + 单 IP)
以下命令按执行顺序逐条运行,顺序不可颠倒:
iptables -P INPUT DROP iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -s 203.0.113.45 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -s 203.0.113.45 -p tcp --dport 80 -j ACCEPT
注意点:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
-P INPUT DROP是全局默认策略,不是某条规则;它生效后,所有未显式ACCEPT的包都会被丢弃 -
-i lo必须加,否则本机 curl、systemd 通信可能失败 - 如果服务监听的是
0.0.0.0:80,但你只放行了特定 IP 的80端口,其他 IP 访问会静默拒绝(无REJECT提示) - 规则不持久——重启后丢失,需保存:
iptables-save > /etc/iptables/rules.v4(Debian/Ubuntu)或service iptables save(CentOS 6)
nftables 替代方案更简洁,但语法不兼容
新版系统(如 CentOS 8+/RHEL 8+、Debian 11+)默认用 nftables,它用表+链+规则组织,没有“默认策略”概念,而是靠最后一条 drop 规则兜底。
一个最小白名单配置(/etc/nftables.conf):
table inet filter {
chain input {
type filter hook input priority 0;
iifname "lo" accept
ct state established,related accept
ip saddr 203.0.113.45 tcp dport { 22, 80 } accept
drop
}
}
关键差异:
-
ip saddr指定源 IP,支持 CIDR(如192.168.1.0/24)和列表(用逗号分隔) -
drop是显式规则,不是链策略,位置必须在最后 - 修改后需重载:
nft -f /etc/nftables.conf,不会自动持久化,要确保nftables服务启用 - 不要混用
iptables和nftables,二者底层共用 netfilter,冲突会导致规则失效
白名单真正生效的前提,不是“加了一条允许”,而是整套规则链的逻辑闭环:允许回环、允许已有连接、允许目标 IP+端口、最后兜底拒绝。漏掉任一环节,轻则服务不可达,重则自己锁死在服务器外。










