应优先通过服务状态和专用命令退出码判断防火墙运行状态:firewalld用firewall-cmd --state退出码,ufw用ufw status | grep -q "Status: active",并辅以端口监听与连接跟踪验证实际拦截效果。

直接用 shell 条件判断检查防火墙是否运行,关键不是“写个 if”,而是准确获取状态并避免误判。不同发行版默认防火墙不同,得先锁定当前生效的服务,再用对应命令返回值做判断。
先确认用的是哪个防火墙
firewalld 和 ufw 不能共存,iptables 命令也查不到 firewalld 规则。必须先明确目标:
- 查系统类型:cat /etc/os-release | grep -E "(NAME|VERSION)"(CentOS/Rocky/Alibaba Cloud 通常用 firewalld;Ubuntu/Debian 默认是 ufw)
- 看哪个服务真在跑:systemctl is-active firewalld 或 ufw status | head -1(输出 active 或 Status: active 表示启用)
- 如果两个都显示 active,优先以 firewall-cmd --state 或 ufw status verbose 的实际规则为准,忽略另一个
用 firewall-cmd 判断 firewalld 状态
firewalld 提供了简洁的状态输出,适合脚本判断:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- firewall-cmd --state 返回 running 时退出码是 0;返回 not running 时退出码是 1
- 所以可直接写:if firewall-cmd --state &> /dev/null; then echo "firewalld is up"; else echo "firewalld is down"; fi
- 注意:不要用 [[ $(firewall-cmd --state) == "running" ]],因为输出可能带换行或空格,依赖退出码更可靠
用 ufw status 判断 ufw 状态
ufw 没有类似 --state 的专用开关,但它的 status 输出稳定:
- ufw status | grep -q "Status: active" 成功表示启用;失败表示禁用或未初始化
- 常用写法:if ufw status | grep -q "Status: active"; then echo "ufw is on"; else echo "ufw is off"; fi
- 首次安装后未启用 ufw 时,status 可能报错或输出 “Command not found”,建议加 2>/dev/null 静默错误
通用兜底:检查监听端口+连接跟踪
当不确定防火墙类型,或想验证“它是否真在拦流量”,可用间接方式:
- 查服务是否在监听:ss -tlnp | grep ':22\|:80'(确认 ssh/http 进程正常)
- 查连接跟踪里有没有新建连接:conntrack -L -p tcp --dport 22 2>/dev/null | head -1,空输出可能说明包被丢弃前就未进连接跟踪
- 组合判断:if ss -tln | grep -q ":22" && ! conntrack -L -p tcp --dport 22 >/dev/null 2>&1; then echo "firewall likely blocking"; fi

















