iptables 是底层规则工具,firewalld 是其上层抽象,支持动态更新与区域管理;二者不可共存,需统一管理方式,CentOS/RHEL 默认 firewalld,Debian/Ubuntu 长期用 iptables。

Linux 系统中,iptables 和 firewalld 是最常用的 防火墙 工具,二者定位不同:iptables 是底层规则管理工具,firewalld 是其上层服务抽象,支持动态更新、区域(zone)管理和更友好的命令接口。实际使用中,选哪个取决于发行版默认配置和运维习惯——CentOS 7+/RHEL 8 默认启用 firewalld,但很多运维人员仍习惯用 iptables 直接操作;Debian/Ubuntu 则长期以 iptables 为主,直到较新版本才逐步引入 nftables。
iptables 基础配置与常用规则
iptables 规则按链(chain)组织,主要处理 INPUT(入站)、OUTPUT(出站)、FORWARD(转发)三类流量。每条规则匹配条件后执行动作(ACCEPT、DROP、REJECT 等)。关键点在于规则顺序决定匹配优先级,越靠前的规则越先生效。
- 查看当前规则:
sudo iptables -L -n -v(-n 禁用 DNS 解析,-v 显示详细统计) - 放行 SSH(端口 22):
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT - 拒绝所有未匹配的入站连接:
sudo iptables -P INPUT DROP(注意:执行前务必确保已有 SSH 规则,否则可能锁死) - 保存规则(不同系统方式不同):
• CentOS/RHEL:sudo service iptables save或sudo iptables-save > /etc/sysconfig/iptables
• Debian/Ubuntu:sudo iptables-save > /etc/iptables/rules.v4,并配合 ifupdown 或 netfilter-persistent 服务自动加载
firewalld 区域管理与服务配置
firewalld 的核心是“区域(zone)”,每个 zone 定义一组默认行为和允许的服务。public 是默认区域,适合服务器外网接口;trusted 用于完全信任的内网环境;drop 则默认丢弃所有入站包(仅响应 ICMP ping)。
- 查看当前状态:
sudo firewall-cmd --state(运行中返回 running) - 列出默认区域开放的服务:
sudo firewall-cmd --list-services - 临时开放 HTTP:
sudo firewall-cmd --add-service=http - 永久开放 HTTPS:
sudo firewall-cmd --add-service=https --permanent && sudo firewall-cmd --reload - 自定义端口(如 Redis 6379):
sudo firewall-cmd --add-port=6379/tcp --permanent - 修改默认区域绑定的网卡:
sudo firewall-cmd --zone=internal --change-interface=eth1 --permanent
iptables 与 firewalld 共存问题与切换策略
二者不能同时直接管理同一套内核规则。firewalld 底层仍调用 iptables(或 nftables),若手动用 iptables 修改规则,firewalld 可能无法感知,导致 reload 后规则丢失。生产环境中应统一管理方式。
- 停用 firewalld 并启用 iptables:
•sudo systemctl stop firewalld
•sudo systemctl disable firewalld
• 安装并启动 iptables-services(RHEL/CentOS)或相应包 - 从 iptables 迁移至 firewalld:
• 先导出当前规则:sudo iptables-save > /tmp/iptables.rules
• 分析规则逻辑,映射为 zone + service/port 组合
• 使用firewall-cmd逐条配置,最后--reload - 检查冲突:运行
sudo iptables -L后再执行sudo firewall-cmd --reload,若规则清空说明 firewalld 已接管且旧 iptables 规则被覆盖
性能优化与安全加固建议
防火墙本身开销不大,但不当配置会影响连接建立速度和日志体积。重点不在“加更多规则”,而在“精准匹配”和“减少遍历”。
- 将高频规则(如 SSH、HTTP)放在链开头,降低平均匹配跳数
- 避免使用
-m state --state NEW等过时模块,改用-m conntrack --ctstate NEW(iptables v1.4.21+) - 限制连接速率防暴力扫描:
sudo iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT - 记录可疑连接(慎用,避免日志刷爆):
sudo iptables -A INPUT -m state --state INVALID -j LOG --log-prefix "INVALID_PACKET:" - 定期审计规则:
sudo iptables -S查看原始规则语法,比-L更利于排查逻辑错误