Skip to content

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

新机器默认往往放行了 cockpitdhcpv6-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"

这是主要防线,不要指望防火墙兜底。

排查思路

端口放行了还是连不上,按顺序查:

  1. 服务本身在不在监听:ss -tlnp | grep 端口
  2. 监听地址是不是 127.0.0.1(那外面永远进不来)
  3. firewalld 有没有放行:firewall-cmd --list-all
  4. 云厂商的安全组(这个最容易忘)

个人笔记,写给未来忘事的自己。