AgentNEO

macOS 系统代理设置全攻略

更新于 2026-10-27 · agentneo.top

简答:macOS 新版设置系统代理的入口是“系统设置 > 网络 > 选择网络服务 > 详细信息 > 代理”。先判断你要代理的是浏览器、单个应用、终端工具还是更多网络流量,再选择系统代理、应用代理、环境变量或 TUN/VPN;保存后不要只看开关状态,应使用明确的 curl 代理命令、日志和实际业务请求验证。本文还给出 HTTP、HTTPS、SOCKS、PAC 的选择方法,以及客户端退出后恢复直连的步骤。

定义:macOS 系统代理是绑定到某个网络服务的代理配置,供支持系统代理的应用按照 HTTP、HTTPS、SOCKS 或 PAC 规则发起请求,但它不等于所有应用、协议和终端工具都会自动经过代理。

先判断:你该使用哪种代理方式

如果你只是希望 Safari 或部分桌面应用读取代理,优先配置 macOS 系统代理;如果只需要 curl、Git、Homebrew 或 npm 使用代理,优先检查环境变量或工具自身配置;如果希望覆盖更多 TCP、UDP、DNS 或不读取系统代理的应用,则应使用支持网络扩展或 TUN 的客户端。系统代理开关打开,只能说明某个网络服务保存了配置,不能证明全部流量都已经改变路径。

macOS 代理方式速查
你的目标优先方案验证重点
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:图形界面设置系统代理

  1. 确认当前网络服务。打开“系统设置 > 网络”,查看当前使用的是 Wi-Fi、以太网还是其他网络服务。
  2. 打开代理页面。选择正在使用的网络服务,点按“详细信息”,向下滚动后打开“代理”。Apple 官方路径就是“系统设置 > 网络 > 网络服务 > 详细信息 > 代理”。
  3. 按参数类型选择。拿到 PAC 地址时选择“自动代理配置”;拿到服务器地址和端口时,按提供方明确给出的协议打开 HTTP、HTTPS 或 SOCKS。不要仅凭端口号猜协议,也不要为了“保险”同时勾选多个协议。
  4. 填写认证。如果代理要求用户名和密码,打开“代理服务器要求密码”后填写。不要把真实密码写入脚本、截图或 Shell 历史记录。
  5. 填写绕过列表。局域网、公司内网或明确需要直连的域名,可以放入“忽略这些主机与域的代理设置”。多个项目按界面要求用逗号分隔;不确定时不要大范围加入绕过项,否则测试可能实际走的是直连。
  6. 保存并验证。点按“好”保存,然后使用明确指定代理的 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 端口
PACPAC 文件 URL需要按域名或规则决定直连与代理把普通网页地址误填成 PAC 地址
自动发现代理通常不需要手动地址网络管理员明确要求使用自动发现在普通网络中盲目打开,导致代理来源不明确

Apple 将 HTTP、HTTPS 和 SOCKS 作为不同的代理类型分别配置,并分别要求服务器地址和端口;因此端口数字本身不能决定协议。只有拿到协议、服务器地址和端口的完整参数后,才能正确填写。

Monterey 及更早版本:旧版入口

Monterey 及更早版本通常从“系统偏好设置 > 网络”进入,选择 Wi-Fi 或以太网,点按“高级”,再打开“代理”标签。不同小版本的中文菜单可能存在差异,但核心步骤仍是选择网络服务、打开代理页面、填写协议参数并应用。

  1. 选择当前真正连接的网络服务,不要只修改未使用的服务。
  2. 进入“高级 > 代理”,按照参数类型选择 HTTP、HTTPS、SOCKS 或 PAC。
  3. 保存后,用 networksetup 和明确指定代理的 curl 命令检查。
  4. 如果此前使用过代理客户端,确认旧客户端的系统代理开关已经关闭,避免多套配置互相覆盖。

如果设备由公司或学校管理,代理设置可能由设备管理策略统一下发,手动修改后仍可能被覆盖。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 -v

Homebrew 官方文档建议通过 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-proxy

npm 支持 proxy 和 https-proxy配置,也会参考相关环境变量。删除配置前先记录原值;npm 官方文档见npm config 文档。

Docker

docker info | grep -i proxy
[ -f ~/.docker/config.json ] && grep -n 'proxies' ~/.docker/config.json

Docker 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”服务作为唯一判断依据,也不要把一次请求结果推广为全部应用的网络路径。

代理不生效、换网络失效或关闭后无法上网

  1. 先核对参数。确认服务器地址、端口、协议和认证信息,不能只凭端口号判断 HTTP 或 SOCKS。
  2. 确认配置写入当前服务。运行 networksetup -listallnetworkservices,再检查实际使用的 Wi-Fi 或以太网服务。
  3. 确认本地端口正在监听。如果地址是 127.0.0.1,代理客户端必须运行并监听对应端口;客户端退出后,系统代理可能仍然保留旧端口。
  4. 只保留一条测试路径。暂时关闭其他代理客户端、浏览器代理扩展、VPN 或 TUN,避免多个配置互相覆盖。
  5. 检查绕过列表。目标域名可能命中 PAC 或绕过规则,导致测试实际走直连。
  6. 分别检查 DNS、IPv4 和 IPv6。使用 scutil --dns、dig、curl -4和curl -6,不要把所有失败归结为代理服务。
  7. 恢复直连。关闭图形界面代理,清理终端变量、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 系统代理自查卡

  1. 判断流量范围:浏览器、单个应用、终端工具,还是更多协议和应用。
  2. 确认协议:HTTP、HTTPS、SOCKS 或 PAC,不能凭端口猜测。
  3. 确认网络服务:当前是 Wi-Fi、以太网还是其他服务。
  4. 保存配置:填写地址、端口、认证和绕过列表。
  5. 查看状态:使用 networksetup与scutil --proxy确认配置是否写入。
  6. 明确指定代理:HTTP 使用 http://,SOCKS 使用 socks5h://。
  7. 验证业务:分别测试浏览器、目标应用、Git、npm 或 Docker,不把一个工具的结果推广到全部流量。
  8. 恢复直连:关闭系统代理,清理环境变量和工具自身配置,再确认旧端口、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 和网络扩展已经停止。

相关阅读

参考资料

  1. Apple:在 Mac 上更改代理设置
  2. Apple:Safari 在 Mac 上设置代理服务器
  3. Apple Developer:NetworkProxyConfiguration
  4. curl:官方命令行手册(curl.se)
  5. curl:官方教程与代理环境变量(curl.se)
  6. Git:git-config 官方文档(git-scm.com)