iptables白名单生效的关键是默认策略设为drop,再精准放行本地回环、已建立连接、管理ip及必要服务端口,并限制连接速率、保存规则持久化。

要让 iptables 白名单真正起作用,关键不是“加几条允许”,而是建立一套默认拒绝、精准放行、顺序可控、不锁自己的访问控制秩序。生产环境中,核心服务(如数据库、配置中心、管理后台)一旦暴露在非可信网络,风险极高——白名单不是可选项,而是安全基线。
一、必须先堵死,默认策略设为 DROP
白名单生效的前提是 INPUT 链默认动作为 DROP:
- 执行
iptables -P INPUT DROP(同时建议-P FORWARD DROP) - 切勿依赖“最后加一条 DROP”——规则顺序不可靠,且易被遗漏
- 确认当前策略:
iptables -L INPUT -n --line-numbers查看 POLICY 行
二、放行基础通行能力,避免自锁
在设置白名单前,必须保障自身管理通道和基础通信不中断:
- 放行本地回环:
iptables -A INPUT -i lo -j ACCEPT - 放行已建立连接(保障响应返回):
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT(新版推荐用conntrack替代已弃用的state) - 若通过 SSH 管理,务必在执行 DROP 前,用
-I INPUT 1插入一条高优先级允许规则,例如:iptables -I INPUT 1 -s 192.168.10.50 -p tcp --dport 2222 -j ACCEPT - 建议提前开启一个带超时的备用会话:
timeout 600 ssh user@host
三、按服务粒度精准放行,禁止宽泛授权
每条白名单规则必须明确限定:来源 IP(或网段)、目标端口、协议。不写源地址 = 全网开放;不写端口 = 所有端口开放。
- 只允许运维网段访问 SSH(非 22 端口更佳):
iptables -A INPUT -s 10.20.30.0/24 -p tcp --dport 2222 -j ACCEPT - 只允许应用服务器访问 MySQL:
iptables -A INPUT -s 10.1.5.100 -p tcp --dport 3306 -j ACCEPT - 只允许监控节点访问 Prometheus:
iptables -A INPUT -s 172.16.0.20 -p tcp --dport 9090 -j ACCEPT - 容器服务(如 Apollo)暴露端口也需同样管控:
iptables -A INPUT -s 172.16.200.200 -p tcp --dport 10002 -j ACCEPT
四、增强防护与持久化落地
仅放行不够,还需降低攻击面并确保重启不失效:
- 限制新建连接速率(防扫描):
iptables -A INPUT -p tcp --syn -m limit --limit 1/sec --limit-burst 3 -j ACCEPT - 可选:记录高频尝试(慎用,避免日志刷爆):
iptables -A INPUT -p tcp --dport 2222 --syn -m limit --limit 3/min -j LOG --log-prefix "SSH-NEW:" - 保存规则(CentOS/RHEL):
iptables-save > /etc/sysconfig/iptables
(Ubuntu/Debian):iptables-save > /etc/iptables/rules.v4 - 配置开机加载:systemd 用户启用
iptables.service或在/etc/network/if-up.d/中加入恢复脚本











