macOS 上的系统级代理配置会把所有遵循系统代理设置的应用程序的网络流量,通过指定的代理服务器转发,通常由「系统设置」应用或 networksetup 命令行工具管理。
macOS 提供了集中式的代理配置机制,大多数应用程序都会自动采用,包括浏览器(Safari、Chrome、默认配置下的 Firefox)、命令行工具(curl、wget)以及其他联网软件。这样无需逐个应用配置,即可在整个操作系统范围内获得一致的网络行为。
配置方式
在 macOS 上配置系统级代理主要有两种方式:
- 图形界面(GUI): 使用「系统设置」应用。适合交互式的一次性配置。
- 命令行界面(CLI): 使用
networksetup工具。该方式更适合脚本化、自动化或远程管理。
GUI 配置:系统设置
通过 macOS「系统设置」配置代理:
- 打开系统设置。
- 在侧边栏中进入网络。
- 在列表中选择当前使用的网络接口(例如 Wi-Fi、以太网)。
- 点击所选接口的详细信息...按钮。
- 在新窗口中,从侧边栏选择代理。
代理面板中提供以下选项:
-
自动代理配置:
- 自动发现代理: 启用通过 Web Proxy Auto-Discovery(WPAD)协议发现代理设置。
- 自动代理配置: 指定 Proxy Auto-Configuration(PAC)文件的 URL。
-
手动代理配置:
- 网页代理(HTTP): 为未加密的网页流量配置 HTTP 代理。
- 安全网页代理(HTTPS): 为加密的网页流量配置 HTTPS(SSL/TLS)代理。
- FTP 代理: 为 File Transfer Protocol 配置代理。
- SOCKS 代理: 配置 SOCKS 代理,可处理多种类型的网络流量。
- Gopher 代理:(遗留)为 Gopher 协议配置代理。
- 流媒体代理(RTSP/RTSP): 为 Real-Time Streaming Protocol 配置代理。
对于每种手动代理类型:
- 服务器: 输入代理服务器的 IP 地址或主机名。
- 端口: 输入代理服务器监听的端口号。
- 代理服务器需要密码: 若需要认证,请勾选此项,并填写用户名和密码。
代理绕过设置
「对这些主机与域名跳过代理设置」字段用于指定不使用所配置代理的目标。填入主机名、域名或 IP 地址,以逗号分隔。域名匹配支持通配符(*)。
示例:
*.local, 192.168.1.0/24, localhost, 127.0.0.1
CLI 配置:networksetup
networksetup 命令行工具可全面控制网络设置,包括代理。它作用于「网络服务」,对应「系统设置」中列出的接口(例如 "Wi-Fi"、"Ethernet")。
列出网络服务
配置之前,先确认网络服务的准确名称:
networksetup -listallnetworkservices
输出示例:
An asterisk (*) denotes that a network service is disabled.
Wi-Fi
Ethernet
Bluetooth PAN
Thunderbolt Bridge
请完全按照显示的名称使用(例如 "Wi-Fi")。
设置 HTTP/HTTPS 代理
为某个服务设置网页代理(HTTP)和安全网页代理(HTTPS):
# 设置 HTTP 代理(IP 地址:端口)
networksetup -setwebproxy "Wi-Fi" 192.168.1.100 8080
# 设置 HTTPS 代理(IP 地址:端口)
networksetup -setsecurewebproxy "Wi-Fi" 192.168.1.100 8080
如需附带认证:
# 设置带认证的 HTTP 代理
networksetup -setwebproxy "Wi-Fi" 192.168.1.100 8080 username password
# 设置带认证的 HTTPS 代理
networksetup -setsecurewebproxy "Wi-Fi" 192.168.1.100 8080 username password
注意: 直接在命令行中传入凭据通常不安全,它们可能被记录到 shell 历史中。在脚本中处理敏感凭据时,可考虑环境变量或 Keychain 等替代方案。
设置 SOCKS 代理
设置 SOCKS 代理:
networksetup -setsocksfirewallproxy "Wi-Fi" 192.168.1.100 1080
带认证(安全提示同上):
networksetup -setsocksfirewallproxy "Wi-Fi" 192.168.1.100 1080 username password
关闭代理
关闭指定代理:
networksetup -setwebproxystate "Wi-Fi" off
networksetup -setsecurewebproxystate "Wi-Fi" off
networksetup -setsocksfirewallproxystate "Wi-Fi" off
关闭某个服务的所有手动代理:
networksetup -setwebproxystate "Wi-Fi" off
networksetup -setsecurewebproxystate "Wi-Fi" off
networksetup -setftpproxystate "Wi-Fi" off
networksetup -setsocksfirewallproxystate "Wi-Fi" off
# ... 其他代理类型依此类推
设置自动代理配置(PAC 文件)
指定 PAC 文件 URL:
networksetup -setautoproxyurl "Wi-Fi" http://proxy.example.com/proxy.pac
启用自动发现代理(WPAD):
networksetup -setautoproxydiscovery "Wi-Fi" on
设置代理绕过域名
配置绕过代理的域名:
networksetup -setproxybypassdomains "Wi-Fi" "*.local" "192.168.1.0/24" "localhost"
服务名之后的参数即为绕过条目。清空已有的绕过条目:
networksetup -setproxybypassdomains "Wi-Fi" ""
代理类型说明
| 代理类型 | 处理的协议 | 说明
代理自动配置(PAC)文件
PAC 文件是一个 JavaScript 文件,用于定义浏览器和其他 user agent 如何为给定 URL 选择合适的代理服务器。它带来了灵活性:可以根据目标主机、域名甚至一天中的时间使用不同的代理配置。
指定 PAC 文件
如 GUI 与 CLI 部分所述,你可以指定 PAC 文件的 URL。macOS 会下载该脚本并据此决定代理使用方式。
PAC 文件的基本结构
PAC 文件必须包含名为 FindProxyForURL(url, host) 的函数。该函数返回一个字符串,指明应使用哪个代理。
function FindProxyForURL(url, host) {
// 内部主机直连
if (isPlainHostName(host) ||
shExpMatch(host, "*.local") ||
isInNet(host, "192.168.1.0", "255.255.255.0")) {
return "DIRECT";
}
// 对特定域名使用指定代理
if (shExpMatch(host, "*.example.com")) {
return "PROXY proxy.example.com:8080";
}
// 其余全部流量默认走主代理
return "PROXY mainproxy.yourcompany.com:8080; DIRECT";
// 当代理不可用时,回退到 "DIRECT"。
}
常用 PAC 函数:
* isPlainHostName(host):主机名中不含点号时返回 true。
* dnsDomainIs(host, domain):主机属于指定域名时返回 true。
* shExpMatch(host, pattern):主机匹配 shell 表达式模式时返回 true。
* isInNet(host, pattern, mask):主机的 IP 地址位于指定子网内时返回 true。
* myIpAddress():返回本机的 IP 地址。
* dnsResolve(host):将 DNS 主机名解析为 IP 地址。
代理绕过设置
「对这些主机与域名跳过代理设置」用于指定不经由所配置代理转发流量的目标。这对于直接访问内部资源、避免不必要的代理开销,或解决特定服务与代理的兼容性问题至关重要。
条目语法:
* 主机名: localhost、myinternalserver
* 域名: *.local、example.com、sub.example.net
* * 为通配符。*.domain.com 可匹配 host.domain.com 和 sub.host.domain.com。
* IP 地址: 192.168.1.10
* IP 子网: 192.168.1.0/24、10.0.0.0/8
* 支持 CIDR 表示法。
在 GUI 中条目通常以逗号分隔,或作为独立参数传给 networksetup -setproxybypassdomains。
验证与排查
查看当前代理设置
用 CLI 验证某个网络服务当前生效的代理设置:
# 获取某个服务的全部代理信息
networksetup -getwebproxy "Wi-Fi"
networksetup -getsecurewebproxy "Wi-Fi"
networksetup -getsocksfirewallproxy "Wi-Fi"
networksetup -getautoproxyurl "Wi-Fi"
networksetup -getautoproxydiscovery "Wi-Fi"
networksetup -getproxybypassdomains "Wi-Fi"
常见问题
- IP/端口错误: 确认代理服务器地址和端口填写正确。
- 认证失败: 确认用户名和密码正确。查看代理服务器日志中的认证尝试记录。
- 防火墙拦截: macOS 客户端上的本地防火墙,或客户端与代理服务器之间的网络防火墙,可能拦截了代理端口上的流量。
- 代理服务器不可达: 代理服务器本身可能已下线,或从客户端所在网段无法访问。
- PAC 文件错误: 使用 PAC 文件时,JavaScript 中的语法错误会导致其失效。用校验工具测试 PAC 文件,或将其简化以定位问题。同时确保 PAC 文件 URL 可访问。
- DNS 解析: 确保 macOS 客户端能解析代理服务器的主机名(若使用)以及外部主机名。
- 应用自身覆盖: 某些应用程序有自己的代理设置,会覆盖系统级配置。若流量未按预期转发,请检查该应用的专有设置。
