核心是优化iptables规则顺序与结构以提升匹配效率:将ESTABLISHED/RELATED规则置顶放行回程流量,高频端口前置,用ipset/multiport聚合规则,raw表中对无连接协议NOTRACK,并调大conntrack上限。

核心思路是让数据包尽早匹配并终止检查,避免逐条遍历冗余规则。关键不在删多少条规则,而在让高频流量“秒过”。
把 ESTABLISHED/RELATED 规则放在链最前面
双向通信中,回程流量通常占 80% 以上。这条规则能直接放行已建立连接的包,跳过后续全部判断。
- 务必使用 -m conntrack --ctstate ESTABLISHED,RELATED,不要用已废弃的
--state - 写在 INPUT 和 FORWARD 链的第一条:
iptables -I INPUT 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT - 对本机发起的连接(如 curl 外部 API),OUTPUT 链也建议加同类规则
按实际流量频率排布规则顺序
iptables 是线性匹配,命中即停。把真正常走的路径往前放,平均匹配跳数会明显下降。
- Web 服务器优先放 HTTPS(443)、HTTP(80)端口,而不是 SSH(22)或数据库端口
- 用
iptables -L -n -v查看每条规则的 packet 计数,识别真实高频项 - 内部服务通信(如 Kubernetes Pod 间访问、Redis 健康检查)若占比高,也应前置
用 ipset 和 multiport 替代大量单条规则
每增加一条规则,就多一次内存比对。聚合后,查找从 O(n) 降为接近 O(1)。
- 封禁几百个恶意 IP?建一个 ipset:
ipset create badips hash:ip,再用一条规则引用:iptables -A INPUT -m set --match-set badips src -j DROP - 开放多个管理端口(22、8080、9000)?合并为:
iptables -A INPUT -p tcp -m multiport --dports 22,8080,9000 -j ACCEPT - 允许整个办公网段访问?写
-s 10.10.0.0/16,别拆成几十条 /24
减少连接跟踪开销
conntrack 是重量级模块,不是所有流量都需要状态跟踪。
- ARP、ICMP echo-request、DHCP 等无连接协议,在 raw 表中提前 NOTRACK:
iptables -t raw -A PREROUTING -p arp -j NOTRACK - 确认业务不需要 FTP 主动模式等特殊连接跟踪时,卸载
nf_conntrack_ftp模块 - 调大连接跟踪表上限防溢出:
echo 262144 > /proc/sys/net/netfilter/nf_conntrack_max

















