核心思路是让每个数据包尽可能早地匹配到规则:将高频规则(如ESTABLISHED/RELATED、HTTPS)置顶,用ipset/multiport合并同类项,善用连接状态跳过重复判断,拒绝规则兜底,定期清理零计数“僵尸”规则。

核心思路是让每个数据包尽可能早地匹配到规则,避免遍历大量无效条目。关键不在“删多少”,而在“怎么排、怎么合、怎么跳”。
把高频规则放在链最前面
iptables 和 nftables 都是顺序匹配,命中即停。一条 SSH 白名单规则如果排在第 50 条,前 49 条全要检查;移到第 2 条,99% 的管理流量瞬间结束匹配。
- 用 iptables -I INPUT 1 -s 192.168.10.0/24 -p tcp --dport 2222 -j ACCEPT 精确插入顶部
- 定期运行 iptables -L INPUT -n --line-numbers --verbose,看每条规则的 packet 计数,零计数或长期不变的规则就是“僵尸”,该删
- 拒绝类规则(如 DROP all)必须放在链末尾,作为兜底,不能提前中断合法流程
合并同类项,减少规则行数
每多一条规则,就多一次内核匹配开销。合并不是为了看着简洁,而是直接降低线性扫描成本。
- 用 -m multiport --dports 80,443,8080 代替三条单独的 --dport 规则
- 用 CIDR 合并 IP 段:-s 10.0.1.0/24 比写 256 个 -s 10.0.1.x 快得多
- 避免对同一源+端口+协议反复写 ALLOW/DROP,先明确放行,再统一限制行为(比如只对已建立连接放行)
用 ipset 替代大批量 IP 或端口列表
当你要封禁或放行几百上千个 IP,或者几十个端口时,逐条写 iptables 规则会让匹配时间从 O(1) 变成 O(n)。ipset 把查找变成哈希或 bitmap 操作,性能几乎不随条目增长而下降。
- 创建集合:ipset create blackips hash:ip,然后批量添加:ipset add blackips 203.0.113.5
- 在 iptables 中引用:iptables -A INPUT -m set --match-set blackips src -j DROP
- 同样适用于端口集合(bitmap:port)或 IP+端口组合(hash:ip,port)
善用连接状态跳过重复判断
绝大多数流量是已建立连接的回包(ESTABLISHED/RELATED)。利用 conntrack 状态,可让 90% 以上数据包在第 2–3 条规则就匹配通过,根本不用跑完整个链。
- 确保 nf_conntrack 模块已加载:lsmod | grep nf_conntrack
- 在链首加一条:iptables -I INPUT 2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
- 这条之后,只需专注处理 NEW 连接——大幅压缩需深度检查的规则范围



















