Linux防火墙规则编写核心是理解iptables/nftables的链、表、匹配条件与动作;iptables仍广泛用于旧系统,nftables为新系统默认,掌握网络流向与默认策略(如INPUT/OUTPUT/FORWARD设为DROP前先验证)比死记命令更重要。

Linux防火墙规则编写核心在于理解 iptables 或 nftables 的链(chain)、表(table)、匹配条件与目标动作。实际运维中,iptables 仍广泛使用(尤其CentOS 7/Ubuntu 18.04及更早),而较新系统(如Ubuntu 20.04+、CentOS 8+)默认启用 nftables(iptables命令可能只是nft的兼容封装)。掌握底层逻辑比死记命令更重要。
明确网络流向与默认策略
防火墙本质是控制进出本机的数据包。iptables有三张基础表:filter(过滤,默认)、nat(地址转换)、mangle(修改包头)。常用操作集中在 filter 表的三个链:
- INPUT:处理发往本机的入站流量(如SSH连接、Web服务请求)
- OUTPUT:处理本机发出的出站流量(如curl访问外部API)
- FORWARD:处理经本机转发的流量(仅当开启IP转发时生效)
每条链都有默认策略(policy),常见为 ACCEPT 或 DROP。生产环境建议先设为 ACCEPT,添加规则验证无误后,再将 INPUT/OUTPUT/FORWARD 的默认策略改为 DROP,避免锁死自己。
编写实用规则的典型场景与写法
以 iptables 为例,所有规则按顺序匹配,第一条匹配即执行对应动作,不再继续向下检查。因此“允许”规则应放在“拒绝”规则之前。
-
放行已建立的连接(必须加在最前面):
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -
开放SSH端口(22)并限制来源IP(增强安全):
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
若允许多个IP,可用 -s 192.168.1.0/24 或多次添加;也可用 ipset 提高效率 -
开放HTTP/HTTPS服务(80/443)给所有公网访问:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT -
禁止某IP段暴力扫描:
iptables -I INPUT -s 203.0.113.0/24 -j DROP(-I 插入到最前,优先拦截)
保存、恢复与调试技巧
iptables 规则默认不持久——重启后丢失。务必手动保存:
- Debian/Ubuntu:iptables-save > /etc/iptables/rules.v4(需安装 iptables-persistent)
- CentOS 7:service iptables save(需启用 iptables 服务,而非 firewalld)
- 通用临时备份:iptables-save > /root/iptables-backup-$(date +%F)
调试时用 iptables -L -n -v 查看带计数的详细规则;用 iptables -t nat -L -n -v 查看NAT规则;发现异常可快速清空:iptables -F(清空所有规则),但慎用。
向 nftables 迁移的务实建议
nftables 是 iptables 的现代替代,语法更统一、性能更好、支持集合和字典。若新项目或系统升级,建议直接学 nft:
- 查看当前规则:nft list ruleset
- 添加一条放行SSH规则:nft add rule ip filter input tcp dport 22 accept
- 保存规则(不同发行版路径略有差异):nft list ruleset > /etc/nftables.conf
注意:nft 不再区分 -A/-I,而是用 add/rule insert;且默认没有“state”模块,改用 ct state established,related accept。
基本上就这些。规则不在多,在准;不在快,在稳。每次改完确认连通性,留好回滚方式,实战能力自然提升。









