📚 Termux 无 Root 学习开发系列
阶段一:环境搭建与终端基础 ✅ 已完成
01-05 Termux 安装 → 包管理 → 文件管理 → Vim/tmux
阶段二:编程开发环境 ✅ 已完成
06-09 Python → C/C++ → Node.js → Git
阶段三:网络与远程操作
✓ 10 SSH 远程连接与端口转发
✓ 11 网络工具实战
12 网络代理与安全通信(当前篇)
阶段四至九共 16 篇,后续持续更新

12 网络代理与安全通信:SSH SOCKS5 与加密通信

在无 root 手机上搭建代理通道、加密 DNS 查询、配合 VPN App 实现系统级安全通信
读完本篇你将能:理解无 root 环境下代理方案的限制与可行路径,通过 SSH 建立本地 SOCKS5 代理,使用 proxychains 让任意命令走代理,配置 HTTP/HTTPS 环境变量代理,部署 dnscrypt-proxy 加密 DNS 查询,配合 WireGuard App 实现系统级 VPN,掌握代理安全最佳实践。
📑 本文目录
01无 Root 环境下的代理限制与可行方案
02SSH SOCKS5 代理:最实用的代理方案
03proxychains:让任意命令走代理
04HTTP/HTTPS 代理与环境变量
05dnscrypt-proxy:加密 DNS 查询
06配合 Android VPN App 实现系统级代理
07安全最佳实践与代理管理

01 无 Root 环境下的代理限制与可行方案

在第 10 篇中你已经掌握了 SSH 远程连接与端口转发,第 11 篇又学会了 curl、wget 等网络工具的实战用法。现在你可能会遇到一个现实问题:某些网站或服务在你的网络环境中无法直接访问,或者你希望在公共 Wi-Fi 下保护通信隐私。这时候就需要用到代理和加密通信技术。

但在 Android 无 root 环境下,代理方案和桌面 Linux 有显著差异。理解这些限制,才能选对正确的工具。

TUN/TAP 设备限制

WireGuard、OpenVPN 等主流 VPN 协议需要创建 TUN/TAP 虚拟网络接口来接管系统流量。这个操作需要内核权限,无 root 的 Termux 无法执行 /dev/tun 设备的读写。这意味着你无法在 Termux 内部直接运行 WireGuard 或 OpenVPN 服务端程序。

VpnService API 限制

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 是最基础也最实用的方案,其他方案大多建立在它之上。

02 SSH SOCKS5 代理:最实用的代理方案

在第 10 篇 SSH 远程连接中,你已经学过 SSH 的三种端口转发模式:-L 本地转发、-R 远程转发、-D 动态转发。其中 -D 动态转发就是 SOCKS5 代理的核心——它在本地开启一个 SOCKS5 端口,所有发往该端口的流量都通过 SSH 隧道转发到远程服务器,再由远程服务器代为请求目标网站。

创建 SOCKS5 代理

假设你有一台海外服务器 8.137.176.208,SSH 用户名为 user。一条命令即可建立本地 SOCKS5 代理:

Bash
1
2
3
4
5
6
7
8
9
# 建立本地 SOCKS5 代理(端口 1080)
ssh -D 1080 -N -f user@8.137.176.208
# -D 1080 动态端口转发,本地监听 1080
# -N 不执行远程命令,仅做端口转发
# -f 登录后自动退到后台运行
# 验证本地端口是否在监听
ss -tlnp | grep 1080

执行后,SSH 会在本地 1080 端口开启 SOCKS5 服务。用 ss -tlnp | grep 1080 验证端口状态,正常输出类似 LISTEN 127.0.0.1:1080。

⚠️ 常见错误
ssh -D 1080 user@8.137.176.208 — 不加 -N 参数,SSH 会打开远程 Shell,占用一个终端窗口,关闭终端代理也断了
✓ 正确:ssh -D 1080 -N -f user@8.137.176.208 加 -N 不开 Shell,加 -f 自动后台运行

验证代理是否生效

建立代理后,用 curl 通过 SOCKS5 访问 IP 查询接口,确认出口 IP 已变为服务器 IP:

Bash
# 通过 SOCKS5 代理访问(DNS 本地解析)
curl --socks5 127.0.0.1:1080 https://httpbin.org/ip
# 通过 SOCKS5 代理访问(DNS 远程解析)
curl --socks5-hostname 127.0.0.1:1080 https://ifconfig.me

--socks5 和 --socks5-hostname 的区别在于 DNS 解析位置:前者在本地解析 DNS(可能泄露 DNS 查询),后者在远程服务器解析 DNS(更安全,DNS 查询也走加密隧道)。如果需要完整隐私保护,优先使用 --socks5-hostname。

预期输出类似 {"origin": "8.137.176.208"},说明请求已经通过服务器发出。如果看到的还是手机本地 IP,说明代理未生效。

💡 小贴士
SSH SOCKS5 代理的加密强度等于 SSH 连接本身。OpenSSH 10.5 默认使用 ChaCha20-Poly1305 加密,即使代理服务器被监控,中间人也只能看到加密流量,无法解密你的实际请求内容。

03 proxychains:让任意命令走代理

上一节的 SOCKS5 代理虽然好用,但每个命令都需要手动加 --socks5 参数。proxychains 解决了这个问题——它像一个自动分拣员,在你和网络之间架设一道关口,所有 TCP 连接都自动走代理。当前版本 proxychains-ng 4.17。

安装与配置

Bash
pkg install proxychains
# 验证安装
proxychains --version

安装后需要编辑配置文件。Termux 中 proxychains 的配置文件位于 $PREFIX/etc/proxychains.conf(即 /data/data/com.termux/files/usr/etc/proxychains.conf):

Bash
1
2
3
4
5
6
7
8
9
10
11
12
# proxychains.conf 核心配置
# 代理模式:dynamic_chain 动态代理链
dynamic_chain
# quiet_mode 隐藏代理连接日志
quiet_mode
# 代理服务器列表
# 格式:类型 IP 端口
[ProxyList]
socks5  127.0.0.1  1080
# socks5 192.168.1.100 7890 # 备用代理

配置文件有三个关键部分:代理模式(dynamic_chain 按顺序尝试代理链中的服务器,strict_chain 严格要求所有代理可用,random_chain 随机选择)、日志级别(quiet_mode 关闭调试输出)、代理列表(在 [ProxyList] 下配置 SOCKS5 代理地址)。

实战:让任意命令走代理

配置完成后,只需在命令前加 proxychains 前缀即可:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
# 通过代理访问网站
proxychains curl -s https://httpbin.org/ip
# 通过代理克隆 GitHub 仓库
proxychains git clone https://github.com/git/git.git
# 通过代理下载文件
proxychains wget -O release.tar.gz \
  https://github.com/git/git/archive/refs/tags/v2.50.0.tar.gz
# 通过代理更新 Termux 包
proxychains pkg update

proxychains 的工作原理是 LD_PRELOAD 注入——它通过环境变量 LD_PRELOAD 加载一个共享库,劫持程序中的 connect() 等系统调用,将 TCP 连接重定向到 SOCKS5 代理。这意味着只要程序是动态链接的,proxychains 就能让它走代理。

⚠️ 常见错误
proxychains ping google.com — ping 使用 ICMP 协议,不走 TCP 连接,proxychains 无法劫持
✓ 正确:使用 proxychains curl -s https://httpbin.org/ip 测试代理连通性,curl 使用 TCP
💡 小贴士
proxychains 通过 LD_PRELOAD 劫持 socket 调用,因此对静态链接程序无效。Go 语言编译的二进制文件默认静态链接,proxychains 无法代理。遇到这种情况改用环境变量 https_proxy 方式(下一节讲解),前提是程序本身支持代理配置。

04 HTTP/HTTPS 代理与环境变量

proxychains 虽然强大,但并非所有场景都需要全局代理。许多工具(curl、wget、git、pip)原生支持通过环境变量配置 HTTP/HTTPS 代理。这种方式更轻量——不需要额外安装软件,只需设置几个环境变量即可。如果说 proxychains 是强制所有包裹走快递通道,那么环境变量就是让支持代理的工具自己选择走通道。

设置代理环境变量

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
# 设置 HTTP/HTTPS 代理
export http_proxy=http://192.168.1.100:7890
export https_proxy=http://192.168.1.100:7890
export all_proxy=socks5://127.0.0.1:1080
# 设置不代理的地址(本地和内网)
export no_proxy=localhost,127.0.0.1,192.168.0.0/16,10.0.0.0/8
# 验证环境变量
echo $https_proxy
# 取消代理
unset http_proxy https_proxy all_proxy no_proxy

四个关键环境变量:http_proxy 控制 HTTP 请求代理,https_proxy 控制 HTTPS 请求代理,all_proxy 设置 SOCKS 代理(某些工具优先读 all_proxy),no_proxy 排除不走代理的地址。

Git 代理配置

Git 除了读环境变量外,还有自己的代理配置方式,优先级高于环境变量:

Bash
git config --global http.proxy http://192.168.1.100:7890
git config --global https.proxy http://192.168.1.100:7890
# 查看代理配置
git config --global --get http.proxy
# 取消 Git 代理
git config --global --unset http.proxy

持久化代理开关

每次手动 export 太繁琐。在 ~/.bashrc 中添加两个函数,实现一条命令开关代理:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
# ~/.bashrc 中添加代理开关函数
proxy_on() {
    export http_proxy=http://192.168.1.100:7890
    export https_proxy=$http_proxy
    export all_proxy=socks5://127.0.0.1:1080
    export no_proxy=localhost,127.0.0.1
    echo "代理已开启"
}
proxy_off() {
    unset http_proxy https_proxy all_proxy no_proxy
    echo "代理已关闭"
}

添加到 ~/.bashrc 后执行 source ~/.bashrc 生效。之后输入 proxy_on 即可开启代理,proxy_off 关闭。记得把 IP 地址和端口替换为你自己的代理服务器地址。

💡 小贴士
no_proxy 环境变量大小写敏感。部分工具(如 curl、wget)同时读小写 no_proxy 和大写 NO_PROXY,部分工具(如 Python requests)只读大写。保险做法是大小写各设一份:同时 export no_proxy=... 和 export NO_PROXY=$no_proxy。

05 dnscrypt-proxy:加密 DNS 查询

即使你的 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 内部生效。

Bash
pkg install dnscrypt-proxy
# 复制示例配置文件
cp $PREFIX/share/dnscrypt-proxy/example-dnscrypt-proxy.toml \
  $PREFIX/etc/dnscrypt-proxy.toml

配置文件详解

编辑 $PREFIX/etc/dnscrypt-proxy.toml,核心配置如下:

TOML
1
2
3
4
5
6
7
8
9
10
11
12
13
# dnscrypt-proxy.toml 核心配置
# 监听地址和端口(无 root 不能用 53)
listen_addresses = ['127.0.0.1:5300']
# 选择 DoH 服务器(Cloudflare/Google)
server_names = ['cloudflare', 'google']
# 启用 DNS-over-HTTPS
doh_servers = true
# 要求 DNS 加密验证
require_dnssec = true

启动与测试

Bash
# 启动 dnscrypt-proxy
dnscrypt-proxy -config dnscrypt-proxy.toml &
# 另开终端测试加密 DNS 解析
nslookup -port=5300 github.com 127.0.0.1

预期输出包含 Address: 140.82.112.4(GitHub 的 IP)。如果返回正常 IP 地址,说明加密 DNS 已生效。要让 Termux 内部的程序使用这个 DNS,可以将 resolv.conf 指向本地端口——但注意这只影响 Termux 内部解析,不改变 Android 系统 DNS。

💡 小贴士
dnscrypt-proxy 2.1.18 新增了 PQDNScrypt(DNSCrypt 2026)支持,使用后量子加密技术保护 DNS 查询。即使未来量子计算机出现,历史 DNS 查询记录也无法被解密。在配置中设置 dnscrypt_ephemeral_keys = true 即可启用。

06 配合 Android VPN App 实现系统级代理

前面几节讲的都是 Termux 内部的代理方案。如果你需要全局代理——让手机上所有 App 的流量都走加密通道,包括 Termux——就需要借助 Android VPN App。这是无 root 下使用 VPN 的正确方式:VPN App 通过 Android VpnService API 建立系统级隧道,Termux 的流量自动走路由表中的 VPN 接口。

WireGuard App

WireGuard 是目前性能最好、配置最简洁的 VPN 协议。Android 客户端当前版本 1.0.20260315。从 Google Play 或官方下载安装 WireGuard App 后,导入配置文件即可建立全局 VPN。

WireGuard 配置文件格式如下(你需要在服务器端生成对应的密钥对):

INI
1
2
3
4
5
6
7
8
9
10
11
12
# WireGuard 客户端配置文件
[Interface]
PrivateKey = <你的私钥>
Address = 10.0.0.2/24
DNS = 1.1.1.1
[Peer]
PublicKey = <服务器公钥>
Endpoint = 8.137.176.208:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

关键字段说明:AllowedIPs = 0.0.0.0/0 表示所有流量都走 VPN 隧道(全局代理)。如果只需要代理特定网段,改为如 AllowedIPs = 10.0.0.0/8 则只有内网流量走 VPN。PersistentKeepalive = 25 每 25 秒发送心跳包,保持 NAT 映射不超时。

验证 VPN 是否生效

VPN App 连接成功后,在 Termux 中验证流量是否走 VPN:

VPN App 连接
→
系统路由表更新
→
Termux 流量走 VPN

在 Termux 中执行 curl -s https://ifconfig.me,如果返回的是 VPN 服务器的 IP 而非手机本地 IP,说明全局 VPN 已生效,Termux 的所有网络请求都走加密通道。

VPN 与 Termux 代理的配合

VPN App 建立系统级隧道后,Termux 内的 SSH SOCKS5 代理仍然可以正常使用——VPN 负责加密 Termux 到外网的所有流量,SSH SOCKS5 在 VPN 隧道之上再建立一层端到端加密。这种双重加密在连接公共 Wi-Fi 等不安全网络时提供额外保障。

如果你使用 OpenVPN Connect 替代 WireGuard,原理完全相同——导入 .ovpn 配置文件,连接后 Termux 流量自动走 VPN。选择 WireGuard 还是 OpenVPN 取决于你的服务器端配置:WireGuard 更快更简洁,OpenVPN 兼容性更好、支持更多认证方式。

07 安全最佳实践与代理管理

代理工具用好了保护隐私,用不好反而泄露敏感信息。本节梳理代理使用中的安全要点,这些实践在真实场景中比工具配置本身更重要。

代理配置文件保密

proxychains.conf 和 WireGuard 配置文件中包含代理服务器 IP 和端口,WireGuard 配置更是直接包含私钥。这些文件不要提交到 Git 仓库,在 .gitignore 中添加排除规则。Termux 的 ~/.ssh/ 目录权限应为 700,私钥文件权限 600。

SSH 密钥 passphrase 加密

SSH SOCKS5 代理的安全性取决于 SSH 密钥。如果密钥文件没有 passphrase 保护,手机丢失后任何拿到文件的人都可以连接你的服务器。为现有密钥添加 passphrase:

Bash
# 为现有密钥添加 passphrase
ssh-keygen -p -f ~/.ssh/id_ed25519
# 验证密钥指纹
ssh-keygen -lf ~/.ssh/id_ed25519

添加 passphrase 后,每次建立 SSH SOCKS5 代理都需要输入密码。如果觉得每次输入太繁琐,可以使用 ssh-agent 管理密钥(第 10 篇已介绍)。

代理服务器安全

代理服务器是你的所有加密流量的中转站。服务器被入侵意味着攻击者可以看到你所有代理请求的目标地址(虽然内容仍然是加密的)。基本安全措施包括:SSH 服务只允许密钥认证(禁用密码登录)、服务器防火墙只开放必要端口、定期更新系统补丁。如果你的代理服务器同时运行 Web 服务,确保 SSH 端口(如 8022)不要暴露在默认端口上。

💡 小贴士
定期更换 SSH 密钥是良好的安全习惯。建议每 3-6 个月生成新密钥对,更新服务器 authorized_keys 后删除旧密钥。生成新密钥时优先选择 ed25519 算法:ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_new。相比传统 RSA,ed25519 密钥更短(仅 68 字符)、签名更快、安全性更高。
📖 知识回顾
SSH SOCKS5 proxychains 配置 HTTP 环境变量 Git 代理 dnscrypt-proxy WireGuard App VPN 系统级代理 密钥安全
📝 分级练习
🟢 基础验证(5分钟)
通过 SSH 建立 SOCKS5 代理(端口 1080),使用 curl --socks5 127.0.0.1:1080 https://httpbin.org/ip 验证代理是否生效。确认返回的 IP 地址是代理服务器的 IP 而非本地 IP。
🟡 组合应用(5-10分钟)
在 ~/.bashrc 中添加 proxy_on 和 proxy_off 函数,配置好 proxychains.conf 指向 SSH SOCKS5 代理。实现以下流程:输入 proxy_on → 环境变量生效 → proxychains git pull 走代理拉取代码。
🔴 开放挑战(30分钟+)
在代理服务器上搭建一个 WireGuard 服务端,生成客户端配置文件导入手机 WireGuard App。然后对比以下两种方案的流量路径差异:① 仅使用 SSH SOCKS5 + proxychains ② 仅使用 WireGuard App 全局 VPN。用 tcpdump 或 wireshark 在服务器端观察两种方案下到达服务器的数据包特征有何不同。
阶段三完成 | 下一篇进入阶段四
13 Termux:API 硬件调用
通过命令行调用手机硬件功能——电池状态、传感器数据、摄像头拍照、GPS 定位、通知推送。让 Termux 不再只是一个终端,而是手机硬件的命令行遥控器。
关注公众号 · 持续获取系列更新