OpenWrt/zerotier

OpenWrt/zerotier

zerotier for OpenWrt

可以直接从 OpenWrt 官方源安装 zerotier。目前没有 UI。安装后需要通过 zerotier-cli 管理。

opkg update
opkg install zerotier

配置:保留默认的 sample_config, 直接创建一个新的 zerotier network。

uci set zerotier.openwrt_network.enabled='1'
uci set zerotier.openwrt_network.join='ffffffffff'

或直接编辑 zerotier 的配置文件是 /etc/config/zerotier :

config zerotier 'openwrt_network'
        list join 'ffffffffff'
        option enabled '1

在 OpenWrt 防火墙脚本里打开 zerotier 的端口(zerotier 默认使用 udp/9993 端口。参考资料):

iptables -A input_wan_rule -p udp --dport 9993 -j ACCEPT # zerotier

启动:

/etc/init.d/zerotier start

第一次启动时,会自动生成客户端 secret 并保存到 /etc/config/zerotier 的 option secret '' 配置项里。然后再 zerotier web 页面授权新加入的 OpenWrt 设备即可。

也可以用 zerotier-cli join network_id 手动加入网络。但好像有时 zerotier-cli 的操作不会持久化。

更新路由器固件前可以备份 /etc/config/zerotier 这个配置文件。直接还原即可恢复之前的配置。

更多使用可以参考文档

/etc/init.d/zerotier

OpenWrt 的 zerotier 包自带的 /etc/init.d/zerotier 启动脚本写的乱七八糟。

测试发现该脚本的问题:

有时 stop 无法停止 zerotier。workaround:修改脚本里 stop_service() 函数,加入:

killall zerotier-one
# zerotier-one may delay few seconds before exiting
sleep 5

以特定用户身份启动 zerotier:修改 start_instance() 函数的 procd_set_param command $PROG $args $path 这行,改为:

procd_set_param command start-stop-daemon -S -b -c 0:65534 -x $PROG -- $args $path

这里使用 uid=0 (root), gid=65534 (nobody) 的用户身份启动 zerotier,所以程序仍然拥有完整的 root 权限,但可以根据 gid 对进程做策略路由。

占用空间

包括依赖 zerotier 1.10.2 (OpenWrt 21.02 官方仓库) 大概占用 overlay 接近 1MiB 空间。

瘦身方法:

upx 对 /usr/bin/zerotier-one 文件进行压缩,测试文件大小 829KiB => 392KiB。压缩后 overlay 可用空间实际增加了 116KiB。

所有 /overlay/upper/usr/bin, /overlay/upper/usr/sbin, /overlay/upper/bin, /overlay/upper/sbin 等目录下的文件都可以这么搞。但 upx 目前还不支持压缩 mipsle 平台的 Linux .so 动态库文件。


Last update: 2024-03-13 03:36:27 UTC