必须用终端命令验证macos防火墙策略:先运行sudo /usr/libexec/applicationfirewall/socketfilterfw --getglobalstate确认服务启用,再用--listapps查看真实注册规则;未列出的应用不受控,临时路径或未签名却allow的条目需重点排查。

要确认 macOS 当前启用的防火墙策略是否已按预期加载,不能只看图形界面开关状态,必须通过终端命令直接读取底层规则快照——界面可能缓存、延迟刷新,而终端输出是 socketfilterfw 服务实时返回的真实注册列表。
查看全局防火墙开关状态
先确认防火墙服务本身是否已启动:运行 sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate。返回 Firewall is enabled. 表示服务已激活;若为 Firewall is disabled.,后续所有规则查询都将为空,需先执行 --setglobalstate on 启用。
列出所有已注册的应用级规则
执行以下命令获取完整应用清单:sudo /usr/libexec/ApplicationFirewall/socketfilterfw --listapps
该命令输出每行包含三项:应用绝对路径、签名状态(Signed/Unsigned)、当前传入策略(Allow/Block)。【注意:未出现在此列表中的应用,防火墙对其无任何控制作用——即使它正在联网,也不会被拦截】
常见误判点:系统自带工具如 Terminal.app、iTerm.app 不会自动注册;Python 脚本启动的 http.server 默认也不在列表中,除非你手动用 --add 添加过对应解释器路径(如 /usr/bin/python3)。
检查可疑进程或临时二进制文件
方法一:筛选含随机路径的条目
在终端中运行:sudo /usr/libexec/ApplicationFirewall/socketfilterfw --listapps | grep -E "/tmp/|/var/folders/|~/.Trash|-[a-zA-Z0-9]{8,}"
若命中结果,说明有临时解压、沙盒运行或已删除但残留规则的程序,需进一步判断是否应保留。
方法二:定位未签名且被允许的应用
执行:sudo /usr/libexec/ApplicationFirewall/socketfilterfw --listapps | awk '$2 == "Unsigned" && $3 == "Allow"' | head -5
这类组合存在安全风险——未签名软件获得入站通行权,可能被恶意利用监听端口。
验证某具体应用是否已被阻断
第一步:确认应用路径准确无误,例如 Slack 的标准路径是 /Applications/Slack.app,不是 /Applications/Slack.app/Contents/MacOS/Slack 或别名。
第二步:运行查询命令:sudo /usr/libexec/ApplicationFirewall/socketfilterfw --listapps | grep "Slack.app"
第三步:观察输出第三列是否为 Block。若显示 Allow 或无输出,则阻断未生效。
【关键前提:该应用必须已通过 --add 命令注册到防火墙数据库,否则 --block 操作无效】











