iptables不维护动态状态,动态调整依赖外部脚本定期检查并调用命令变更规则;域名需预解析+定时刷新,高频防护用recent模块,批量ip用ipset,脚本须轻量、可靠、可追溯且带注释与安全回滚。

iptables 本身不维护动态状态,所谓“动态调整”实际是靠外部脚本触发规则变更——不是 iptables 自动感知变化,而是脚本定期检查条件(如域名解析结果、连接频次、IP 黑名单更新),再调用 iptables 命令增删改规则。关键在于让脚本轻量、可靠、可追溯。
域名类规则:预解析 + 定时刷新
iptables 的 nat 表不支持运行时查 DNS,写 -d www.example.com 会失败或仅在加载时解析一次。必须由脚本完成:
- 用
dig +short www.example.com A | head -n1提取 IPv4 地址,过滤掉 CNAME、空行和 AAAA 记录 - 比对当前规则中的目标 IP,仅当 IP 变更时才执行
iptables -t nat -D PREROUTING ...删除旧规则,再-A添加新规则 - 所有规则加
--comment "dnat-www.example.com",方便脚本精准识别和清理,避免误删其他规则
高频行为防护:用 recent 模块替代轮询脚本
防 SSH 暴力破解或端口扫描,不必每秒跑脚本查日志。recent 模块直接在内核内存中记账,效率高、无延迟:
- 先确保
xt_recent已加载:modprobe xt_recent,并确认/proc/net/xt_recent/存在 - 三条规则顺序不能错:先查封禁期(
--rcheck --seconds 300 --hitcount 1),再判阈值(--set后立刻--rcheck --seconds 60 --hitcount 5),最后放行合法连接(--set -j ACCEPT) - 验证是否生效:直接读
cat /proc/net/xt_recent/ssh_attack,看到源 IP 和剩余 ttl 即表示已跟踪
批量 IP 管理:用 ipset 替代长列表
若需封禁数百个恶意 IP,逐条写 -s x.x.x.x -j DROP 会让规则链变慢且难维护。ipset 把 IP 集合存在哈希表里,匹配效率接近 O(1):
- 创建集合:
ipset create blacklist hash:ip - 添加 IP:
ipset add blacklist 192.168.1.100 - 在 iptables 中引用:
iptables -A INPUT -m set --match-set blacklist src -j DROP - 脚本可定期从威胁情报源下载 IP 列表,用
ipset flush blacklist && while read ip; do ipset add blacklist $ip; done 批量更新
规则持久化与安全回滚
脚本修改规则后必须保存,否则重启失效;同时要防误操作导致断连:
- 保存前先备份:
iptables-save > /etc/iptables.rules.$(date +%s) - 生产环境建议用
iptables-restore全量加载,避免单条命令出错导致策略残缺 - 关键脚本开头加保护:检查是否已有同类规则在运行(如
pgrep -f "update-domain-dnat.sh" | wc -l> 1 就退出),防止并发冲突 - 所有规则带注释,例如
--comment "auto-updated-by-ssh-guard-20260615",便于后续审计和定位











