落雨宸的时光机
733 字
4 分钟
在安卓 Termux 上安装 NetBird CLI,启用 Socks5 实现双 VPN 共存
2026-03-15
...

1. Prologue#

由于安卓系统的限制,同一时间只能够有一个 VPN 服务启动。那么对于有需求的人而言,怎么才能实现代理软件和 VPN(虚拟组网)服务共存?

我们可以先把 NetBird 虚拟组网服务以用户态启动,注册为一个 Socks5 代理。然后使用现有的代理软件(eg. NekoBox / Clash Meta)把 NetBird 的网段(100.64.0.0/10)转发到用户态的 Socks5 代理。

但是 NetBird 官方客户端并没有直接提供 Socks5 代理相关选项,所以——得手搓。

2. Installation#

2.1. 准备 NetBird#

  1. 下载最新版 Termux 作为 NetBird 的载体。
  2. 选择一个目录存放所有文件,这里我选择 ~/data/netbird
  3. 从 Workflow 下载 Patch 过的 NetBird 二进制文件:https://github.com/lzc256/netbird/actions/workflows/sync-and-build.yml 注:官方版本在 Android 上缺失 P2P 功能。只有 Patch 版本才能 P2P 打洞。详见:Workaround for NetBird Android netlinkrib: permission denied error
  4. 把下载好的 netbird-anet-linux-arm64-xxxxx.zip 解压并拷贝到 Termux 里的 ~/data/netbird/netbird-anet-linux-arm64

2.2. Termux 兼容性脚本#

这玩意下载下来肯定是不能在 Termux 上直接跑的。主要痛点:

  1. 默认方式起不了守护进程,需要手动起,每次重复打环境变量很烦。
  2. SIGSYS(Bad System Call):需要用 proot 包装。
  3. 网络相关问题

经过尝试,写了一个这样的包装脚本:

~/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,具体方法:

  1. 添加一个 Socks5 代理,127.0.0.1:1066。其他不用管。
  2. 添加一条路由规则,放在最上面,
  • dst ip: 100.64.0.0/10
  • outbound: 选择你刚刚添加的代理

大功告成!

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. 局限性#

  1. 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 Android netlinkrib: permission denied error [https://github.com/lzc256/netbird/actions/workflows/sync-and-build.yml]

  2. 外部连接无法传入:应该也是因为权限不足,获取不到本地 IP,不知道该绑哪。可恶!也许真的只能 root 了。 已解决(2026-03-16):需要添加 export NB_ENABLE_NETSTACK_LOCAL_FORWARDING=true

    netbird/issues/2799#issuecomment-2598974208

在安卓 Termux 上安装 NetBird CLI,启用 Socks5 实现双 VPN 共存
https://blog.lzc256.com/posts/install-netbird-cli-on-android-termux/
作者
落雨宸
发布于
2026-03-15
许可协议
CC BY-NC-SA 4.0


Loading Comment Component...