1. Prologue
由于安卓系统的限制,同一时间只能够有一个 VPN 服务启动。那么对于有需求的人而言,怎么才能实现代理软件和 VPN(虚拟组网)服务共存?
我们可以先把 NetBird 虚拟组网服务以用户态启动,注册为一个 Socks5 代理。然后使用现有的代理软件(eg. NekoBox / Clash Meta)把 NetBird 的网段(100.64.0.0/10)转发到用户态的 Socks5 代理。
但是 NetBird 官方客户端并没有直接提供 Socks5 代理相关选项,所以——得手搓。
2. Installation
2.1. 准备 NetBird
- 下载最新版 Termux 作为 NetBird 的载体。
- 选择一个目录存放所有文件,这里我选择
~/data/netbird。 - 从 Workflow 下载 Patch 过的 NetBird 二进制文件:https://github.com/lzc256/netbird/actions/workflows/sync-and-build.yml 注:官方版本在 Android 上缺失 P2P 功能。只有 Patch 版本才能 P2P 打洞。详见:Workaround for NetBird Android
netlinkrib: permission deniederror - 把下载好的
netbird-anet-linux-arm64-xxxxx.zip解压并拷贝到 Termux 里的~/data/netbird/netbird-anet-linux-arm64
2.2. Termux 兼容性脚本
这玩意下载下来肯定是不能在 Termux 上直接跑的。主要痛点:
- 默认方式起不了守护进程,需要手动起,每次重复打环境变量很烦。
- SIGSYS(Bad System Call):需要用 proot 包装。
- 网络相关问题
经过尝试,写了一个这样的包装脚本:
~/data/netbird/netbird
#!/bin/bash
export SSL_CERT_FILE=$PREFIX/etc/tls/cert.pem
export CURL_CA_BUNDLE=$PREFIX/etc/tls/cert.pem
export GODEBUG="asyncpreemptoff=1,http2client=0"
BASE="$(realpath ~/data/netbird)"
export NB_DAEMON_ADDR="unix://$BASE/netbird.sock"
export NB_CONFIG="$BASE/config.json"
export NB_STATE_DIR="$BASE/var"
export NB_LOG_LEVEL=warning
export NB_LOG_FILE="$BASE/log.log"
# export NB_LOG_FILE="console"
export NB_DISABLE_DNS=true
export NB_USE_NETSTACK_MODE=true
export NB_ENABLE_NETSTACK_LOCAL_FORWARDING=true
export NB_SOCKS5_LISTENER_PORT=1066
export NB_WG_KERNEL_DISABLED=true
export NB_MANAGEMENT_URL="https://netbird.example.com"
NETBIRD="$(realpath ~/data/netbird/netbird-anet-linux-arm64)"
proot -b /dev -b /proc -b /sys -b "$BASE/resolv.conf:/etc/resolv.conf" -w "$BASE" "$NETBIRD" "$@"
由于 proot 环境中没有 resolv.conf 导致域名解析错误,需要手动绑定。创建 $BASE/resolv.conf:
nameserver 8.8.8.8
nameserver 223.5.5.5
然后:
ln -s ~/data/netbird/netbird $PREFIX/bin/netbird
netbird service up &
netbird up
即可正常使用并登录。登录成功后,Socks5 代理绑定在 127.0.0.1:1066
2.3. 代理软件转发网段到 NetBird
这就看你用什么软件了。我使用的是 Nekobox,具体方法:
- 添加一个 Socks5 代理,
127.0.0.1:1066。其他不用管。 - 添加一条路由规则,放在最上面,
dst ip:100.64.0.0/10outbound: 选择你刚刚添加的代理
大功告成!
2.4. 开机自启
你还可以考虑使用 termux-services + runsv 来实现 Termux 开机自启动 netbird。
netbird-service.sh
#!/usr/bin/env bash
exec netbird service run
chmod +x netbird-service.sh
具体添加 netbird-service.sh 到 services 的方法,请参考 Termux 的高级使用方法#2-脚本自启动。
3. 局限性
P2P 大概率无法打通:NetBird 的打洞方式比较接近于标准的 ICE 协议,依赖于 STUN 和本地网卡信息收集。然而作为一个权限不足的普通用户态软件,会有以下报错:2026-03-15T14:29:17.803Z ERRO client/internal/peer/ice/agent.go:44: failed to create pion's stdnet: route ip+net: netlinkrib: permission denied大概率无法解决,只能走 Relay。节哀。已解决(2026-03-16):我真是天才。 Workaround for NetBird Androidnetlinkrib: permission deniederror [https://github.com/lzc256/netbird/actions/workflows/sync-and-build.yml]外部连接无法传入:应该也是因为权限不足,获取不到本地 IP,不知道该绑哪。可恶!也许真的只能 root 了。已解决(2026-03-16):需要添加export NB_ENABLE_NETSTACK_LOCAL_FORWARDING=true。
Loading Comment Component...
