linux防火墙性能优化核心是让高频流量尽早匹配放行:1.将established/related规则置顶,覆盖80%以上回包;2.用端口集合或ipset替代线性规则,实现o(1)查找;3.对dns、内网流量在raw表notrack绕过conntrack;4.清理僵尸规则并设默认drop策略。

Linux 内核网络过滤表(iptables/nftables)的匹配开销,本质是每包遍历规则链的 CPU 时间。优化核心不是“加规则”,而是让绝大多数流量在极早期就命中放行,跳过后续所有匹配——因为 Netfilter 是线性扫描、命中即停。
把 established/related 规则放到最前面
已建立连接的回包通常占入站流量 80% 以上。这条规则必须无条件置顶,否则每条回包都要扫完整个规则链:
- iptables:
iptables -I INPUT 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT - nftables:
nft add rule ip filter input ct state established,related accept
这样 TCP 长连接数据、HTTP 响应、SSH 会话回包等,一条规则就放行,完全不触发后面任何判断。
用集合代替离散规则
写几十条 -p tcp --dport 22、--dport 80、--dport 443 是低效的——每次都要逐条比对端口。应合并或用哈希查找:
- nftables 直接支持端口集合:
nft add rule ip filter input tcp dport {22, 80, 443} accept - 大量 IP 或网段用 ipset:
ipset create allow_ips hash:net,再批量导入,最后用iptables -A INPUT -m set --match-set allow_ips src -j ACCEPT
哈希查找是 O(1),而线性扫描 n 条规则平均要查 n/2 次,规模越大差距越明显。
绕过 conntrack 减轻状态跟踪压力
conntrack 表是高频瓶颈,尤其对 DNS、健康检查、内网通信这类无需状态管理的流量。在 raw 表打 notrack 标记,可跳过连接跟踪全过程:
- DNS 响应:
nft add rule ip raw PREROUTING udp dport 53 notrack - 可信内网互访:
nft add rule ip raw PREROUTING ip saddr @trusted_nets ip daddr @trusted_nets notrack
同时配合调小 conntrack 超时值,比如:sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=300,防止表填满导致丢包。
清理冗余规则并设默认策略
长期运行的防火墙容易积累僵尸规则:被注释掉却仍生效、重复开放同一端口、旧服务残留规则。这些都会拖慢匹配速度:
- 定期执行
iptables -S | wc -l或nft list ruleset | grep 'rule' | wc -l查看规则总数,超过 100 条就要审视 - 删除无用规则后,务必确认默认策略为 DROP:
iptables -P INPUT DROP(避免漏掉显式规则就放行) - nftables 推荐用
flush+ 重载策略,避免增量追加导致顺序混乱
规则越少、结构越清晰,每包平均匹配成本就越低。











