跳转到内容
搜索 RunEntLinux 文档

仅搜索 RunEntLinux 通用文档,各发行版文档使用各自的搜索入口。

    浏览当前文档目录

    防火墙 (firewalld)

    firewalld 是 CentOS / AlmaLinux / Rocky Linux 上默认的动态防火墙管理工具。它提供了基于 zone(区域)的防火墙管理方式,支持运行时修改规则而无需重启服务。

    Zone 是 firewalld 的核心概念。每个 zone 定义了一组信任级别和对应的防火墙规则,网络接口会被分配到不同的 zone 中。

    常用的内置 zone:

    Zone说明
    public默认区域。适用于公共网络环境,仅允许选定的入站连接
    trusted允许所有入站流量
    home适用于家庭网络,信任网络中的其他设备
    work适用于工作网络
    internal适用于内部网络
    dmz适用于 DMZ 区域的服务器,仅允许特定入站连接
    external适用于启用 NAT 伪装的外部网络
    block拒绝所有入站连接,会返回 ICMP 拒绝消息
    drop丢弃所有入站数据包,不返回任何响应
    查看 firewalld 运行状态
    sudo systemctl status firewalld
    启动并设为开机自启
    sudo systemctl enable --now firewalld
    检查 firewalld 是否正在运行
    sudo firewall-cmd --state
    查看默认 zone
    sudo firewall-cmd --get-default-zone
    查看所有活动的 zone 及其绑定的接口
    sudo firewall-cmd --get-active-zones
    查看当前 zone 的完整规则
    sudo firewall-cmd --list-all
    查看指定 zone 的规则
    sudo firewall-cmd --zone=public --list-all
    列出所有可用的 zone
    sudo firewall-cmd --get-zones
    列出所有预定义的服务
    sudo firewall-cmd --get-services
    查看某个服务的详细定义(如 http)
    sudo firewall-cmd --info-service=http

    firewalld 的规则分为两种:

    • 运行时规则 (runtime): 立即生效,但重启 firewalld 或系统后丢失
    • 永久规则 (permanent): 写入配置文件,重启后仍然有效,但不会立即生效
    添加永久规则并立即生效
    sudo firewall-cmd --permanent --add-service=http
    sudo firewall-cmd --reload

    也可以同时添加运行时和永久规则(无需 reload):

    同时生效运行时和永久规则
    sudo firewall-cmd --add-service=http
    sudo firewall-cmd --permanent --add-service=http
    放行 HTTP 服务(永久)
    sudo firewall-cmd --permanent --add-service=http
    sudo firewall-cmd --reload
    同时放行 HTTP 和 HTTPS
    sudo firewall-cmd --permanent --add-service=http --add-service=https
    sudo firewall-cmd --reload
    移除 HTTP 服务放行(永久)
    sudo firewall-cmd --permanent --remove-service=http
    sudo firewall-cmd --reload
    列出当前 zone 已放行的服务
    sudo firewall-cmd --list-services
    放行 TCP 8080 端口
    sudo firewall-cmd --permanent --add-port=8080/tcp
    sudo firewall-cmd --reload
    放行 UDP 端口
    sudo firewall-cmd --permanent --add-port=53/udp
    sudo firewall-cmd --reload
    放行端口范围
    sudo firewall-cmd --permanent --add-port=3000-3100/tcp
    sudo firewall-cmd --reload
    移除端口放行
    sudo firewall-cmd --permanent --remove-port=8080/tcp
    sudo firewall-cmd --reload
    列出当前已放行的端口
    sudo firewall-cmd --list-ports
    将默认 zone 改为 internal
    sudo firewall-cmd --set-default-zone=internal
    将 ens33 分配到 internal zone
    sudo firewall-cmd --permanent --zone=internal --change-interface=ens33
    sudo firewall-cmd --reload
    在 internal zone 中放行 MySQL 服务
    sudo firewall-cmd --permanent --zone=internal --add-service=mysql
    sudo firewall-cmd --reload

    Rich rules 提供了更精细的防火墙控制能力,可以根据源地址、目标地址、端口等条件灵活设置规则。

    Rich rules 的基本结构:

    rule family="ipv4" source address="源地址" service name="服务名" accept/reject/drop
    只允许 192.168.1.0/24 网段访问 SSH
    sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'
    sudo firewall-cmd --reload
    拒绝来自 10.0.0.100 的所有连接
    sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.100" drop'
    sudo firewall-cmd --reload
    允许 172.16.0.0/16 访问 TCP 3306 端口
    sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.16.0.0/16" port port="3306" protocol="tcp" accept'
    sudo firewall-cmd --reload
    记录并拒绝来自某 IP 的连接
    sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.200" log prefix="BLOCKED: " level="warning" drop'
    sudo firewall-cmd --reload
    列出当前所有 rich rules
    sudo firewall-cmd --list-rich-rules
    删除指定的 rich rule
    sudo firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="10.0.0.100" drop'
    sudo firewall-cmd --reload
    Web 服务器典型配置:放行 HTTP、HTTPS 和 SSH
    sudo firewall-cmd --permanent --add-service=http
    sudo firewall-cmd --permanent --add-service=https
    sudo firewall-cmd --permanent --add-service=ssh
    sudo firewall-cmd --reload
    只允许应用服务器网段访问 MySQL
    sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" service name="mysql" accept'
    sudo firewall-cmd --reload
    Node.js 应用运行在 3000 端口
    sudo firewall-cmd --permanent --add-port=3000/tcp
    sudo firewall-cmd --reload
    将外部 80 端口转发到内部 8080 端口
    sudo firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080
    sudo firewall-cmd --reload
    将流量转发到另一台主机
    sudo firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.1.50
    sudo firewall-cmd --permanent --add-masquerade
    sudo firewall-cmd --reload
    启用 IP 伪装
    sudo firewall-cmd --permanent --add-masquerade
    sudo firewall-cmd --reload
    查看所有 zone 的所有规则
    sudo firewall-cmd --list-all-zones
    查看 firewalld 生成的 nftables 规则
    sudo nft list ruleset

    EL 8 起 firewalld 的默认后端已经是 nftables(FirewallBackend=nftables),只有 EL 7 及更早才是 iptables。EL 8/9/10 上想看规则,用 nft list ruleset 或 firewall-cmd --list-all;iptables -L 在 EL8+ 上看到的是 nft 兼容层(iptables-nft)的视图,不是「使用 iptables 后端」的证据。

    EL 7 才用 iptables 后端(历史)
    sudo iptables -L -n -v
    查看 firewalld 相关日志
    sudo journalctl -u firewalld --no-pager -n 30
    开启紧急模式(阻断所有流量)
    sudo firewall-cmd --panic-on
    关闭紧急模式
    sudo firewall-cmd --panic-off
    检查是否处于紧急模式
    sudo firewall-cmd --query-panic
    备份 firewalld 配置目录
    sudo cp -r /etc/firewalld /etc/firewalld.backup.$(date +%Y%m%d)
    恢复备份的配置
    sudo cp -r /etc/firewalld.backup.20260324/* /etc/firewalld/
    sudo firewall-cmd --reload