Linux防火墙规则编写核心是理解流量流向、精准匹配条件、合理组织策略顺序;需明确链与表职责,坚持“默认拒绝”原则,善用匹配模块提升精度,并及时保存、备份与排错。

Linux防火墙规则编写核心在于理解流量流向、精准匹配条件、合理组织策略顺序。用好iptables或nftables,关键不是堆砌规则,而是让每一条都可读、可维护、可验证。
明确链(Chain)和表(Table)的职责
iptables默认有filter、nat、mangle三张表,日常最常用的是filter表下的INPUT、OUTPUT、FORWARD链:
写规则前先确认你要控制的是哪类流量,再选对链和表,避免在OUTPUT链里拦HTTP出站请求这类常见误操作。
从“默认拒绝”开始,逐步放行
安全基线应是“先堵后通”。建议初始化策略为:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
然后按需添加白名单规则,例如:
- 允许本地回环:
iptables -A INPUT -i lo -j ACCEPT - 允许已建立连接返回:
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT - 开放SSH端口(建议改非标端口后使用):
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
注意:-A 是追加,-I 是插入(默认插到第一条),调试阶段常用 -I 临时测试,稳定后再用 -A 固化顺序。
善用匹配模块提升精度
基础协议+端口只是起点,真实场景常需更细粒度控制:
- 限速防爆破:
iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/min --limit-burst 3 -j ACCEPT - 按IP段放行内网:
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT - 封禁恶意IP:
iptables -A INPUT -s 203.0.113.45 -j DROP(推荐用ipset管理大量IP) - 匹配字符串(谨慎使用):
iptables -A INPUT -p tcp --dport 80 -m string --string "wget" --algo bm -j DROP
模块名(如limit、string、ipset)需内核支持,执行前可用 lsmod | grep xt_ 检查是否加载。
保存、备份与排错不靠猜
规则重启即失效,务必及时保存:
- Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4 - RHEL/CentOS:
service iptables save或用iptables-save > /etc/sysconfig/iptables - nftables用户:
nft list ruleset > /etc/nftables.conf
排错技巧:
- 加日志:在可疑规则后加
-j LOG --log-prefix "FW_DROP: ",再用dmesg或journalctl -k | grep FW_DROP查看 - 模拟测试:用
tcpdump -i eth0 port 22观察包是否到达,再结合iptables -L -v -n看计数器是否增长 - 备份旧规则:
iptables-save > /root/iptables-backup-$(date +%F)
基本上就这些。规则不在多,在准;配置不在快,在稳。每次改完,用iptables -L -v -n扫一眼计数器,比反复重启服务更省时间。










