跳转到内容
搜索 Rocky Linux 文档

    浏览当前文档目录

    firewall-cmd 放行端口:zone 模型与常见坑(Rocky 9)

    服务起在 8080、外部却连不上——十有八九是 firewalld 没放行。firewalld 不是「一张规则表」,而是按 zone 分组的规则集:先确定网卡落在哪个 zone,再改那个 zone 的端口/服务。

    Terminal window
    firewall-offline-cmd --get-zones
    firewall-offline-cmd --get-default-zone
    block dmz drop external home internal public trusted work
    public

    Rocky 9 的 public 默认只放行三个服务:

    Terminal window
    firewall-offline-cmd --zone=public --list-services
    cockpit dhcpv6-client ssh

    以上是 firewall-offline-cmd 在 rockylinux:9 容器里的实测输出(镜像 Rocky 9.3,firewalld 随 dnf install firewalld 安装)。容器没有 systemd,firewall-cmd 需要运行中的 firewalld 守护进程,所以这里用离线工具看静态配置。

    放行一个端口(永久 + 立即生效)

    Section titled “放行一个端口(永久 + 立即生效)”
    Terminal window
    sudo firewall-cmd --permanent --zone=public --add-port=8080/tcp
    sudo firewall-cmd --reload
    sudo firewall-cmd --zone=public --list-ports

    只加 --permanent 不 --reload,规则要等到下次 reload/重启才生效;反过来,不加 --permanent 只改运行时,重启就丢。两个都要。

    Terminal window
    firewall-cmd --zone=public --list-all
    public
    target: default
    icmp-block-inversion: no
    interfaces:
    sources:
    services: cockpit dhcpv6-client ssh
    ports: 8080/tcp
    ...

    ports: 里有 8080/tcp 才算放行成功;services: 仍只有那三个默认服务。

    • 只写 --add-port=8080:默认按单协议处理,需要 UDP 时要显式写 8080/udp;
    • 改错 zone:网卡在 public,命令却写了 --zone=internal,看 firewall-cmd --get-active-zones 确认网卡归属;
    • 加了端口但服务没监听 0.0.0.0:ss -lntp | grep 8080 确认监听地址,只听 127.0.0.1 的话放行也没用。

    练习:放行 8443/tcp 并保证重启后仍在

    Section titled “练习:放行 8443/tcp 并保证重启后仍在”

    前置:Rocky 9,root 或 sudo。

    Terminal window
    sudo firewall-cmd --permanent --zone=public --add-port=8443/tcp
    sudo firewall-cmd --reload

    检查:

    1. firewall-cmd --zone=public --list-ports → 含 8443/tcp
    2. firewall-cmd --permanent --zone=public --list-ports → 同样含 8443/tcp
    3. systemctl restart firewalld && firewall-cmd --zone=public --list-ports → 仍在
    • 端口放行与 SELinux 是两回事(页面待补):/selinux-modes/
    • 服务器基线:安全基线
    • 网络连通性排查(页面待补):/network-troubleshoot/