Linux防火墙选型实战:iptables与firewalld规则编写对比 核心要点图解,iptables直接操作内核netfilter,规则灵活但需手动持久化。;firewalld提供动态管理和区域概念,更易用且支持运行时重载。;选型取决于团队习惯:追求精细控制选iptables,追求便捷选firewalld。;无论哪种,规则编写后必须测试并确保开机自启。
Linux防火墙选型实战:iptables与firewalld规则编写对比 · 核心要点一图读懂(AegisX)

核心要点(TL;DR)

  • iptables直接操作内核netfilter,规则灵活但需手动持久化。
  • firewalld提供动态管理和区域概念,更易用且支持运行时重载。
  • 选型取决于团队习惯:追求精细控制选iptables,追求便捷选firewalld。
  • 无论哪种,规则编写后必须测试并确保开机自启。

痛点引入:防火墙规则写起来容易,管起来难

很多运维在配置Linux防火墙时,都会遇到这样的困境:临时用iptables命令加了几条规则,重启后全部丢失;或者用firewalld开放了端口,却不知道规则到底写在哪个zone里。更头疼的是,团队里有人用iptables,有人用firewalld,规则互相覆盖,排查故障时无从下手。本文将从实战角度对比iptables与firewalld的规则编写方式,给出具体命令、操作步骤和选型检查清单,帮你快速确定适合自己环境的方案,并落地一套可维护的防火墙策略。

iptables:直接操控内核的经典之选

iptables是Linux内核netfilter框架的用户态工具,直接操作四表五链,规则匹配效率高,适合需要精细控制的场景。但它的规则默认不持久化,需要额外配置。

基础规则编写示例

假设需要开放SSH(22)、HTTP(80)、HTTPS(443)端口,并拒绝其他入站流量,规则如下:

# 清空现有规则(谨慎操作,避免断连)
iptables -F
iptables -X
# 允许已建立的连接
 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
# 开放指定端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 默认拒绝其他入站
iptables -P INPUT DROP

注意:在远程服务器上操作时,务必先设置允许SSH的规则,再修改默认策略,避免把自己关在门外。

规则持久化

iptables规则重启后会丢失,必须持久化。常用方法:

  • Debian/Ubuntu:安装iptables-persistent,执行netfilter-persistent save。
  • CentOS/RHEL:执行service iptables save(需安装iptables-services)。
  • 通用方法:使用iptables-save > /etc/iptables/rules.v4保存,并在开机脚本中通过iptables-restore加载。

firewalld:动态管理的现代方案

firewalld是CentOS 7+和Fedora的默认防火墙管理工具,它基于zone和service的概念,支持运行时修改和永久配置分离,无需重启服务即可生效。

基础规则编写示例

实现与上面相同的需求:

# 查看默认zone(通常为public)
firewall-cmd --get-default-zone
# 永久开放端口(--permanent表示永久生效,需重载)
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
# 重载使永久规则生效
firewall-cmd --reload
# 查看当前规则
firewall-cmd --list-all

firewalld默认拒绝未明确允许的入站流量,因此无需手动设置默认策略。使用service比直接写端口更规范,因为service预定义了端口和协议。

区域(zone)的灵活运用

firewalld的zone允许你为不同网络接口设置不同安全级别。例如,将公网接口绑定到public zone,内网接口绑定到trusted zone:

firewall-cmd --zone=trusted --add-interface=eth1 --permanent
firewall-cmd --reload

iptables与firewalld规则编写对比

对比项iptablesfirewalld
规则模型表/链/规则,直接操作内核zone/service/rich rule,动态管理
持久化需额外工具或脚本内置--permanent,自动持久化
修改生效立即生效,但需小心断连运行时与永久分离,--reload生效
易用性命令复杂,需理解netfilter命令直观,支持服务名
适用场景精细控制、老旧系统、容器环境现代Linux发行版、快速配置

分步排查:规则不生效怎么办?

无论使用哪种工具,规则不生效时可按以下步骤排查:

  1. 检查服务状态:iptables查看systemctl status iptables;firewalld查看systemctl status firewalld。
  2. 确认规则已加载:iptables用iptables -L -n -v;firewalld用firewall-cmd --list-all。
  3. 检查默认策略:iptables的链默认策略可能为ACCEPT,需显式设置DROP;firewalld的zone target决定默认行为。
  4. 查看日志:iptables可添加LOG规则跟踪;firewalld日志在/var/log/firewalld或journalctl中。
  5. 测试连通性:使用telnet或nc从外部测试端口,避免本地回环干扰。

选型检查清单与行动建议

根据以下清单快速决策:

  • 系统版本:CentOS 7+、Fedora、RHEL 8+默认firewalld,建议沿用;Debian/Ubuntu可选iptables或nftables。
  • 团队技能:熟悉netfilter选iptables;追求易用选firewalld。
  • 动态需求:需要频繁修改规则且不想重启服务,选firewalld。
  • 精细控制:需要基于模块(如limit、recent)的复杂规则,iptables更灵活。
  • 容器环境:Docker默认管理iptables,需注意与firewalld的兼容性。

行动建议:无论选择哪种,务必在修改前备份规则(iptables-save或firewall-cmd --runtime-to-permanent),并在测试环境验证。对于生产环境,建议结合AegisX的主机安全能力,实现防火墙策略的集中管理与合规检查,减少人工配置风险。

常见问题(FAQ)

iptables和firewalld可以同时使用吗?

不建议同时使用。firewalld底层也是调用iptables,同时配置可能导致规则冲突。应选择其一作为管理工具,并禁用另一个服务。

如何永久保存iptables规则?

使用iptables-save命令将规则导出到文件,如iptables-save > /etc/iptables/rules.v4,然后通过iptables-persistent或systemd服务在开机时加载。

firewalld的zone是什么?

zone是firewalld中的安全区域概念,每个zone定义了一组规则,网络接口可以绑定到不同zone,实现基于信任级别的流量控制。

如何查看当前防火墙规则?

iptables使用iptables -L -n -v查看;firewalld使用firewall-cmd --list-all查看当前zone规则。

防火墙规则配置后如何测试?

使用telnet或nc测试端口连通性,如telnet 服务器IP 端口,同时检查日志/var/log/messages或journalctl -u firewalld确认规则生效。