macOS 代理设置:通过系统设置和终端配置代理,避免流量绕过例外列表
简介:你将获得什么
如果你在 Mac 上使用移动代理,迟早会遇到同样的情况。你把地址和端口填进 Wi-Fi 设置,网站显示了新 IP,你很高兴。然后发现终端在直接下载包,git 还在走旧地址,一半的应用根本没注意到变化。本指南将彻底解决这个问题。
读完并完成所有步骤后,你将获得一个在三个层面同时生效的 macOS 代理:
- 系统层面:Safari、Chrome、邮件、即时通讯软件以及其他遵循系统设置的程序。
- 终端层面:使用 networksetup 命令无需点击鼠标即可开启、关闭和切换代理。
- 开发工具层面:curl、git、Homebrew、pip、npm 以及其他读取环境变量而非系统设置的实用工具。
我们将单独讲解例外列表。正是这个字段导致部分流量绕过代理,尽管你没有做任何特殊设置。你将了解它的运作方式、该添加什么、该删除什么,以及如何验证没有请求在不该直连的地方悄悄绕过代理。
本指南适合谁
本教程面向初学者。如果你从未打开过终端,没关系:我们会逐字拆解每条命令并解释其作用。本指南对以下人群有帮助:
- 需要从不同 IP 运营多个项目的营销人员和社交媒体专员;
- 需要快速切换地区并测试创意素材的投放人员;
- 通过移动代理测试应用和 API 的开发者;
- 希望一次搞定、不用每次换代理都找专家的企业主。
对于有经验的用户,文末有进阶技巧部分:网络位置、PAC 文件、shell 别名和自动轮换脚本。
需要提前了解什么
没什么复杂的。会打开系统设置和复制文本就够了。其余内容会逐步讲解。我们不涉及具体浏览器和指纹浏览器的设置:博客中有专门的文章介绍。这里只讲 macOS 系统及其内置工具。
需要多长时间
通过系统设置进行基础配置需要 10 分钟。配置终端和开发工具再需 15-20 分钟。完整验证和例外列表分析约 10 分钟。如果从容操作并逐步验证,总共 30-40 分钟。
准备工作
在更改系统任何设置之前,先收集所有必要信息。良好的准备比任何技巧都更省时间。
你需要什么
- 一台 macOS Ventura 13 或更新版本的 Mac。 所有示例已在 macOS Sonoma 14、Sequoia 15 和 Tahoe 26 上验证。在旧版本中,系统设置以图标网格形式呈现,代理路径略有不同,我们会单独说明差异。
- 移动代理数据。 包括服务器地址(域名或 IP)、端口、用户名和密码。移动代理通常有两个端口:一个用于 HTTP 协议,另一个用于 SOCKS5。请将两个都准备好。
- 更换 IP 的链接(如果你的服务商提供)。在自动化部分会用到。
- Mac 的管理员权限。 通过终端更改系统代理时,macOS 会要求输入用户密码。
- 文本编辑器用于记录。系统自带的 TextEdit 或备忘录即可。
开始前需要检查什么
- 确保不用代理时网络正常。在 Safari 中打开任意网站。如果打不开,先解决网络问题,否则之后分不清是哪里出了问题。
- 确认你通过哪个接口连接:Wi-Fi 还是以太网线。打开系统设置,进入网络。活动连接会标有绿点和"已连接"字样。记下名称:通常是 Wi-Fi 或 Ethernet。
- 检查不使用代理时的当前 IP。在浏览器中打开任意 IP 查询服务并记下地址。稍后用它来对比结果。
备份当前设置
macOS 的代理设置很容易恢复,但最好先记录初始状态。尤其是在公司 Mac 上,系统管理员可能已经预先做了设置。
- 打开终端。按 Command 加空格,输入"终端"然后按 Enter。
- 复制并粘贴以下命令,然后按 Enter:
scutil --proxy > ~/Desktop/proxy_backup.txt桌面上会出现一个 proxy_backup.txt 文件,包含当前代理设置的完整描述。如果搞砸了什么,随时可以对照这个文件检查数值。
建议: 立即在备忘录中创建一张代理数据卡片:主机、HTTP 端口、SOCKS5 端口、用户名、密码、轮换链接。你会反复查看它几十次。不要将密码以明文形式存放在共享文档中。
基础概念:开始前需要理解的内容
这里有几个术语,不理解的话后续步骤会变成魔法。必须阅读,即使你觉得已经知道了。
代理服务器
它是你的 Mac 和互联网之间的中介。你的请求不会直接发往网站,而是先发送到代理服务器,再从那里转发到网站。网站看到的是代理的 IP 地址,而不是你的。移动代理的不同之处在于,它的 IP 属于移动运营商,对网站来说你看起来就像普通智能手机用户。
HTTP 代理和 SOCKS5 代理
这是与代理服务器通信的两种不同方式。HTTP 代理理解网页流量,适用于网站和大多数应用。在 macOS 中它分为两个开关:网页代理(HTTP)用于普通网站,安全网页代理(HTTPS)用于加密网站。实际操作中两个字段填入相同的主机和端口。
SOCKS5 代理工作在网络连接层面,可以传输任何流量,不仅限于网页。它对终端、即时通讯软件和游戏很有用。macOS 的一个重要细节:系统设置允许为 SOCKS 指定用户名和密码,但许多应用不支持通过系统 SOCKS 进行认证。因此系统设置中我们使用 HTTP,而将 SOCKS5 留给终端和单独的程序。
系统代理
这是 macOS 为特定网络接口存储的设置。Safari、Chrome、Mail、App Store 以及大多数基于 Swift 和 Objective-C 的应用会自动读取它们。但并非全部。用 Python、Go、Node.js 编写的程序,以及 curl 和 git 等经典 Unix 工具会忽略系统设置。它们读取的是环境变量。
环境变量
这是存在于终端会话中的命名值。例如,变量 http_proxy 告诉工具:所有 HTTP 流量都发送到这里。变量只存在于当前打开的终端窗口中,除非写入 shell 配置文件。这会有单独的步骤讲解。
例外列表
在 macOS 中它被称为"以下主机和域不使用代理"。该列表中的所有地址系统都会直接发送,绕过代理。默认已经有 *.local 和 169.254/16 两条记录,它们负责本地网络,不应删除。问题始于列表中出现了多余的掩码,或者你期望例外在终端中也生效。不会生效:终端有自己的列表,即变量 no_proxy。这些我们都会讲解。
网络服务
这是 macOS 对每个接口的称呼:Wi-Fi、Ethernet、Thunderbolt Bridge、iPhone USB。代理是为每个服务单独设置的。 如果你配置了 Wi-Fi,然后插了网线,代理就会失效。这是"为什么 macOS 代理时好时坏"这个问题最常见的原因之一。
第 1 步:在配置系统前验证代理数据
本阶段目标: 确认代理可用,用户名和密码正确。这可以避免在设置中找了半小时错误后,发现问题出在密码拼写错误上。
我们通过 curl 来验证。这个工具 macOS 自带,无需安装任何东西。
- 如果终端还没打开,先打开它。
- 从你的卡片中取出代理数据。示例中我们使用假想值:主机 proxy.example.net,HTTP 端口 10000,SOCKS5 端口 10001,用户名 user123,密码 pass456。请替换为你自己的真实数据。
- 输入以下命令验证 HTTP 端口并按 Enter:
curl -x http://user123:pass456@proxy.example.net:10000 https://ifconfig.me解释一下这条命令。参数 -x 告诉 curl 代理地址。接着是协议 http,然后是用户名、冒号、密码、@ 符号、主机、冒号、端口。最后是返回请求来源 IP 的服务地址。
- 1-3 秒后终端会显示一个 IP 地址。这就是你移动代理的 IP。如果与你准备阶段记录的不同,说明一切正常。
- 现在用同样的命令测试 SOCKS5 端口,替换协议和端口:
curl -x socks5h://user123:pass456@proxy.example.net:10001 https://ifconfig.me注意 socks5h 中的字母 h。它表示域名将在代理端解析,而不是在你的 Mac 上。对于移动代理这是正确的选择:这样你不会向家庭运营商的 DNS 泄露请求。
注意: 如果密码中包含 @、冒号、斜杠、井号、问号或百分号,需要进行编码。@ 替换为 %40,冒号替换为 %3A,井号替换为 %23,问号替换为 %3F,百分号替换为 %25。否则 curl 会错误地分割字符串,认为密码提前结束了。
此步骤可能遇到的问题
- 返回 Received HTTP code 407 from proxy after CONNECT。 代理拒绝了认证。检查用户名和密码,注意特殊字符。确认服务商后台没有启用 IP 白名单认证而非用户名密码认证。
- 返回 Failed to connect 或 Connection timed out。 主机或端口错误,或者代理已关闭。对照后台确认。尝试另一个端口。
- 命令卡住无输出。 等待 30 秒。移动网络有时很慢。如果什么都没发生,按 Control 加 C 中断,然后检查数据。
验证: 两条 curl 命令都返回了与你家庭 IP 不同的地址。可以继续了。如果有一条不成功,继续下去也没有意义:系统会使用同样的数据。
第 2 步:通过 macOS 系统设置配置代理
本阶段目标: 让 Safari、Chrome 以及所有遵循系统代理的应用通过你的移动代理上网。
打开所需界面
- 点击屏幕左上角的 Apple 图标,选择"系统设置"。
- 如果你通过无线网络连接,在左栏点击 Wi-Fi。如果通过网线,点击"网络",然后点击 Ethernet。
- 找到你的网络名称。右侧有一个"详细信息"按钮(带三个点或文字)。点击它。
- 会打开连接参数窗口。在左栏中选择"代理"。它位于列表最底部,在 TCP/IP、DNS 和 WINS 之后。
你会看到一系列开关:自动发现代理、自动代理配置、网页代理(HTTP)、安全网页代理(HTTPS)、FTP 代理、SOCKS 代理、流代理(RTSP)、Gopher 代理。底部是"以下主机和域不使用代理"字段。
如果你的 macOS 较旧,系统设置以图标网格形式呈现,路径如下:系统设置、网络、在左侧选择接口、点击"高级"按钮、选择"代理"标签页。之后都一样。
启用 HTTP 代理
- 点击"网页代理(HTTP)"开关。它会变成蓝色,下方出现输入字段。
- 在"服务器"字段输入代理主机,例如 proxy.example.net。不要加 http://,不要加斜杠,只填主机。
- 在右侧"端口"字段输入 HTTP 端口,例如 10000。
- 打开"代理服务器需要密码"开关。
- 在"用户名"字段输入用户名。在"密码"字段输入密码。这里不需要编码特殊字符,直接输入即可。
启用 HTTPS 代理
如今大多数网站使用 HTTPS,所以这一步必不可少。没有它,加密流量会直接发送,你会困惑为什么有些网站看到代理,有些看到你的真实 IP。
- 点击"安全网页代理(HTTPS)"开关。
- 输入与 HTTP 相同的主机和端口。移动代理在同一端口处理两种流量。
- 打开"代理服务器需要密码",再次输入用户名和密码。
关于 SOCKS 代理和其他开关
如果已启用 HTTP 和 HTTPS,系统设置中的 SOCKS 代理开关保持关闭。原因是启用系统 SOCKS 后,某些应用会优先使用它,但并非所有应用都支持通过系统 SOCKS 认证。结果:部分程序失去网络访问。FTP、RTSP 和 Gopher 不用管,这些都是过时的协议。自动发现和自动配置也保持关闭,否则它们可能覆盖你的手动设置。
保存
- 点击右下角的"好"按钮。
- 如果系统要求输入 Mac 用户密码,请输入。这是正常的:更改网络设置需要管理员权限。
- 完全关闭 Safari 或 Chrome 后重新打开。浏览器在启动时会缓存代理设置。
建议: 首次通过代理发送请求时,macOS 可能会弹出系统窗口要求输入代理的用户名和密码,即使你已经填过了。输入数据并勾选"记住"保存到钥匙串。之后这个窗口不会再出现。
验证: 在 Safari 中打开 IP 查询服务。地址应与第 1 步 curl 命令返回的相符。再检查一下运营商识别页面:应显示移动运营商,而不是你的家庭宽带运营商。
可能遇到的问题
- 网站完全打不开。 检查你启用的是 HTTP 和 HTTPS,而不是 FTP 或 SOCKS。检查端口。临时关闭两个开关,确认网络恢复了:这样你就知道问题在代理设置而非网络。
- 不断弹出密码输入窗口。 密码输入有误或复制后末尾带了空格。清空字段内容,手动重新输入密码。
- IP 没有变化。 可能配置了错误的接口。回到"网络"部分,检查哪个服务被标记为"已连接"。
第 3 步:正确配置例外列表
本阶段目标: 理解哪些流量被系统绕过代理,并配置列表使本地服务正常运作、外部流量不泄露。
"以下主机和域不使用代理"字段位于代理界面底部。默认内容为:*.local, 169.254/16。很多用户要么完全不看它,要么开始往里面乱填。
如何理解列表
- *.local 表示所有以 .local 结尾的地址。这些是你家庭网络中的设备:打印机、网络硬盘、其他 Mac。它们物理上无法通过外部代理访问,所以这条记录是必要的。
- 169.254/16 表示 Mac 在未从路由器获得地址时给自己分配的服务地址范围。同样是本地用途。
- 记录之间用逗号分隔。逗号后的空格是允许的。
- 星号替换名称中的任意部分。记录 *.example.com 会排除 example.com 的所有子域名,但不包括 example.com 本身。后者需要单独一条记录。
- 可以指定 IP 地址和子网,格式为 地址/掩码,例如 192.168.0.0/16 表示整个家庭网络。
应该添加什么
- 在例外字段中最后一条记录后点击。
- 用逗号分隔添加 localhost 和 127.0.0.1。没有它们,你 Mac 上的本地 Web 服务器和管理面板会尝试走移动代理然后失败。
- 如果你通过 IP 使用家庭设备,添加你的本地子网。通常是 192.168.0.0/16 或 10.0.0.0/8。可以在同一窗口的 TCP/IP 界面查看本地地址。
- 点击"好"。
对大多数用户来说,最终列表如下:*.local, 169.254/16, localhost, 127.0.0.1, 192.168.0.0/16。
不应该添加什么
这里就涉及标题中所说的"绕过例外"问题。指的是流量绕过代理并非因为你的本意,而是因为列表配置不当。
- 不要填入单独的星号或 *.com。 这种掩码会几乎对整个互联网禁用代理,而开关仍然是蓝色的,你会以为一切正常。
- 不要填入你工作所用服务的域名。 如果你添加 *.facebook.com 来加速加载,网站会看到你的真实 IP。对于多账号运营任务来说这是致命的。
- 不要填入代理本身的主机。 这没有意义:与代理的连接本来就是直连的。
- 不要删除 *.local 和 169.254/16。 会导致 AirDrop、打印、路由器访问失效。
注意: 系统设置中的例外列表只对使用系统代理的应用生效。终端、curl、git 和 Python 脚本看不到它。它们有自己的列表,即变量 no_proxy,需要单独配置。我们会在第 5 步讲到。如果你期望系统列表中的记录会影响脚本,你会失望的。
建议: 定期打开例外列表用眼睛检查。某些企业工具和设备管理代理在安装时会写入自己的域名。发现一条 *.com 这样的多余掩码只需十秒钟,比花一周找 IP 泄露原因容易得多。
验证: 在浏览器中打开 http://localhost 或任何你有的本地页面。它应该瞬间打开而不出现代理错误。然后打开外部 IP 查询服务:仍应显示移动代理的 IP。
第 4 步:通过终端 networksetup 命令管理代理
本阶段目标: 学会用一条命令开启、关闭和更改系统代理,无需鼠标和十次点击设置。这项技能一个月内就能收回阅读本节所花的时间。
macOS 内置了 networksetup 工具。它做的事与系统设置完全相同,只是从命令行操作。你在第 2 步配置的所有内容,都可以用一行命令重复、修改或取消。
查明网络服务的准确名称
- 在终端输入以下命令并按 Enter:
networksetup -listallnetworkservices你会看到类似列表:Wi-Fi, Ethernet, Thunderbolt Bridge, iPhone USB。找到你正在使用的那个。后续命令中我们使用 Wi-Fi。如果你的服务名称不同,请替换。 如果名称中有空格,例如 Thunderbolt Bridge,请用双引号括起来。
查看当前设置
networksetup -getwebproxy Wi-Fi响应会显示四行:Enabled: Yes 或 No、Server、Port、Authenticated Proxy Enabled。如果你完成了第 2 步,Enabled 会是 Yes,服务器和端口会与输入的一致。HTTPS 同理:
networksetup -getsecurewebproxy Wi-Fi用一条命令启用 HTTP 和 HTTPS 代理
命令格式:networksetup,操作,服务,主机,端口,启用认证,用户名,密码。
networksetup -setwebproxy Wi-Fi proxy.example.net 10000 on user123 pass456networksetup -setsecurewebproxy Wi-Fi proxy.example.net 10000 on user123 pass456依次输入两条命令。每条执行后系统可能要求输入 Mac 用户密码。输入密码,字符不会显示,这是正常的。按 Enter。
端口后的 on 启用认证。如果你的代理使用 IP 认证而非用户名密码,写 off 并且不指定用户名和密码。
不丢失设置的情况下关闭和开启代理
最实用的一对命令。它们不会清除主机和端口,只移动开关:
networksetup -setwebproxystate Wi-Fi offnetworksetup -setsecurewebproxystate Wi-Fi off要重新开启,将 off 替换为 on。这样两秒钟就能把 Mac 切换到直连模式再切回来。
从终端管理例外列表
查看当前列表:
networksetup -getproxybypassdomains Wi-Fi设置完整的新列表。该命令会替换所有记录,所以要用空格列出完整集合:
networksetup -setproxybypassdomains Wi-Fi "*.local" "169.254/16" localhost 127.0.0.1 "192.168.0.0/16"带星号和斜杠的记录用引号括起来,以免 shell 尝试解释它们。用 Empty 代替域名可以完全清空列表,但请记住:那样本地地址会走代理然后失效。
通用查看命令
scutil 工具可以在一处显示所有代理设置,包括例外:
scutil --proxy查找 HTTPEnable、HTTPProxy、HTTPPort、HTTPSEnable、ExceptionsList 这些行。值为 1 表示启用,0 表示关闭。这正是我们用来做备份的命令。
建议: 打开系统设置的代理界面,在旁边终端中执行任意 networksetup 命令。你会看到开关实时变化。这是确认终端和图形界面控制同一份数据的最佳方式。
可能遇到的问题
- 错误:Wi-Fi is not a recognized network service。 服务名称不同。执行 networksetup -listallnetworkservices 并复制准确的名称。
- 命令执行了,但设置中没有变化。 关闭并重新打开系统设置窗口,它不总是立即刷新。
- 要求输入密码并提示 Sorry, try again。 输入的是 Mac 用户密码,不是代理密码。字符不显示,直接输入并按 Enter。
验证: 执行 networksetup -setwebproxystate Wi-Fi off,在浏览器中刷新 IP 查询服务,会看到你的家庭 IP。执行同样的命令加 on,刷新页面,会看到代理 IP。如果双向切换都有效,本阶段完成。
第 5 步:为 curl、git、Homebrew、pip 和 npm 配置代理
本阶段目标: 让命令行工具通过代理工作。这里泄露的流量最多,因为这些程序不查看系统设置。
为什么系统代理在这里不生效
curl、wget、git、pip、npm、brew 等工具是为在所有 Unix 系统上运行而编写的。它们不知道 macOS 及其系统设置。它们读取的是名为 http_proxy、https_proxy、all_proxy 和 no_proxy 的 环境变量。如果没有变量,流量直接发送。设置中的开关蓝色多久都没用。
在当前终端窗口中临时启用
依次输入三条命令:
export http_proxy=http://user123:pass456@proxy.example.net:10000export https_proxy=http://user123:pass456@proxy.example.net:10000export no_proxy=localhost,127.0.0.1,*.local第一条将 HTTP 流量导向代理。第二条将 HTTPS 流量导向同一处。注意:https_proxy 的值中协议仍然是 http,因为这是与代理通信的协议,不是与网站通信的协议。第三条设置终端的例外。这就是我们在第 3 步提到的那个单独列表。
某些程序只读取大写变量。为了不用猜测,也设置它们:
export HTTP_PROXY=$http_proxy HTTPS_PROXY=$https_proxy NO_PROXY=$no_proxy现在不带 -x 参数测试:
curl https://ifconfig.me如果返回代理 IP,说明变量生效了。从这个终端窗口启动的所有程序现在都会走移动代理。关闭窗口,变量就消失。
通过 shell 配置文件永久启用
在现代 macOS 中,默认 shell 是 zsh,其设置存储在用户主目录的 .zshrc 文件中。里面写的内容会在每次打开新终端窗口时执行。
- 用 nano 编辑器打开文件:
nano ~/.zshrc- 用方向键移动到文件末尾。
- 粘贴上一节的 export 行。
- 按 Control 加 O,然后按 Enter 保存。按 Control 加 X 退出。
- 无需重启即可应用更改:
source ~/.zshrc注意: 在 .zshrc 中密码以明文存储。如果 Mac 是共用的,或者你把文件放在云同步中,请三思。进阶设置部分描述了一个折中方案:用别名通过短命令启用代理,而不是自动启用。
Git
Git 能读取环境变量,但更可靠的方法是在其配置中设置:
git config --global http.proxy http://user123:pass456@proxy.example.net:10000禁用:
git config --global --unset http.proxy此设置影响通过 HTTPS 的 clone、pull、push 操作。通过 SSH 访问仓库需要另一种方法,在进阶部分讲解。
Homebrew
Brew 完全依赖环境变量。如果你已在 .zshrc 中设置了它们,无需额外操作。用 brew update 命令验证:更新应无连接错误完成。
pip
Python 安装器也读取环境变量。如果不想设置变量,可以用参数一次性通过代理运行:
pip install --proxy http://user123:pass456@proxy.example.net:10000 requestsnpm
Node.js 包管理器单独存储设置:
npm config set proxy http://user123:pass456@proxy.example.net:10000npm config set https-proxy http://user123:pass456@proxy.example.net:10000禁用:npm config delete proxy 和 npm config delete https-proxy。
终端的 SOCKS5
如果你想让终端流量走 SOCKS5 端口,不要设置 http_proxy 和 https_proxy,而是设置一个变量:
export all_proxy=socks5h://user123:pass456@proxy.example.net:10001Curl 和许多工具都能识别它。但并非全部:git 通过 HTTPS 不总是读取 all_proxy 变量,pip 不理解 SOCKS 除非安装额外包。为了通用性,我们建议初学者使用 HTTP 方案。
建议: 在 .zshrc 中添加一行 alias myip='curl -s https://ifconfig.me; echo',之后输入 myip 就能一秒看到终端的当前 IP。这每天能省下几十次检查。
验证: 打开新的终端窗口。执行 curl https://ifconfig.me 和 git config --global --get http.proxy。第一条命令返回代理 IP,第二条显示代理地址。说明工具已配置好且设置能跨重启保持。
第 6 步:找出绕过代理的流量并修复
本阶段目标: 确保你工作组合中的任何应用都不会在你不知情的情况下直接访问互联网。这里我们系统化所有泄露原因并逐一检查。
原因 1:应用有自己的代理设置
有些程序忽略系统代理和环境变量,因为它们有自己的设置。典型例子:Telegram Desktop、Firefox、Discord、某些邮件客户端、种子下载客户端、指纹浏览器。它们每个的设置中都有"网络"或"代理"部分。
- 列出你工作使用的应用。
- 打开每个应用,找到网络设置部分。如果有"使用系统代理设置"选项,选择它。如果只有手动输入,填入主机、端口、用户名和密码。
- 如果应用允许,在应用内检查 IP,或者在该应用中打开 IP 查询服务。
具体浏览器和指纹浏览器的设置博客中有单独文章,这里不重复。重要的是理解原则:每个应用都需要检查它从哪里获取代理。
原因 2:应用不是从终端启动的
.zshrc 中的环境变量只对从终端启动的程序生效。如果你双击运行脚本、通过代码编辑器或计划任务运行,变量不会被加载。解决方案:在脚本内显式设置代理,或从终端运行脚本,或在代码编辑器设置中指定变量。
原因 3:网络服务错误
你配置了 Wi-Fi,但 Mac 通过网线连接了,因为你插了扩展坞。或者反过来。检查很简单:networksetup -listallnetworkservices 会显示所有服务,设置中的"网络"部分会高亮活动连接。为你使用的每个服务配置代理。第 4 步的 networksetup 命令需要用 Ethernet 替换 Wi-Fi 再执行一遍。
原因 4:例外列表中有多余掩码
我们在第 3 步讲过。执行 networksetup -getproxybypassdomains Wi-Fi 确认没有单独的星号、*.com、*.ru、*.net 这样的掩码以及工作服务的域名。用 echo $no_proxy 命令检查 no_proxy 变量中是否有同样的问题。
原因 5:IPv6
如果你的家庭宽带运营商分配了 IPv6 地址,而代理使用 IPv4,某些应用可能尝试通过 IPv6 直连。对于系统应用这很少见,但工具中可能出现。检查 IP 查询服务不显示带冒号的长地址。如果显示了,打开服务设置的 TCP/IP 标签页,将"配置 IPv6"切换为"仅本地连接"。
原因 6:HTTPS 启用了但 HTTP 没有,或者反过来
在系统设置中这是两个独立的开关。忘了一个,一半的流量就会泄露。执行 scutil --proxy 确认 HTTPEnable 和 HTTPSEnable 都等于 1。
原因 7:浏览器缓存和打开的连接
在更改设置之前启动的浏览器可能会保持旧连接几分钟。通过 Command 加 Q 完全关闭应用,而不是点叉,然后重新打开。
建议: 给自己安排一次控制性巡检。在 Safari、Chrome、终端 curl 以及每个工作应用内打开 IP 查询服务。将四个结果并排记录。如果全部与移动代理 IP 一致,就没有泄露。每次更换代理或系统更新后都重复这个巡检。
验证: 上述所有控制点显示同一个移动代理 IP。本地地址直接打开。没有任何开关被意外关闭。
结果验证:最终检查清单
逐项检查并勾选。如果有未完成的,回到对应步骤。
系统层面
- 系统设置的代理界面中网页代理(HTTP)和安全网页代理(HTTPS)均已启用,使用相同的主机和端口。
- 认证已启用,用户名和密码已保存,密码输入窗口不再出现。
- Safari 显示移动代理 IP 和移动运营商。
- 例外列表包含 *.local、169.254/16、localhost、127.0.0.1 和你的本地子网。没有多余掩码。
- 本地地址无错误打开。
终端
- networksetup -getwebproxy Wi-Fi 命令显示 Enabled: Yes 和正确服务器。
- 通过 networksetup 开启和关闭的命令双向有效。
- 在新终端窗口中 echo $http_proxy 输出代理地址。
- 不带 -x 参数的 curl https://ifconfig.me 返回代理 IP。
- echo $no_proxy 显示本地例外列表。
工具
- git config --global --get http.proxy 返回代理地址。
- brew update 无连接错误完成。
- 如果你使用 Node.js,npm config get proxy 返回代理地址。
- 所有有自己网络设置的工作应用都已切换到系统代理或手动配置。
如何整体测试
- 用 networksetup -setwebproxystate Wi-Fi off 和 networksetup -setsecurewebproxystate Wi-Fi off 关闭系统代理。
- 在浏览器中刷新 IP 查询服务。应显示家庭 IP。
- 在终端执行 curl https://ifconfig.me。应仍然是代理 IP,因为终端使用变量而非系统设置。这证实各层面是独立的。
- 重新开启系统代理。刷新浏览器。应恢复代理 IP。
- 打开新终端窗口,执行 unset http_proxy https_proxy 然后再次 curl。现在终端会显示家庭 IP。关闭窗口:下一个窗口会从 .zshrc 重新加载变量。
如果每次切换都产生了预期结果,你就完全掌控了 macOS 上所有层面的代理。这就是目标。
常见错误与解决方案
代理已启用但 IP 不变
原因: 配置了错误的网络接口,或 HTTP 和 HTTPS 只启用了一个,或浏览器没有重启。
解决方案: 在网络部分检查活动服务,执行 scutil --proxy 确认两个 Enable 都等于 1,通过 Command 加 Q 完全关闭浏览器。
不断弹出代理密码输入窗口
原因: 用户名或密码错误,粘贴后多了空格,或钥匙串中保存了之前代理的旧数据。
解决方案: 清空字段内容手动重新输入。打开"钥匙串访问"应用,找到带代理主机的记录并删除,然后重新输入数据并勾选"记住"。
部分网站走代理,部分直连
原因: 只启用了 HTTP 或只启用了 HTTPS,或例外列表中出现了一个宽泛掩码。
解决方案: 启用两个开关。用 networksetup -getproxybypassdomains 命令检查例外列表并删除所有与本地网络无关的内容。
终端忽略代理,尽管系统已配置
原因: 命令行工具不读取系统设置。环境变量未设置或在另一个窗口中设置。
解决方案: 在 .zshrc 中写入 export 行并执行 source ~/.zshrc。检查 echo $http_proxy。
错误 407 Proxy Authentication Required
原因: 代理不接受用户名和密码。通常是密码中特殊字符在 URL 字符串中的问题。
解决方案: 编码特殊字符:@ 改为 %40,冒号改为 %3A,井号改为 %23。确认服务商后台没有启用 IP 认证。
本地服务、打印机或路由器失效
原因: 例外列表中的 *.local 和 169.254/16 被删除,或没有添加 localhost 和本地子网。
解决方案: 用 networksetup -setproxybypassdomains 命令恢复列表,包含第 3 步中的完整记录集。
Mac 重启后终端中的代理消失了
原因: 变量只通过打开窗口中的 export 设置,没有写入 .zshrc。
解决方案: 打开 nano ~/.zshrc,添加行并保存。如果你用其他 shell,例如 bash,文件名为 .bash_profile。
一直正常,macOS 更新后坏了
原因: 大型系统更新有时会重置网络服务设置或重命名服务。
解决方案: 打开桌面上的 proxy_backup.txt 文件,对照数值并用 networksetup 命令重复第 4 步。检查服务列表:可能出现了新的服务。
页面加载缓慢
原因: 这是移动代理的正常表现,移动网络比家庭宽带慢。但有时原因是同时启用了 HTTP 代理和 SOCKS,应用尝试双重建立连接。
解决方案: 关闭系统 SOCKS,只保留 HTTP 和 HTTPS。如果速度仍然低,尝试通过轮换链接更换 IP。
进阶用户的额外功能
基础设置已完成。接下来是一些将手动操作变成便捷系统的技巧。
网络位置:两个配置文件,一次切换
macOS 允许创建多套网络设置并整体切换。这比每次移动开关更方便。
- 打开系统设置,进入"网络"部分。
- 点击服务列表底部的三点按钮,选择"位置",然后选择"编辑位置"。
- 点击加号,将新位置命名为"代理"。点击"完成"。
- 在列表中选择创建的位置。为 Wi-Fi 和 Ethernet 配置代理,如第 2 步所述。
- 原始位置"自动"保持无代理。
现在可以通过 Apple 菜单的"位置"项切换,或用终端命令:
networksetup -switchtolocation Прокси切回:networksetup -switchtolocation Автоматически。所有服务同时切换,不会出现接口错误。
终端快速启用和禁用的别名
如果不想让代理一直开着,在 .zshrc 中添加两个函数代替直接 export:
proxyon() { export http_proxy=http://user123:pass456@proxy.example.net:10000; export https_proxy=$http_proxy; export no_proxy=localhost,127.0.0.1,*.local; echo Proxy ON; }proxyoff() { unset http_proxy https_proxy all_proxy no_proxy HTTP_PROXY HTTPS_PROXY; echo Proxy OFF; }执行 source ~/.zshrc 后,proxyon 命令在当前窗口启用代理,proxyoff 禁用。密码仍在文件中,但代理不会在你未决定的情况下自动激活。
系统和终端统一命令
扩展 proxyon 函数,加入 networksetup -setwebproxystate Wi-Fi on 和 networksetup -setsecurewebproxystate Wi-Fi on 行。这样一条命令就能同时为浏览器和终端启用代理。在 proxyoff 中加入相同命令加 off。系统每个会话会要求一次管理员密码。
从终端更换移动代理 IP
大多数移动代理服务商提供更换 IP 的链接。可以通过 curl 调用而无需打开浏览器:
curl -s "https://адрес-ротации-из-личного-кабинета"把它包装成 newip 函数并添加到 .zshrc。newip 加 myip 的组合能在两秒内显示新地址。对于每天进行几十次检查的投放人员来说,这能显著节省时间。
通过 SOCKS5 代理使用 SSH
如果你通过 SSH 连接服务器并希望连接走移动代理,在 ~/.ssh/config 文件中添加块:
Host myserver HostName 203.0.113.10 ProxyCommand nc -X 5 -x proxy.example.net:10001 %h %pnc 工具内置于 macOS。-X 5 参数表示 SOCKS5,-x 参数指定代理地址。nc 不支持用户名密码认证,所以这种方法适用于 IP 认证的代理。
PAC 文件实现灵活规则
自动代理配置开关接受 PAC 文件地址:一个 JavaScript 脚本,为每个地址决定走代理还是直连。这是实现无法用掩码表达的复杂例外的方法。文件可以存储在本地并指定为 file:/