macOS 系统代理设置全攻略
简答:macOS 新版设置系统代理的入口是“系统设置 > 网络 > 选择网络服务 > 详细信息 > 代理”。先判断你要代理的是浏览器、单个应用、终端工具还是更多网络流量,再选择系统代理、应用代理、环境变量或 TUN/VPN;保存后不要只看开关状态,应使用明确的 curl 代理命令、日志和实际业务请求验证。本文还给出 HTTP、HTTPS、SOCKS、PAC 的选择方法,以及客户端退出后恢复直连的步骤。
定义:macOS 系统代理是绑定到某个网络服务的代理配置,供支持系统代理的应用按照 HTTP、HTTPS、SOCKS 或 PAC 规则发起请求,但它不等于所有应用、协议和终端工具都会自动经过代理。
先判断:你该使用哪种代理方式
如果你只是希望 Safari 或部分桌面应用读取代理,优先配置 macOS 系统代理;如果只需要 curl、Git、Homebrew 或 npm 使用代理,优先检查环境变量或工具自身配置;如果希望覆盖更多 TCP、UDP、DNS 或不读取系统代理的应用,则应使用支持网络扩展或 TUN 的客户端。系统代理开关打开,只能说明某个网络服务保存了配置,不能证明全部流量都已经改变路径。
| 你的目标 | 优先方案 | 验证重点 |
|---|---|---|
| Safari 或支持系统设置的桌面应用 | 系统设置中的 HTTP、HTTPS、SOCKS 或 PAC | 确认配置写入当前 Wi-Fi 或以太网服务,再测试实际页面 |
| curl、Git、Homebrew、npm | 环境变量或工具自身代理配置 | 查看变量、工具配置,并用明确的代理参数测试 |
| Firefox、Telegram 等单独控制代理的应用 | 应用内代理设置 | 检查应用是否绕过 macOS 系统代理 |
| 需要覆盖更多协议或应用 | VPN、网络扩展或 TUN | 检查路由、DNS、IPv6、权限和客户端日志 |
| 公司或学校统一下发代理 | PAC 或设备管理配置 | 确认是否被管理策略覆盖,避免与手动设置叠加 |
macOS 系统代理页面支持自动发现代理、PAC、网页代理 HTTP、安全网页代理 HTTPS、SOCKS 代理,以及绕过主机和域名等选项,具体入口和字段可参考Apple 在 Mac 上更改代理设置。
新版 macOS:图形界面设置系统代理
- 确认当前网络服务。打开“系统设置 > 网络”,查看当前使用的是 Wi-Fi、以太网还是其他网络服务。
- 打开代理页面。选择正在使用的网络服务,点按“详细信息”,向下滚动后打开“代理”。Apple 官方路径就是“系统设置 > 网络 > 网络服务 > 详细信息 > 代理”。
- 按参数类型选择。拿到 PAC 地址时选择“自动代理配置”;拿到服务器地址和端口时,按提供方明确给出的协议打开 HTTP、HTTPS 或 SOCKS。不要仅凭端口号猜协议,也不要为了“保险”同时勾选多个协议。
- 填写认证。如果代理要求用户名和密码,打开“代理服务器要求密码”后填写。不要把真实密码写入脚本、截图或 Shell 历史记录。
- 填写绕过列表。局域网、公司内网或明确需要直连的域名,可以放入“忽略这些主机与域的代理设置”。多个项目按界面要求用逗号分隔;不确定时不要大范围加入绕过项,否则测试可能实际走的是直连。
- 保存并验证。点按“好”保存,然后使用明确指定代理的 curl 命令和实际业务页面分别验证。
Safari 的“设置代理服务器”入口最终仍会引导到系统网络代理设置,相关说明可查看Apple Safari 用户手册。Safari 测试成功,只能证明 Safari 当前请求路径可用,不能证明其他应用、DNS、IPv6 或全部网络流量也正常。
HTTP、HTTPS、SOCKS、PAC 怎么选
| 类型 | 填写内容 | 适用条件 | 常见错误 |
|---|---|---|---|
| HTTP | 服务器地址、端口、可选认证 | 服务明确提供 HTTP 网页代理 | 把 SOCKS 端口当成 HTTP 端口 |
| HTTPS | 服务器地址、端口、可选认证 | 服务明确提供 HTTPS 代理 | 看到 HTTPS 网站就误以为必须使用 HTTPS 代理 |
| SOCKS | 服务器地址、端口、可选认证 | 服务明确提供 SOCKS 代理 | 用 HTTP 写法或 HTTP 方式测试 SOCKS 端口 |
| PAC | PAC 文件 URL | 需要按域名或规则决定直连与代理 | 把普通网页地址误填成 PAC 地址 |
| 自动发现代理 | 通常不需要手动地址 | 网络管理员明确要求使用自动发现 | 在普通网络中盲目打开,导致代理来源不明确 |
Apple 将 HTTP、HTTPS 和 SOCKS 作为不同的代理类型分别配置,并分别要求服务器地址和端口;因此端口数字本身不能决定协议。只有拿到协议、服务器地址和端口的完整参数后,才能正确填写。
Monterey 及更早版本:旧版入口
Monterey 及更早版本通常从“系统偏好设置 > 网络”进入,选择 Wi-Fi 或以太网,点按“高级”,再打开“代理”标签。不同小版本的中文菜单可能存在差异,但核心步骤仍是选择网络服务、打开代理页面、填写协议参数并应用。
- 选择当前真正连接的网络服务,不要只修改未使用的服务。
- 进入“高级 > 代理”,按照参数类型选择 HTTP、HTTPS、SOCKS 或 PAC。
- 保存后,用
networksetup和明确指定代理的 curl 命令检查。 - 如果此前使用过代理客户端,确认旧客户端的系统代理开关已经关闭,避免多套配置互相覆盖。
如果设备由公司或学校管理,代理设置可能由设备管理策略统一下发,手动修改后仍可能被覆盖。Apple 的设备管理文档可参考NetworkProxyConfiguration。
Wi-Fi、以太网和其他网络服务要分别检查
macOS 的代理配置绑定到具体网络服务。Wi-Fi、以太网、USB 网卡和部分虚拟网络服务可能是不同条目,因此在 Wi-Fi 中配置成功,不代表换成网线后仍然使用相同代理。
networksetup -listallnetworkservices先记录终端输出中的服务名称,后续命令中的名称必须完全一致;名称包含空格时要使用引号。例如:
networksetup -getwebproxy "Wi-Fi"
networksetup -getsecurewebproxy "Wi-Fi"
networksetup -getsocksfirewallproxy "Wi-Fi"如果实际服务名是“USB 10/100/1000 LAN”或其他名称,就把示例中的“Wi-Fi”替换掉。Apple 对网络服务与代理设置的官方说明见Mac 使用手册中的代理设置页面。
命令行验证:不要把直连测试误认为系统代理测试
重要区别:curl -I -v https://example.com没有指定 -x,也没有设置代理环境变量时,应把它看作直连基线测试,不能证明 curl 自动读取了 macOS 图形界面的系统代理。curl 官方文档说明,代理通常通过 -x 或代理环境变量指定。
查看 macOS 已保存的代理状态
networksetup -listallnetworkservices
networksetup -getwebproxy "Wi-Fi"
networksetup -getsecurewebproxy "Wi-Fi"
networksetup -getsocksfirewallproxy "Wi-Fi"
scutil --proxy这些命令只能确认系统配置是否存在,不能证明目标应用已经采用该配置。重点检查是否仍有旧端口、PAC 地址或错误的代理类型。
用 curl 明确指定 HTTP 或 SOCKS 代理
# HTTP 或 mixed 代理
curl -I -v -x http://127.0.0.1:PORT https://example.com
# SOCKS5 代理,让代理端处理域名解析
curl -I -v -x socks5h://127.0.0.1:PORT https://example.com把 127.0.0.1:PORT 换成实际地址和端口。curl 官方手册将 socks5h://定义为 SOCKS5 主机名解析形式,相关说明见curl 官方命令行手册。
设置环境变量后再测试
export http_proxy="http://127.0.0.1:PORT"
export https_proxy="http://127.0.0.1:PORT"
export ALL_PROXY="socks5h://127.0.0.1:PORT"
export NO_PROXY="localhost,127.0.0.1,.local"
env | grep -i proxy
curl -I -v https://example.com这次 curl 才是通过当前终端环境变量进行测试。curl 官方教程列出了 http_proxy、HTTPS_PROXY、ALL_PROXY 和 NO_PROXY 等变量,见curl 官方教程。
测量持续吞吐时保持条件一致
curl -L -o /dev/null -w "code=%{http_code} connect=%{time_connect} ttfb=%{time_starttransfer} speed=%{speed_download}\n" -x socks5h://127.0.0.1:PORT https://example.com/test-file在 macOS 或 Linux 终端中使用 /dev/null。固定使用一个你有权访问的大文件,测试至少 30 秒,保持同一网络、同一文件和同一代理端口,重复 3 次后计算平均值。speed_download是该次传输的平均下载速度,不等于延迟,也不等于所有应用的速度表现。
Git、Homebrew、npm、Docker 的独立检查
系统代理、终端环境变量和工具自身配置可能同时存在。排查时建议先查看,再决定是否清理;不要把真实账号密码直接写入命令或配置文件。
Git
git config --global --get http.proxy
git config --global --get https.proxy
gngit config --global --unset http.proxy
git config --global --unset https.proxy上面第三行的命令应为 git config --global --unset http.proxy,不要复制多余的 ng。Git 官方文档说明,http.proxy可以覆盖通常由代理环境变量提供的配置,见Git git-config 文档。
Homebrew
env | grep -i proxy
brew config
brew update -vHomebrew 官方文档建议通过 http_proxy、https_proxy、all_proxy 和 no_proxy等环境变量配置代理。先查看环境变量,再用一次可重复的更新命令观察是否仍有连接错误,参考Homebrew 官方手册。
npm
npm config get proxy
npm config get https-proxy
npm config delete proxy
npm config delete https-proxynpm 支持 proxy 和 https-proxy配置,也会参考相关环境变量。删除配置前先记录原值;npm 官方文档见npm config 文档。
Docker
docker info | grep -i proxy
[ -f ~/.docker/config.json ] && grep -n 'proxies' ~/.docker/config.jsonDocker CLI、容器构建过程和 Docker daemon 的代理配置并不是同一层。Docker 官方文档区分了 CLI、容器、构建过程和 daemon 的配置,因此 Docker Desktop 还要检查其自身设置,不能只依赖 macOS 系统代理。参考Docker 官方代理配置文档。
DNS、IPv4 和 IPv6:用可复现命令区分问题范围
DNS 解析、代理连接和 IPv4/IPv6 路径是不同环节。单独运行 dig只能观察当前系统解析器返回的结果,不能证明 SOCKS 代理端是否解析域名;要区分本地解析与代理端解析,应对比 socks5://和 socks5h://。
检查本机 DNS 返回
scutil --dns
dig example.com
dig AAAA example.com如果 dig失败,先处理本机 DNS 或网络服务问题;如果 dig正常但 socks5h://请求失败,问题可能位于代理端解析、认证或代理连接。
分别测试 IPv4 与 IPv6
curl -4 -I -v -x socks5h://127.0.0.1:PORT https://example.com
curl -6 -I -v -x socks5h://127.0.0.1:PORT https://example.com预期结果是:能工作的地址族完成 TLS 或 HTTP 响应;如果 -4成功而 -6失败,先检查网络服务、代理端和客户端是否支持 IPv6,不要直接把问题归因于域名或线路。
检查是否误走绕过规则
curl -I -v --noproxy "*" https://example.com
curl -I -v -x socks5h://127.0.0.1:PORT https://example.com第一条是明确直连对照,第二条是明确代理测试。观察 verbose 输出中的连接目标和代理协商结果;不要使用来源不明的“查 IP”服务作为唯一判断依据,也不要把一次请求结果推广为全部应用的网络路径。
代理不生效、换网络失效或关闭后无法上网
- 先核对参数。确认服务器地址、端口、协议和认证信息,不能只凭端口号判断 HTTP 或 SOCKS。
- 确认配置写入当前服务。运行
networksetup -listallnetworkservices,再检查实际使用的 Wi-Fi 或以太网服务。 - 确认本地端口正在监听。如果地址是
127.0.0.1,代理客户端必须运行并监听对应端口;客户端退出后,系统代理可能仍然保留旧端口。 - 只保留一条测试路径。暂时关闭其他代理客户端、浏览器代理扩展、VPN 或 TUN,避免多个配置互相覆盖。
- 检查绕过列表。目标域名可能命中 PAC 或绕过规则,导致测试实际走直连。
- 分别检查 DNS、IPv4 和 IPv6。使用
scutil --dns、dig、curl -4和curl -6,不要把所有失败归结为代理服务。 - 恢复直连。关闭图形界面代理,清理终端变量、Git 独立配置和应用内代理,再重新打开相关应用。
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY ALL_PROXY all_proxy NO_PROXY no_proxy
git config --global --unset http.proxy
git config --global --unset https.proxy如果命令提示配置不存在,可以忽略该项。恢复后重新运行 scutil --proxy、工具配置查看命令和一次明确的直连测试。若仍然无法联网,再检查 PAC、VPN、TUN、网络扩展权限以及当前网络服务。
macOS 系统代理自查卡
- 判断流量范围:浏览器、单个应用、终端工具,还是更多协议和应用。
- 确认协议:HTTP、HTTPS、SOCKS 或 PAC,不能凭端口猜测。
- 确认网络服务:当前是 Wi-Fi、以太网还是其他服务。
- 保存配置:填写地址、端口、认证和绕过列表。
- 查看状态:使用
networksetup与scutil --proxy确认配置是否写入。 - 明确指定代理:HTTP 使用
http://,SOCKS 使用socks5h://。 - 验证业务:分别测试浏览器、目标应用、Git、npm 或 Docker,不把一个工具的结果推广到全部流量。
- 恢复直连:关闭系统代理,清理环境变量和工具自身配置,再确认旧端口、PAC 和网络扩展没有残留。
判断顺序可以快速缩小范围:如果第 5 步没有配置,回到图形界面检查网络服务;如果配置存在但明确代理测试失败,检查端口、协议和认证;如果 curl 成功但目标应用失败,重点检查应用自身代理、PAC、TUN 或协议兼容范围。
常见问题
macOS 系统代理设置在哪里?
新版 macOS 进入“系统设置 > 网络”,选择 Wi-Fi、以太网或其他网络服务,点按“详细信息”,再打开“代理”。旧版通常是“系统偏好设置 > 网络 > 高级 > 代理”。
HTTP、HTTPS 和 SOCKS 代理应该怎么选?
以服务提供方或网络管理员明确给出的协议为准。HTTP、HTTPS、SOCKS 是不同代理类型,不能只根据端口号判断;如果只有地址和端口,应先确认端口实际协议。
为什么系统代理开了,但 curl 仍然直连?
curl 通常不会因为 macOS 图形界面打开系统代理就自动使用它。请使用 <code>curl -x http://...</code>或<code>curl -x socks5h://...</code>明确指定代理,或者先设置 <code>http_proxy</code>、<code>HTTPS_PROXY</code>、<code>ALL_PROXY</code>后再测试。
SOCKS 代理用 curl 怎么测试?
SOCKS5 使用 <code>curl -I -v -x socks5h://127.0.0.1:PORT https://example.com</code>;HTTP 或 mixed 代理使用 <code>curl -I -v -x http://127.0.0.1:PORT https://example.com</code>。将地址和端口替换为实际参数,协议必须与代理端口类型一致。
Safari 能访问,但其他应用不能访问,说明代理正常吗?
这只能证明 Safari 当前请求路径可用,不能证明代理服务、DNS、IPv6、其他协议或全部应用都正常。继续检查目标应用是否有独立代理、是否读取系统代理,以及是否被 PAC、绕过列表或 TUN 配置影响。
为什么换到以太网后代理失效?
macOS 可能把 Wi-Fi 和以太网保存为不同网络服务。使用 <code>networksetup -listallnetworkservices</code>查看服务名称,再在当前实际使用的服务中单独检查代理配置。
如何检查 npm、Git、Homebrew 和 Docker 是否有独立代理?
Git 使用 <code>git config --global --get http.proxy</code>和<code>https.proxy</code>;npm 使用 <code>npm config get proxy</code>和<code>npm config get https-proxy</code>;Homebrew 先查看代理环境变量并运行 <code>brew config</code>;Docker 可运行 <code>docker info | grep -i proxy</code>并检查 <code>~/.docker/config.json</code>中的代理配置。
macOS 代理关闭后仍然无法上网怎么办?
先运行 <code>scutil --proxy</code>检查 PAC 或旧端口,再清理 <code>http_proxy</code>、<code>HTTPS_PROXY</code>、<code>ALL_PROXY</code>等环境变量,以及 Git、npm 等工具的独立配置;最后确认 VPN、TUN 和网络扩展已经停止。
相关阅读
参考资料
- Apple:在 Mac 上更改代理设置
- Apple:Safari 在 Mac 上设置代理服务器
- Apple Developer:NetworkProxyConfiguration
- curl:官方命令行手册(curl.se)
- curl:官方教程与代理环境变量(curl.se)
- Git:git-config 官方文档(git-scm.com)