这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

VPN网络

介绍在 OpenWRT 下进行搭建VPN

1 - zerotier

使用 zerotier 搭建 VPN

准备工作

注册帐号

我直接用 github 帐号登录。

创建网络

登录后提示创建一个新的网络,选择 private,可以修改网络名字如我改为 skynet 。

ipv4 自动分配地址,选择一个网段。

记录下这个网络的 ZeroTier Network ID。

安装客户端

openwrt

打开 openwrt 的 “vpn” -< “zerotier”:

http://192.168.0.1/cgi-bin/luci/admin/vpn/zerotier

填写 ZeroTier Network ID,勾选 启动 和 自动允许客户端 NAT, 点 “保存&应用”

连接成功后会显示 “Zerotier 运行中”, “接口信息” 中也可以看到相关的信息。

在 zerotier 的管理页面上,这时可以看到有一个提示 “One device has joined this network.” 在设置列表中找到这个设备,勾选前面的框让认证通过。

为了方便起见,给每个设备指定固定的ip地址,方便后续直接连接。比如路由器我设置为 192.168.192.100。

mac

下载安装 zerotier 的 app,启动后点击"Jion New Network" ,输入前面的 ZeroTier Network ID。然后同样需要在管理页面认证通过。

windows

类似的安装应用,设置和 mac 类似。

貌似在路由器安装好 zerotier 之后,内网其他机器没有必要再安装 zerotier 了。

配置网络

配置路由器

在 openwrt 的设置中,我们选择了 “自动允许客户端 NAT”,但这还不够,还需要在 zerotier 的管理页面中对网络进行路由设置。

默认情况会有一个 managed route , “192.168.192.0/24(LAN)"。

我的路由器的内网中有两个子网,分别是 “192.168.0.0/24” 和 “192.168.100.0/24”,为了在其他设备上直接访问这些网段,需要添加两个人 route,如下图所示:

备注:这里的 192.168.192.100 是前面设置的路由器在 zerotier 网络中的固定IP。

可以通过 mac 上的 zerotier app 看到这些路由信息:

由于这些路由信息的存在,因此我们可以直接使用这些内网 IP 地址进行访问,好处就是可以在外网得到和在内网一样的体验。

网速延迟

以广州南沙的 openwrt 软路由机器为基础进行测试,使用的是电信网络。

ping 天河的节点,同是电信宽带,延迟为 5-6 毫秒。同城电信网络之间的 ping 值非常好,甚至比家里用无线网络的延迟都低,如果不是受限于上行带宽,体现和普通局域网基本一致:

$ ping 192.168.192.20
PING 192.168.192.20 (192.168.192.20): 56 data bytes
64 bytes from 192.168.192.20: seq=0 ttl=64 time=4.922 ms
64 bytes from 192.168.192.20: seq=1 ttl=64 time=6.178 ms
64 bytes from 192.168.192.20: seq=2 ttl=64 time=4.929 ms
64 bytes from 192.168.192.20: seq=3 ttl=64 time=5.432 ms
64 bytes from 192.168.192.20: seq=4 ttl=64 time=5.480 ms
64 bytes from 192.168.192.20: seq=5 ttl=64 time=5.759 ms

ping 两台放在苏州的节点,也是电信宽带,延迟为 30 毫秒,考虑广州到苏州的距离,这个 ping 值还算可以的,一般用感觉不到明显延迟:

$ ping 192.168.192.30
PING 192.168.192.30 (192.168.192.30): 56 data bytes
64 bytes from 192.168.192.30: seq=0 ttl=64 time=29.429 ms
64 bytes from 192.168.192.30: seq=1 ttl=64 time=29.653 ms
64 bytes from 192.168.192.30: seq=2 ttl=64 time=29.981 ms

$ ping 192.168.192.40
PING 192.168.192.40 (192.168.192.40): 56 data bytes
64 bytes from 192.168.192.40: seq=0 ttl=64 time=31.140 ms
64 bytes from 192.168.192.40: seq=1 ttl=64 time=31.054 ms
64 bytes from 192.168.192.40: seq=2 ttl=64 time=30.939 ms
64 bytes from 192.168.192.40: seq=3 ttl=64 time=30.856 ms
64 bytes from 192.168.192.40: seq=4 ttl=64 time=31.451 ms

ping 用手机 USB 共享网络的放在上海青浦办公室的网络设备,延迟低时有 40 毫秒,但非常不稳定,估计是手机网络的问题:

$ ping 192.168.192.50
PING 192.168.192.50 (192.168.192.50): 56 data bytes
64 bytes from 192.168.192.50: seq=0 ttl=64 time=41.940 ms
64 bytes from 192.168.192.50: seq=1 ttl=64 time=41.611 ms
64 bytes from 192.168.192.50: seq=2 ttl=64 time=816.259 ms
64 bytes from 192.168.192.50: seq=3 ttl=64 time=224.184 ms
64 bytes from 192.168.192.50: seq=4 ttl=64 time=99.026 ms
64 bytes from 192.168.192.50: seq=5 ttl=64 time=58.053 ms
64 bytes from 192.168.192.50: seq=6 ttl=64 time=43.430 ms
64 bytes from 192.168.192.50: seq=7 ttl=64 time=47.531 ms
64 bytes from 192.168.192.50: seq=8 ttl=64 time=141.978 ms
64 bytes from 192.168.192.50: seq=9 ttl=64 time=40.104 ms

克隆后的问题

在 pve 内,通过将 openwrt 虚拟机进行备份,然后复制到其他机器,再通过恢复功能重建 openwrt 虚拟机之后,由于 zerotier 还是沿用的之前的认证信息,因此会导致冒认身份。

重置身份

此时正确的方式,应该是删除原有的身份信息,然后重新生成新的身份信息,再在 zerotier 管理页面对新的身份进行认证。

# 1. 停止服务
/etc/init.d/zerotier stop

# 2. 彻底清空配置目录 (破釜沉舟)
# ls /var/lib/  把和 zerotier 相关的目录清理掉
rm -rf /var/lib/zerotier-luci
rm -rf /var/lib/zerotier-one
rm -rf /etc/config/zero/*

# 3. 启动服务 (生成全新的身份)
/etc/init.d/zerotier start

# 4. 获取最新的 Node ID
sleep 3
zerotier-cli info

但我当时错误的选择了删除 zerotier,然后通过 istore 重新安装 zerotier,结果导致了一系列问题,处理起来非常的麻烦。本来最简单的办法应该是重置 zerotier,然后导入配置或者重新是手工再次配置一遍,但我的机器在远程,我只能远程操作(通过ddns+端口映射),一旦网络断开整个机器就会失去控制。

libminiupnpc 依赖问题

先查看 zerotier 的 info 信息:

$ zerotier-cli info
Error loading shared library libminiupnpc.so.18: No such file or directory (needed by /usr/bin/zerotier-cli)

安装缺失的依赖 libminiupnpc:

opkg update
opkg install libminiupnpc

也可能是安装了其他版本:

ls /usr/lib/libminiupnpc.so*

/usr/lib/libminiupnpc.so.2.2.3  /usr/lib/libminiupnpc.so.2.2.8

这种情况下做一个 soft link 就好了:

ln -s /usr/lib/libminiupnpc.so.2.2.8 /usr/lib/libminiupnpc.so.18

路径不一致问题

在 openwrt 页面上,通过 istore 安装 zerotier 之后,在 zerotier 页面开启 zerotier, 并设置好参数,加入ZeroTier 网络 ID,然后保存并应用。

但,会发现 zerotier 并没有成功连接, 而且 zerotier-cli info 报错:

$ zerotier-cli info
zerotier-cli: missing port and zerotier-one.port not found in /var/lib/zerotier-one

这个问题卸载 zerotier,然后清理所有 zerotier 文件后,再次安装,依然有同样问题。后来 ps 时发现,开机启动的 zerotier-one 进行,使用的是 /var/lib/zerotier-luci 这个工作目录,而不是默认的 /var/lib/zerotier-one

ps | grep zerotier
 5748 root      1188 S    grep zerotier
31281 root      1196 S    {zerotier-nat} /bin/sh /usr/libexec/zerotier-nat
31282 root      1256 S    {zerotier-dns} /bin/sh /usr/libexec/zerotier-dns
31283 root     34220 S    /usr/bin/zerotier-one /var/lib/zerotier-luci

这应该是从 istore 上安装的 zerotier 的问题,要解决这个问题最彻底的方式是修改 zerotier 的启动脚本:

vi /etc/init.d/zerotier

需要做两个改动:

  1. start 命令

    强制指定正确路径,并且在不存在时创建。

    start_service() {
    
       config_get ...
       config_get ...
       config_get ...
    
       # 强制指定正确路径
       config_path="/etc/config/zero"
       mkdir -p "${config_path}"
    
  2. stop 命令

    这里不要删除目录

    stop_service() {
       # rm -rf "${CONFIG_PATH}"
       return 0
    

配置方式可以用 zerotier 页面进行配置。

防火墙配置,可以用最简单的方案:

  1. 添加接口

    • 进入 网络 (Network) -> 接口 (Interfaces)。
    • 点击左下角的 “添加新接口” (Add new interface)。
    • 名称:输入 VPN (或者 ZeroTier)。
    • 协议:选择 “不配置协议” (Unmanaged)。
    • 设备 (Device):在下拉列表中,寻找 ztw4lflcku (或者你刚才查到的名字)。
    • 注意:如果没有直接显示,可以手动输入 ztw4lflcku,或者选择“自定义接口”后输入。
    • 点击 创建 (Create)。
  2. 设置防火墙

    在刚才创建的 ZeroTier 接口的修改页面,点击 防火墙设置 (Firewall Settings) ,然后分配防火墙区域为 lan

附录:常用命令

在 OpenWrt 上,管理 ZeroTier 主要分为两个部分:通用命令行工具 (zerotier-cli)OpenWrt 系统服务管理

zeroTier 核心命令 (zerotier-cli)

这些命令直接与 ZeroTier 进程交互,用于查看状态、加入网络等。

  • 查看当前状态和 Node ID (节点 ID)

    zerotier-cli info
    

    输出示例: 200 info 8a6b22xxxx 1.10.2 ONLINE 这里的 8a6b22xxxx 就是你的 Node ID,你需要在 ZeroTier 管理后台批准这个 ID。

  • 加入网络

    zerotier-cli join <Network_ID>
    

    示例: zerotier-cli join a0cbf4b62a12xxxx

  • 离开网络

    zerotier-cli leave <Network_ID>
    
  • 查看已加入的网络 (及 IP 地址)

    zerotier-cli listnetworks
    

    重点: 这个命令会显示 <dev> 列(如 zt7u3....),这是 ZeroTier 生成的虚拟网卡名称,你在 OpenWrt 的“网络 -> 接口”设置中需要用到它。

  • 查看对等节点 (Peers)

    zerotier-cli peers
    

    用于排查故障,查看是否与控制器(Planet)或其他节点(Leaf)建立了直接连接(Direct)还是中继连接(Relay)。

  • 绑定特定物理 IP (高级)

    如果有多条宽带,强制绑定某一个 IP:

    zerotier-cli bond <Network_ID> <IP_Address>
    

OpenWrt 服务管理命令

在 OpenWrt 上,建议通过系统服务来控制 ZeroTier 的启动和停止,确保持久化运行。

  • 启动服务

    /etc/init.d/zerotier start
    
  • 停止服务

    /etc/init.d/zerotier stop
    
  • 重启服务

    (修改配置后通常需要执行此命令)

    /etc/init.d/zerotier restart
    
  • 设置开机自启

    /etc/init.d/zerotier enable
    

OpenWrt UCI 配置命令 (推荐方式)

虽然 zerotier-cli join 可以加入网络,但在 OpenWrt 中,最佳实践是将网络 ID 写入配置文件 /etc/config/zerotier,这样重启路由器后配置不会丢失。

  • 查看当前 UCI 配置

    cat /etc/config/zerotier
    
  • 通过命令添加网络 ID (永久保存)

    假设你的 Network ID 是 a0cbf4b62a12xxxx

    uci add_list zerotier.sample_config.join='a0cbf4b62a12xxxx'
    uci commit zerotier
    /etc/init.d/zerotier restart
    

    (注意:sample_config 是默认的配置段名称,如果你的配置文件里改了名字,请相应替换)

常见后续操作 (至关重要)

仅仅在命令行加入网络是不够的,在 OpenWrt 上你通常还需要进行以下两步操作,才能让局域网设备互通:

  1. 创建接口

    你需要去 LuCI (网页后台) -> 网络 -> 接口 -> 添加新接口

    • 协议:不配置协议 (Unmanaged) 或 静态地址 (Static address)。
    • 设备:选择 zerotier-cli listnetworks 里看到的那个设备名 (如 ztwdk...)。
  2. 配置防火墙

    网络 -> 防火墙

    • 将刚才新建的接口加入到一个区域(通常是新建一个 VPN 区域,或者为了方便直接加入 LAN 区域,并允许 Masquerading 动态伪装)。

总结流程

  1. zerotier-cli info 获取 ID。
  2. 在 ZeroTier 官网后台授权该 ID。
  3. uci add_list ... 添加网络 ID 并重启服务。
  4. zerotier-cli listnetworks 确认状态为 OK 且有虚拟网卡名。
  5. 在 OpenWrt 网页后台配置接口和防火墙。

2 - [归档]OpenConnect VPN

使用 OpenConnect VPN

备注: zerotier 非常好用,就没有继续使用 OpenConnect VPN 了。

归档

安装

opkg update
opkg install ocserv luci-app-ocserv
reboot

如果遇到报错 “cannot find dependency kernel”:

Collected errors:
 * pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.102-1-e469f5589b4c7b368924a6e4f8f7407f) for kmod-tun
 * opkg_install_cmd: Cannot install package luci-app-ocserv.

则是当前 openwrt 的 kernel 版本不够新:

uname -a
Linux BleachWrt 5.15.98 #0 SMP Thu Mar 9 14:21:25 2023 x86_64 GNU/Linux

打开页面 https://downloads.openwrt.org/snapshots/targets/x86/64/packages/,找到 kernel ,手工下载最新版本并安装:

wget https://downloads.openwrt.org/snapshots/targets/x86/64/packages/kernel_5.15.102-1-e469f5589b4c7b368924a6e4f8f7407f_x86_64.ipk
opkg install kernel_5.15.102-1-e469f5589b4c7b368924a6e4f8f7407f_x86_64.ipk

随即遇到第二个报错:

opkg update
opkg install luci-app-ocserv 
Unknown package 'luci-app-ocserv'.
Collected errors:
 * opkg_install_cmd: Cannot install package luci-app-ocserv.

只能继续手工下载了,打开

https://mirrors.cloud.tencent.com/lede/releases/

找到最新的 release 版本,如 22.03.3,然后选择对应的平台,如我是 x86_64

https://mirrors.cloud.tencent.com/lede/releases/22.03.3/packages/x86_64/luci/

在这里可以找到 luci-app-ocserv_git-20.110.55046-74da73b_all.ipk ,手工安装:

$ wget https://mirrors.cloud.tencent.com/lede/releases/22.03.3/packages/x86_64/luci/luci-app-ocserv_git-20.110.55046-74d
a73b_all.ipk
$ opkg install luci-app-ocserv_git-20.110.55046-74da73b_all.ipk 

Multiple packages (libgcc1 and libgcc1) providing same name marked HOLD or PREFER. Using latest.
Multiple packages (libgcc1 and libgcc1) providing same name marked HOLD or PREFER. Using latest.
Multiple packages (libatomic1 and libatomic1) providing same name marked HOLD or PREFER. Using latest.
Installing luci-app-ocserv (git-20.110.55046-74da73b) to root...
Configuring luci-app-ocserv.
Collected errors:
 * pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.98-1-c3ae984cf3530f6fa5bf8738be620d7b) for kmod-crypto-user
 * pkg_hash_fetch_best_installation_candidate: Packages for kmod-crypto-user found, but incompatible with the architectures configured
 * pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.98-1-c3ae984cf3530f6fa5bf8738be620d7b) for kmod-cryptodev
 * pkg_hash_fetch_best_installation_candidate: Packages for kmod-cryptodev found, but incompatible with the architectures configured

这里有两个依赖需要更新版本,以匹配前面刚更新的 kernel:

$ opkg install kmod-cryptodev
$ opkg install luci-app-ocserv

reboot 重启 openwrt.

配置

参考资料: