linux防火墙规则核心是“匹配即执行”,数据包自上而下匹配,命中即执行动作不再继续;顺序决定安全效果,须分清链与流向(input/OUTPUT/FORWARD),匹配条件需具体(如-s限源IP),默认策略应设为DROP并优先放行可信流量。

Linux防火墙规则的核心逻辑是“匹配即执行”,不是“满足才放行”。iptables或nftables都遵循这一原则:数据包从上到下依次比对每条规则,一旦匹配,就立即执行对应动作(ACCEPT、DROP、REJECT等),不再继续检查后续规则。所以顺序决定安全效果,写错顺序可能让白名单失效、黑名单形同虚设。
规则链与数据流向必须分清
iptables有5个内置链(PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING),nftables结构更清晰但同样依赖钩子点。日常最常用的是INPUT(进来的连接)、OUTPUT(本机发出的)、FORWARD(转发流量)。别在INPUT链里配端口转发,也别在OUTPUT链里拦外部IP——方向错了,规则永远不生效。
- 对外提供Web服务?重点配INPUT链,开放TCP 80/443
- 本机要访问数据库?OUTPUT链一般默认允许,无需额外放开
- 做网关或docker宿主机?FORWARD链必须显式控制,否则容器或VM可能绕过防护
匹配条件要具体,避免过度宽松
“-p tcp –dport 22 -j ACCEPT”看着简单,但如果没加-s指定来源IP,等于把ssh完全暴露。生产环境应坚持最小权限原则:
- 优先用-s限制源IP,比如-s 192.168.1.0/24或-s 203.0.113.5
- 多端口用–dports(注意是复数),如–dports 80,443,8080,别写多条重复规则
- 状态跟踪很关键:-m state –state ESTABLISHED,RELATED -j ACCEPT放在开头,保证已有连接不被误断
策略默认拒绝,白名单兜底
不要依赖“最后加一条DROP”来收尾。正确做法是把链默认策略设为DROP:iptables -P INPUT DROP。这样即使漏写规则,也不会意外放行。再按需插入ACCEPT规则——先放可信流量,再拦恶意特征。
- 执行iptables -P INPUT DROP前,务必确保已有一条允许当前SSH会话的规则,否则可能锁死
- 用iptables -I INPUT 1 …把紧急规则插在最前面,比-A更安全
- 保存规则用iptables-save > /etc/iptables/rules.v4(debian系)或service iptables save(RHEL系)
基本上就这些。规则不在多,在准;不在复杂,在可读可维护。写完用iptables -L -n -v看命中次数,用tcpdump或curl -v验证实际效果,比背命令管用得多。