如何在 Android 上使用代理(以及为什么 Wi-Fi 代理设置只提供 HTTP 而不提供 SOCKS5)
Android 内置的 Wi-Fi 代理对话框没有协议选项,因为它仅支持 HTTP。以下说明这对 SOCKS5 意味着什么、为什么有些应用会忽略该设置,以及在 Android 上让流量走代理的实用方法。
在 Android 上长按你的 Wi-Fi 网络,点按 修改网络,展开 高级选项,将 代理 设为 手动,然后你会看到主机名字段、端口字段和一个绕过列表。就这些。没有协议下拉菜单,没有 SOCKS5 选项,也没有身份验证提示。
如果你一直在搜索如何在 Android 上使用代理,并想知道为什么 SOCKS5 从未出现,原因就在这里:Android 内置的 Wi-Fi 代理设置是 HTTP 代理,而不是通用 SOCKS5 客户端。
Android 内置代理设置实际支持什么
- 仅支持 HTTP 和 HTTPS。 HTTPS 流量通过 HTTP
CONNECT请求进行隧道传输,这就是为什么即使代理本身是 HTTP,HTTPS 网站也能正常工作。 - 不支持 SOCKS4、SOCKS5 或 SOCKS5h。 根本没有对应字段。
- 不支持 UDP。 任何基于 UDP 的流量——QUIC、游戏流量、同一路径上的 DNS——都不会通过它传输。
- 按网络生效。 该设置会随你编辑的 Wi-Fi 网络一起保存,因此当你切换网络或使用移动数据时不会生效。
- 仅建议,非强制。 Android 会将代理配置交给应用,但应用可以自由忽略它。
最后一点最让人意外。浏览器通常会遵循系统代理;许多其他应用,尤其是那些自带 HTTP 客户端或网络库的应用,会直接连接,完全不会经过代理。在大多数设备上,移动数据没有面向用户的等效代理字段,因此那里也没有可配置的内容。
为什么在 Android 上使用内置工具配置 SOCKS5 通常是死路一条
即使某个应用提供了自己的 SOCKS5 字段,也往往会出现三个问题:
- DNS 在哪里解析。 SOCKS5 有一个远程解析主机名的变体,通常写作
socks5h。如果应用先在本地解析域名,你的 DNS 查询会发往你的 ISP,而流量却从别处出去——这是一种部分泄漏。 - UDP 支持。 SOCKS5 确实定义了 UDP 关联,但客户端支持并不一致,而且 Android 自身的网络栈不会通过系统代理暴露它。
- 身份验证。 用户名/密码身份验证是 SOCKS5 握手的一部分,但应用是否显示这些字段取决于开发者。
在 Android 上让流量走代理的实用方法
选项 1:使用内置 HTTP 代理(最快,限制最多)
- 打开 设置,然后进入 网络和互联网,再进入 互联网(在旧版本中标记为 Wi-Fi)。
- 长按你的网络,然后选择 修改网络。
- 展开 高级选项,将 代理 设为 手动。
- 输入代理主机名和端口。某些版本还会显示绕过列表——在那里添加本地地址。
- 保存,然后重新连接到该网络。
通过在浏览器中访问 IP 检测页面,并在关闭代理的情况下比较结果来测试。如果浏览器显示代理 IP,但某个应用仍显示你的真实 IP,那么该应用正在忽略系统代理。
选项 2:使用构建本地 VPN 接口的应用
创建本地 VPN 隧道的应用可以捕获设备流量并将其转发到代理端点,从而绕开仅支持 HTTP 的限制。在走这条路之前,有两件事需要了解:
- Android 允许 同一时间只有一个活动 VPN,因此这会与你已经使用的任何 VPN 应用冲突。
- 该应用现在处于其捕获的所有流量的路径中。选择它时要像选择 VPN 提供商一样谨慎。
选项 3:在其他地方终止代理
与其让 Android 直接使用 SOCKS5,不如将 SOCKS5 客户端放在你控制的机器上——家庭服务器、路由器或小型云实例——然后让 Android 连接到它。在桌面端通过 SSH 动态转发隧道(ssh -D)终止 SOCKS5 并共享该连接,是一种常见模式。
选项 4:Root 级重定向
有了 root 权限,内核级重定向可以将所有 TCP 流量发送到 SOCKS5 代理,从而完全绕过按应用配置的代理支持。这确实存在破坏连接的风险,不是随便就能选的方案。
从命令行正确测试
如果设备上有终端应用,请独立于浏览器验证代理:
# 检查代理呈现的 IP
curl -s --proxy socks5h://user:[email protected]:1080 https://api.ipify.org; echo
# 同一个代理,输出 JSON 以便编写脚本
curl -s --proxy socks5h://user:[email protected]:1080 "https://api.ipify.org?format=json"
如果这些命令显示代理的地址,但你的浏览器没有,那么问题出在应用级配置,而不是代理本身。
值得认真对待的安全注意事项
- HTTP 代理可以看到每个请求的目标地址。HTTPS 会保持内容加密,但元数据对运行代理的人来说仍然可见。
- 任何平台上的免费公共代理都应被视为不可信。绝不要通过它们发送凭据或会话 Cookie。
- 如果某个代理是透明的、免费的,而且不需要账户,在将任何敏感内容经由它传输之前,先问清楚它的商业模式是什么。
要点总结
Android 的 Wi-Fi 代理对话框只是一个仅支持 HTTP 的便捷功能,而不是 SOCKS5 客户端——这是平台限制,而不是你这边配置错误。简单的浏览器级 HTTP 代理可以使用内置设置;当你需要将整个设备流量路由到 SOCKS5 端点时,可以使用本地 VPN 隧道应用;如果你希望在不 root 的情况下获得灵活性,可以考虑在别处终止 SOCKS5,例如 SSH 隧道或你控制的路由器。无论选择哪条路线,在信任它之前,都要通过浏览器和命令行进行 IP 检测来验证。