firewall-cmd 放行端口:zone 模型与常见坑(Rocky 9)
什么时候该用它
Section titled “什么时候该用它”服务起在 8080、外部却连不上——十有八九是 firewalld 没放行。firewalld 不是「一张规则表」,而是按 zone 分组的规则集:先确定网卡落在哪个 zone,再改那个 zone 的端口/服务。
先看清 zone,而不是直接敲命令
Section titled “先看清 zone,而不是直接敲命令”firewall-offline-cmd --get-zonesfirewall-offline-cmd --get-default-zoneblock dmz drop external home internal public trusted workpublicRocky 9 的 public 默认只放行三个服务:
firewall-offline-cmd --zone=public --list-servicescockpit dhcpv6-client ssh以上是
firewall-offline-cmd在rockylinux:9容器里的实测输出(镜像 Rocky 9.3,firewalld 随dnf install firewalld安装)。容器没有 systemd,firewall-cmd需要运行中的 firewalld 守护进程,所以这里用离线工具看静态配置。
放行一个端口(永久 + 立即生效)
Section titled “放行一个端口(永久 + 立即生效)”sudo firewall-cmd --permanent --zone=public --add-port=8080/tcpsudo firewall-cmd --reloadsudo firewall-cmd --zone=public --list-ports只加 --permanent 不 --reload,规则要等到下次 reload/重启才生效;反过来,不加 --permanent 只改运行时,重启就丢。两个都要。
firewall-cmd --zone=public --list-allpublic 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。
sudo firewall-cmd --permanent --zone=public --add-port=8443/tcpsudo firewall-cmd --reload检查:
firewall-cmd --zone=public --list-ports→ 含8443/tcpfirewall-cmd --permanent --zone=public --list-ports→ 同样含8443/tcpsystemctl restart firewalld && firewall-cmd --zone=public --list-ports→ 仍在
- 端口放行与 SELinux 是两回事(页面待补):
/selinux-modes/ - 服务器基线:安全基线
- 网络连通性排查(页面待补):
/network-troubleshoot/