macos防火墙真实状态须用socketfilterfw命令实时验证:sudo /usr/libexec/applicationfirewall/socketfilterfw --getglobalstate,返回“firewall is enabled.”即启用,否则需修复;配套脚本+launchd可实现每30分钟自动检测与日志记录。
mac 防火墙开启状态不能靠肉眼判断,界面按钮有时滞后或未刷新,必须用终端命令实时验证。下面提供一个轻量、可靠、可定时运行的检测脚本,适用于 macos ventura 至 sequoia 全系系统。
核心检测逻辑:用 socketfilterfw 获取真实状态
macOS 内置防火墙由 socketfilterfw 守护进程管理,GUI 界面只是前端。以下命令返回结果最权威:
- sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate —— 返回 “Firewall is enabled.” 或 “Firewall is disabled.”
- 该命令不依赖图形界面,不缓存,每次执行都是实时查询内核策略状态
- 返回非预期文本(如报错)即表示防火墙服务异常,需进一步排查
一键可用的健康检测脚本
将以下内容保存为 check-firewall.sh,赋予执行权限后即可运行:
#!/bin/bash LOG_FILE="$HOME/firewall-check.log" STATUS=$(sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate 2>/dev/null) TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S") if echo "$STATUS" | grep -q "enabled"; then echo "[$TIMESTAMP] OK: 防火墙已启用" >> "$LOG_FILE" exit 0 else echo "[$TIMESTAMP] ALERT: 防火墙未启用" >> "$LOG_FILE" exit 1 fi
- 运行前执行:chmod +x check-firewall.sh
- 首次运行会提示输入管理员密码,后续若配置了 sudo 免密(谨慎操作),可加入定时任务
- 日志自动追加到用户主目录下的 firewall-check.log,便于回溯
设置每30分钟自动检测(推荐)
使用 macOS 原生 launchd 实现稳定轮询,比 crontab 更兼容系统更新:
- 新建 plist 文件:~/Library/LaunchAgents/com.user.firewallcheck.plist
- 内容如下(注意替换 YOUR_USERNAME 为你的实际用户名):
<?xml version="1.0" encoding="UTF-8"?><plist version="1.0"><dict><key>Label</key><string>com.user.firewallcheck</string><key>ProgramArguments</key><array><string>/bin/bash</string><string>/Users/YOUR_USERNAME/check-firewall.sh</string></array><key>StartInterval</key><integer>1800</integer><key>RunAtLoad</key><true></true></dict></plist>
- 加载任务:launchctl load ~/Library/LaunchAgents/com.user.firewallcheck.plist
- 立即生效,重启后也自动运行,无需后台常驻进程
异常时快速修复(一行命令补救)
如果脚本持续报 ALERT,可直接启用防火墙并验证:
- 启用:sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate on
- 验证:sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
- 确认返回 “Firewall is enabled.” 后,检查日志是否转为 OK











