在第 10 篇中你已经掌握了 SSH 远程连接与端口转发,第 11 篇又学会了 curl、wget 等网络工具的实战用法。现在你可能会遇到一个现实问题:某些网站或服务在你的网络环境中无法直接访问,或者你希望在公共 Wi-Fi 下保护通信隐私。这时候就需要用到代理和加密通信技术。
但在 Android 无 root 环境下,代理方案和桌面 Linux 有显著差异。理解这些限制,才能选对正确的工具。
WireGuard、OpenVPN 等主流 VPN 协议需要创建 TUN/TAP 虚拟网络接口来接管系统流量。这个操作需要内核权限,无 root 的 Termux 无法执行 /dev/tun 设备的读写。这意味着你无法在 Termux 内部直接运行 WireGuard 或 OpenVPN 服务端程序。
Android 的 VpnService API 是系统级 VPN 通道的入口,但它只能通过独立 App 调用——Termux 作为一个终端模拟器,没有 VpnService 的调用权限。所以 WireGuard App、OpenVPN Connect 等 VPN 客户端是独立的 Android App,它们通过 VpnService 建立系统级隧道后,Termux 的流量会自动走 VPN 路由。
理解了限制后,来看无 root 下可行的代理方案。把网络通信想象成城市间的快递系统——你不能修建新的地下隧道(TUN/TAP),但可以借用已有的快递专线(SSH 隧道)、给包裹贴上转发标签(proxychains)、填写固定寄件地址(环境变量),或者让整座城市的交通都改走高速通道(VPN App)。
| 方案 | 原理 | 需要 Root | 适用场景 |
|---|---|---|---|
| SSH SOCKS5 | SSH 动态端口转发 | 否 | 最通用,仅需 SSH 服务器 |
| proxychains | LD_PRELOAD 劫持 socket | 否 | 让任意命令走代理 |
| HTTP/HTTPS 代理 | 环境变量驱动 | 否 | curl/wget/git 等支持代理的工具 |
| dnscrypt-proxy | DoH/DoT 加密 DNS | 否 | DNS 隐私保护(仅 Termux 内部) |
| VPN App | Android VpnService | 否 | 系统级全局代理(含 Termux) |
下面逐个讲解每种方案的配置方法。SSH SOCKS5 是最基础也最实用的方案,其他方案大多建立在它之上。
在第 10 篇 SSH 远程连接中,你已经学过 SSH 的三种端口转发模式:-L 本地转发、-R 远程转发、-D 动态转发。其中 -D 动态转发就是 SOCKS5 代理的核心——它在本地开启一个 SOCKS5 端口,所有发往该端口的流量都通过 SSH 隧道转发到远程服务器,再由远程服务器代为请求目标网站。
假设你有一台海外服务器 8.137.176.208,SSH 用户名为 user。一条命令即可建立本地 SOCKS5 代理:
执行后,SSH 会在本地 1080 端口开启 SOCKS5 服务。用 ss -tlnp | grep 1080 验证端口状态,正常输出类似 LISTEN 127.0.0.1:1080。
ssh -D 1080 -N -f user@8.137.176.208 加 -N 不开 Shell,加 -f 自动后台运行
建立代理后,用 curl 通过 SOCKS5 访问 IP 查询接口,确认出口 IP 已变为服务器 IP:
--socks5 和 --socks5-hostname 的区别在于 DNS 解析位置:前者在本地解析 DNS(可能泄露 DNS 查询),后者在远程服务器解析 DNS(更安全,DNS 查询也走加密隧道)。如果需要完整隐私保护,优先使用 --socks5-hostname。
预期输出类似 {"origin": "8.137.176.208"},说明请求已经通过服务器发出。如果看到的还是手机本地 IP,说明代理未生效。
上一节的 SOCKS5 代理虽然好用,但每个命令都需要手动加 --socks5 参数。proxychains 解决了这个问题——它像一个自动分拣员,在你和网络之间架设一道关口,所有 TCP 连接都自动走代理。当前版本 proxychains-ng 4.17。
安装后需要编辑配置文件。Termux 中 proxychains 的配置文件位于 $PREFIX/etc/proxychains.conf(即 /data/data/com.termux/files/usr/etc/proxychains.conf):
配置文件有三个关键部分:代理模式(dynamic_chain 按顺序尝试代理链中的服务器,strict_chain 严格要求所有代理可用,random_chain 随机选择)、日志级别(quiet_mode 关闭调试输出)、代理列表(在 [ProxyList] 下配置 SOCKS5 代理地址)。
配置完成后,只需在命令前加 proxychains 前缀即可:
proxychains 的工作原理是 LD_PRELOAD 注入——它通过环境变量 LD_PRELOAD 加载一个共享库,劫持程序中的 connect() 等系统调用,将 TCP 连接重定向到 SOCKS5 代理。这意味着只要程序是动态链接的,proxychains 就能让它走代理。
proxychains curl -s https://httpbin.org/ip 测试代理连通性,curl 使用 TCP
https_proxy 方式(下一节讲解),前提是程序本身支持代理配置。proxychains 虽然强大,但并非所有场景都需要全局代理。许多工具(curl、wget、git、pip)原生支持通过环境变量配置 HTTP/HTTPS 代理。这种方式更轻量——不需要额外安装软件,只需设置几个环境变量即可。如果说 proxychains 是强制所有包裹走快递通道,那么环境变量就是让支持代理的工具自己选择走通道。
四个关键环境变量:http_proxy 控制 HTTP 请求代理,https_proxy 控制 HTTPS 请求代理,all_proxy 设置 SOCKS 代理(某些工具优先读 all_proxy),no_proxy 排除不走代理的地址。
Git 除了读环境变量外,还有自己的代理配置方式,优先级高于环境变量:
每次手动 export 太繁琐。在 ~/.bashrc 中添加两个函数,实现一条命令开关代理:
添加到 ~/.bashrc 后执行 source ~/.bashrc 生效。之后输入 proxy_on 即可开启代理,proxy_off 关闭。记得把 IP 地址和端口替换为你自己的代理服务器地址。
no_proxy 和大写 NO_PROXY,部分工具(如 Python requests)只读大写。保险做法是大小写各设一份:同时 export no_proxy=... 和 export NO_PROXY=$no_proxy。即使你的 HTTP 请求走了加密代理,DNS 查询可能仍然是明文的——默认情况下 DNS 查询走 UDP 53 端口,不加密。这意味着网络运营商可以看到你正在查询哪些域名。dnscrypt-proxy 通过 DoH(DNS-over-HTTPS)或 DoT(DNS-over-TLS)加密 DNS 查询,防止 DNS 泄露和劫持。当前版本 2.1.18,新增 PQDNScrypt 后量子加密支持。
安装命令简单,但有一个关键限制:无 root 无法绑定 53 端口(DNS 标准端口),只能用高端口如 5300。这意味着 dnscrypt-proxy 无法替代系统 DNS,仅在 Termux 内部生效。
编辑 $PREFIX/etc/dnscrypt-proxy.toml,核心配置如下:
预期输出包含 Address: 140.82.112.4(GitHub 的 IP)。如果返回正常 IP 地址,说明加密 DNS 已生效。要让 Termux 内部的程序使用这个 DNS,可以将 resolv.conf 指向本地端口——但注意这只影响 Termux 内部解析,不改变 Android 系统 DNS。
dnscrypt_ephemeral_keys = true 即可启用。前面几节讲的都是 Termux 内部的代理方案。如果你需要全局代理——让手机上所有 App 的流量都走加密通道,包括 Termux——就需要借助 Android VPN App。这是无 root 下使用 VPN 的正确方式:VPN App 通过 Android VpnService API 建立系统级隧道,Termux 的流量自动走路由表中的 VPN 接口。
WireGuard 是目前性能最好、配置最简洁的 VPN 协议。Android 客户端当前版本 1.0.20260315。从 Google Play 或官方下载安装 WireGuard App 后,导入配置文件即可建立全局 VPN。
WireGuard 配置文件格式如下(你需要在服务器端生成对应的密钥对):
关键字段说明:AllowedIPs = 0.0.0.0/0 表示所有流量都走 VPN 隧道(全局代理)。如果只需要代理特定网段,改为如 AllowedIPs = 10.0.0.0/8 则只有内网流量走 VPN。PersistentKeepalive = 25 每 25 秒发送心跳包,保持 NAT 映射不超时。
VPN App 连接成功后,在 Termux 中验证流量是否走 VPN:
在 Termux 中执行 curl -s https://ifconfig.me,如果返回的是 VPN 服务器的 IP 而非手机本地 IP,说明全局 VPN 已生效,Termux 的所有网络请求都走加密通道。
VPN App 建立系统级隧道后,Termux 内的 SSH SOCKS5 代理仍然可以正常使用——VPN 负责加密 Termux 到外网的所有流量,SSH SOCKS5 在 VPN 隧道之上再建立一层端到端加密。这种双重加密在连接公共 Wi-Fi 等不安全网络时提供额外保障。
如果你使用 OpenVPN Connect 替代 WireGuard,原理完全相同——导入 .ovpn 配置文件,连接后 Termux 流量自动走 VPN。选择 WireGuard 还是 OpenVPN 取决于你的服务器端配置:WireGuard 更快更简洁,OpenVPN 兼容性更好、支持更多认证方式。
代理工具用好了保护隐私,用不好反而泄露敏感信息。本节梳理代理使用中的安全要点,这些实践在真实场景中比工具配置本身更重要。
proxychains.conf 和 WireGuard 配置文件中包含代理服务器 IP 和端口,WireGuard 配置更是直接包含私钥。这些文件不要提交到 Git 仓库,在 .gitignore 中添加排除规则。Termux 的 ~/.ssh/ 目录权限应为 700,私钥文件权限 600。
SSH SOCKS5 代理的安全性取决于 SSH 密钥。如果密钥文件没有 passphrase 保护,手机丢失后任何拿到文件的人都可以连接你的服务器。为现有密钥添加 passphrase:
添加 passphrase 后,每次建立 SSH SOCKS5 代理都需要输入密码。如果觉得每次输入太繁琐,可以使用 ssh-agent 管理密钥(第 10 篇已介绍)。
代理服务器是你的所有加密流量的中转站。服务器被入侵意味着攻击者可以看到你所有代理请求的目标地址(虽然内容仍然是加密的)。基本安全措施包括:SSH 服务只允许密钥认证(禁用密码登录)、服务器防火墙只开放必要端口、定期更新系统补丁。如果你的代理服务器同时运行 Web 服务,确保 SSH 端口(如 8022)不要暴露在默认端口上。
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_new。相比传统 RSA,ed25519 密钥更短(仅 68 字符)、签名更快、安全性更高。curl --socks5 127.0.0.1:1080 https://httpbin.org/ip 验证代理是否生效。确认返回的 IP 地址是代理服务器的 IP 而非本地 IP。~/.bashrc 中添加 proxy_on 和 proxy_off 函数,配置好 proxychains.conf 指向 SSH SOCKS5 代理。实现以下流程:输入 proxy_on → 环境变量生效 → proxychains git pull 走代理拉取代码。tcpdump 或 wireshark 在服务器端观察两种方案下到达服务器的数据包特征有何不同。