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 动态库文件。