概述

macOS 提供了两种防火墙配置方式:图形界面的应用层防火墙和强大的 PF(Packet Filter)网络层防火墙。本文将详细介绍这两种配置方法及常见问题的解决方案。

核心内容:

  • 🖥️ 系统偏好设置中的应用防火墙
  • 💻 终端命令行配置 PF 防火墙
  • 🔧 pf.conf 规则编写
  • 🚨 应用安装权限问题解决

方式一:系统偏好设置

图形界面配置

适用场景: 普通用户日常使用

配置步骤:

  1. 打开防火墙设置

    • 系统偏好设置 → 安全性与隐私 → 防火墙
  2. 启用防火墙

    • 点击左下角锁图标解锁(需要管理员密码)
    • 点击"打开防火墙"按钮
  3. 配置防火墙选项

    • 点击"防火墙选项..."按钮
    • 配置应用程序的网络访问权限

可配置项:

选项说明推荐设置
阻止所有传入连接除必要系统服务外全部阻止高安全需求时启用
自动允许内建软件允许 Apple 官方软件接收连接✅ 推荐启用
自动允许已下载的签名软件允许 App Store 下载的软件✅ 推荐启用
启用隐身模式不响应 ICMP ping 请求根据需求选择

应用级规则

添加应用规则:

1
2
3
1. 在"防火墙选项"中点击 "+" 按钮
2. 选择要配置的应用程序
3. 设置"允许传入连接"或"阻止传入连接"

示例配置:

应用规则原因
Chrome/Safari允许Web 浏览器需要接收连接
VSCode允许Live Server 等功能需要
未知应用阻止安全第一

方式二:命令行配置(PF)

pfctl 命令

基本操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启用防火墙
sudo pfctl -e

# 禁用防火墙
sudo pfctl -d

# 查看防火墙状态
sudo pfctl -s info

# 查看当前规则
sudo pfctl -s rules

# 查看所有规则(包括详细信息)
sudo pfctl -s all

常用命令对比:

命令作用使用场景
pfctl -e启用开启防火墙保护
pfctl -d禁用临时关闭调试
pfctl -s rules查看规则检查配置
pfctl -f /etc/pf.conf重新加载应用新配置

pf.conf 配置文件

文件位置: /etc/pf.conf

编辑配置文件

1
2
3
4
5
6
7
8
# 备份原文件
sudo cp /etc/pf.conf /etc/pf.conf.backup

# 使用 nano 编辑
sudo nano /etc/pf.conf

# 或使用 vim 编辑
sudo vim /etc/pf.conf

基本规则语法

规则结构:

1
action [direction] [on interface] [proto protocol] [from source] [to destination] [port port]

常用规则示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 1. 允许本地回环
pass in on lo0
pass out on lo0

# 2. 阻止所有传入连接
block in all

# 3. 允许已建立的连接
pass in proto tcp from any to any flags S/SA keep state

# 4. 允许 SSH(端口 22)
pass in proto tcp from any to any port 22

# 5. 允许 HTTP/HTTPS
pass in proto tcp from any to any port 80
pass in proto tcp from any to any port 443

# 6. 允许特定 IP 访问
pass in proto tcp from 192.168.1.100 to any

# 7. 阻止特定 IP
block in from 203.0.113.0/24 to any

# 8. 允许 DNS 查询
pass out proto udp from any to any port 53

完整配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# /etc/pf.conf

# 宏定义(变量)
ext_if = "en0" # 外部网络接口
tcp_services = "{ 22, 80, 443 }"
udp_services = "{ 53 }"

# 选项
set skip on lo0 # 跳过回环接口

# 规范化
scrub in all # 数据包规范化

# 默认策略
block in all # 默认阻止所有传入
pass out all keep state # 允许所有传出并保持状态

# 允许规则
pass in proto tcp to port $tcp_services keep state
pass in proto udp to port $udp_services keep state

# ICMP(ping)
pass in inet proto icmp icmp-type { echoReq }

应用配置

重新加载配置:

1
2
3
4
5
6
7
8
# 检查语法
sudo pfctl -n -f /etc/pf.conf

# 应用配置
sudo pfctl -f /etc/pf.conf

# 启用防火墙
sudo pfctl -e

高级用法

查看统计信息

1
2
3
4
5
6
7
8
# 查看规则匹配统计
sudo pfctl -s rules -v

# 查看状态表
sudo pfctl -s states

# 查看队列统计
sudo pfctl -s queue -v

临时规则

1
2
3
4
5
# 添加临时规则(重启后失效)
echo "block in from 192.168.1.100" | sudo pfctl -f -

# 刷新规则
sudo pfctl -F all

应用安装权限问题

错误提示

1
xxx damaged and can't be opened. You should move it to the Trash

问题原因: macOS Gatekeeper 安全机制阻止未签名或签名无效的应用

解决方案一:移除扩展属性(推荐)

1
2
3
4
5
# 移除应用的扩展属性
sudo xattr -rc /Applications/YourApp.app

# 示例:移除 VSCode 的扩展属性
sudo xattr -rc /Applications/Visual\ Studio\ Code.app

命令说明:

  • xattr: 扩展属性管理工具
  • -r: 递归处理
  • -c: 清除所有扩展属性

解决方案二:调整安全设置

步骤一:允许任何来源

1
2
3
4
5
# 启用"任何来源"选项
sudo spctl --master-disable

# 恢复默认设置
sudo spctl --master-enable

步骤二:修改系统偏好设置

  1. 系统偏好设置 → 安全性与隐私
  2. 通用标签页
  3. 选择"允许从以下位置下载的应用"
  4. 选择"任何来源"(需先运行上述命令)

安全级别对比:

选项安全级别适用场景
App Store最高普通用户
App Store 和被认可的开发者推荐设置
任何来源开发调试

解决方案三:针对单个应用

1
2
3
4
5
# 允许特定应用运行
sudo spctl --add /Applications/YourApp.app

# 或者使用 xattr 单独处理
xattr -d com.apple.quarantine /Applications/YourApp.app

最佳实践

安全建议

基本原则:

建议说明
默认拒绝采用白名单模式,仅允许必要端口
最小权限为应用分配最少的网络权限
定期审查定期检查防火墙规则和日志
备份配置修改前备份 pf.conf
启用日志记录被阻止的连接

配置建议

推荐配置:

1
2
3
4
5
6
7
8
9
10
11
# 开发环境配置
- 启用应用层防火墙
- 允许 SSH、HTTP、HTTPS
- 阻止不必要的传入连接
- 启用隐身模式

# 生产服务器配置
- 使用 PF 防火墙
- 仅开放必要端口
- 配置 IP 白名单
- 启用连接速率限制

故障排查

常见问题:

问题排查方法
规则不生效检查语法:pfctl -n -f /etc/pf.conf
无法访问服务查看规则:pfctl -s rules | grep port
配置丢失确认是否重新加载:pfctl -f /etc/pf.conf

调试命令:

1
2
3
4
5
6
7
8
# 显示详细规则匹配信息
sudo pfctl -s rules -vv

# 实时查看防火墙日志
sudo tcpdump -n -e -ttt -i pflog0

# 查看被阻止的连接
sudo pfctl -s state | grep BLOCKED

注意事项

重要提醒:

⚠️ 修改前备份

1
sudo cp /etc/pf.conf /etc/pf.conf.$(date +%Y%m%d)

⚠️ 测试配置

1
2
# 检查语法但不应用
sudo pfctl -n -f /etc/pf.conf

⚠️ 影响评估

  • 防火墙规则可能影响网络连接
  • 过严格的规则可能阻止正常应用
  • 建议在非生产环境测试

⚠️ 权限要求

  • 所有防火墙配置都需要管理员权限
  • 使用 sudo 命令需要输入密码

总结

选择建议:

用户类型推荐方案原因
普通用户系统偏好设置简单直观,满足日常需求
开发者系统设置 + 临时 pfctl灵活调试,快速验证
系统管理员PF 配置文件精细控制,自动化管理

快速参考:

1
2
3
4
5
6
7
8
9
10
11
# 启用防火墙
sudo pfctl -e

# 查看规则
sudo pfctl -s rules

# 重新加载配置
sudo pfctl -f /etc/pf.conf

# 移除应用限制
sudo xattr -rc /Applications/App.app