macOS SOCKS5 代理设置:系统级、终端和按应用配置
macOS 确实有系统 SOCKS 代理设置,但并非所有应用都会遵循它。以下介绍如何在系统设置和 networksetup 中设置它、让终端和开发者工具走代理,并验证 DNS 和泄漏。
macOS 确实有 SOCKS 代理设置,这让人感觉它像一个系统级开关。实际上,Safari 和部分应用会遵循它,而终端、Homebrew 和许多开发者工具会忽略它。本指南介绍如何在 macOS 上通过系统设置和 networksetup 设置 SOCKS5 代理,然后如何让你实际使用的工具遵循它而不会发生 DNS 泄漏。
macOS 将 SOCKS 代理设置保存在哪里
打开系统设置 > 网络。选择 Wi-Fi 或以太网,点击详细信息,然后点击代理。你会看到 Web 代理 (HTTP)、安全 Web 代理 (HTTPS)、SOCKS 代理等复选框。SOCKS 代理部分要求填写服务器和端口。它不提供协议版本下拉菜单。如需严格控制,请在应用支持时,用 socks5h 配置各个应用。
从系统设置设置 macOS SOCKS 代理
- 打开系统设置 > 网络。
- 选择当前活跃的网络服务,例如 Wi-Fi。
- 点击详细信息 > 代理。
- 启用 SOCKS 代理。
- 输入服务器地址和端口。
- 添加你需要的任何绕过域名,例如本地资源。
- 点击好并应用。
请记住,此设置会影响遵循 macOS 系统代理的应用。它并不保证每个应用的每个连接都通过代理。
使用 networksetup 从终端设置
networksetup 对脚本、远程支持和快速更改很有用。
# 列出网络服务
networksetup -listallnetworkservices
# 为 Wi-Fi 设置 SOCKS 代理
networksetup -setsocksfirewallproxy 'Wi-Fi' 127.0.0.1 1080
# 开启
networksetup -setsocksfirewallproxystate 'Wi-Fi' on
# 检查当前设置
networksetup -getsocksfirewallproxy 'Wi-Fi'
# 关闭
networksetup -setsocksfirewallproxystate 'Wi-Fi' off
你也可以设置绕过域名:
networksetup -setproxybypassdomains 'Wi-Fi' '*.local' '169.254/16' 'localhost'
在网络服务名称两侧使用引号,尤其是名称包含空格时。
让终端和开发者工具使用 SOCKS5
终端会话通常不会继承 macOS SOCKS 代理设置。为当前 shell 设置环境变量:
export ALL_PROXY=socks5h://127.0.0.1:1080
export all_proxy=socks5h://127.0.0.1:1080
一些工具使用 HTTP_PROXY 和 HTTPS_PROXY。注意:并非每个工具都能理解这些变量中的 socks5h:// 值。如果某个工具有专用的 SOCKS 标志,请改用该标志。
curl
curl --socks5-hostname 127.0.0.1:1080 https://api.ipify.org
git
git config --global http.proxy socks5h://127.0.0.1:1080
git config --global https.proxy socks5h://127.0.0.1:1080
# 稍后移除
git config --global --unset http.proxy
git config --global --unset https.proxy
Python
import requests
proxies = {
'http': 'socks5h://127.0.0.1:1080',
'https': 'socks5h://127.0.0.1:1080',
}
print(requests.get('https://api.ipify.org?format=json', proxies=proxies, timeout=10).json())
浏览器说明:Safari、Chrome 和 Firefox
- Safari 通常会遵循 macOS 系统代理。
- macOS 上的 Chrome 通常使用系统代理设置,除非启动时带有明确的代理标志。
- Firefox 有自己的网络设置。如果它设置为使用系统代理设置,它应该会遵循 macOS。如果你需要远程 DNS,请将 Firefox 设置为手动代理配置,并启用使用 SOCKS v5 时代理 DNS。
更改浏览器设置后,请在隐私窗口中测试,以免缓存的连接误导你。
验证代理并发现 DNS 泄漏
检查系统代理配置:
scutil --proxy
检查出口 IP:
curl --socks5-hostname 127.0.0.1:1080 https://api.ipify.org
然后与 DNS 泄漏测试进行对比。关键区别在于 socks5 与 socks5h:socks5 可能在本地解析 DNS,而 socks5h 会将主机名发送给代理解析。如果地理定位很重要,远程 DNS 通常是你需要的。
关闭它并避免常见陷阱
- 不再需要时禁用代理;否则强制门户和本地设备可能会失败。
- 检查与 VPN 客户端和其他网络扩展的冲突。
- 请记住,系统代理设置并不覆盖所有应用。
- 如果代理运行在另一台机器上,不要使用
127.0.0.1。 - 验证你真正关心的应用,而不仅仅是终端。
总结
macOS 为你提供了一个真正的系统 SOCKS 代理复选框,但它并非通用解决方案。对于遵循系统代理的应用,使用系统设置或 networksetup,然后直接用 socks5h 配置终端和开发者工具,并验证 DNS 行为。