外观
firewalld 常用操作
AlmaLinux / Rocky 默认用 firewalld,Debian 上更常见的是 ufw 或裸 nftables。这里只记 firewalld。
基本查看
bash
firewall-cmd --state
firewall-cmd --list-all # 当前 zone 的全部规则
firewall-cmd --get-active-zones放行端口 / 服务
bash
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload不加 --permanent 的改动重启就没了;加了 --permanent 必须 --reload 才生效。两个都要。
收回
bash
firewall-cmd --permanent --remove-port=8080/tcp
firewall-cmd --permanent --remove-service=cockpit
firewall-cmd --reload新机器默认往往放行了 cockpit 和 dhcpv6-client,不用就删掉。
只允许特定来源
bash
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="1.2.3.4/32" port port="22" protocol="tcp" accept'和 Docker 的关系
这是最容易被坑的地方:
| 容器网络模式 | firewalld 管不管 |
|---|---|
host | 管,规则正常生效 |
bridge + 端口映射 | 不管。Docker 直接往 nftables 里插规则,绕过 firewalld |
所以 docker run -p 0.0.0.0:3000:3000 起来的服务,firewalld 里没放行 3000 也照样能从公网访问。
要限制容器端口只在本机可见,把映射绑到回环地址:
yaml
ports:
- "127.0.0.1:3000:3000"这是主要防线,不要指望防火墙兜底。
排查思路
端口放行了还是连不上,按顺序查:
- 服务本身在不在监听:
ss -tlnp | grep 端口 - 监听地址是不是
127.0.0.1(那外面永远进不来) - firewalld 有没有放行:
firewall-cmd --list-all - 云厂商的安全组(这个最容易忘)