OpernWRT提供的ZT软件包为定制版本,而开发者又没有给出详细的说明,本节我们就来结合源代码说明一下,怎样优雅地在OpenWRT上配置ZeroTier。
2 在OpenWRT上配置ZeroTierOne
上一章我们介绍了,ZeroTier的配置文件存储在/var/lib/zerotier-one下。但OpenWRT将/var挂载在内存中,意味着只要一重启,里面所有内容都会被还原。所以要在OpenWRT上配置ZT,需要通过UCI特殊配置下。
2.1 安装zerotier软件包
这个就不多说了,通过luci管理界面或通过opkg命令安装都可以。
2.2 配置ZeroTier
2.2.1 生成配置文件
安装完成后,如果进入/var/lib,你会发现没有zerotier这个文件夹。
这是因为刚刚的安装过程仅仅是把可执行文件释放出来了,并没有附带配置文件。
我们此时需要稍微执行一下zerotier-one,就可以生成一些必要的配置文件了。
$ zerotier-one
然后按Ctrl-C
按下Ctrl-C后,就会发现在/var/lib/zerotier-one下生成了配置文件。
注:建议不要按照一些教程,执行zerotier-one -d。带上-d参数的话,zt就会一直在后台运行了,稍后启动服务会有各种奇怪的问题。
生成的配置文件如下:
root@openwrt:/tmp/lib/zerotier-one# ls -la
drwxr-xr-x 4 root root 180 Jun 5 00:28 .
drwxr-xr-x 4 root root 80 Jun 5 00:28 ..
-rw------- 1 root root 24 Jun 5 00:28 authtoken.secret
drwx------ 4 root root 80 Jun 5 00:28 controller.d
-rw-r--r-- 1 root root 141 Jun 5 00:28 identity.public
-rw------- 1 root root 270 Jun 5 00:28 identity.secret
drwxr-xr-x 2 root root 120 Jun 5 00:28 peers.d
-rw-r--r-- 1 root root 570 Jun 5 00:28 planet
-rw-r--r-- 1 root root 4 Jun 5 00:28 zerotier-one.port
2.2.2 永久存储配置
将生成的配置文件复制到一个永久存储的地方,比如/etc/zerotier
root@openwrt:/tmp/lib# cp /var/lib/zerotier-one /etc/zerotier -r
root@openwrt:/tmp/lib# ls /etc/zerotier/
authtoken.secret identity.public peers.d zerotier-one.port
controller.d identity.secret planet
然后删除/var/lib下的的配置文件,包括zerotier-one目录本身(也可以不删,服务启动时会帮我们删,参见https://github.com/mwarning/zerotier-openwrt/blob/master/zerotier/files/etc/init.d/zerotier 第34行)
root@openwrt:/tmp/lib# rm /var/lib/zerotier-one -r
那么现在就把配置文件转存到永久存储了。
如果你需要更换planet等配置文件,应该在/etc中更改。
2.2.3 编写UCI配置文件
你可以参考官方文档 https://openwrt.org/docs/guide-user/services/vpn/zerotier,但实际建议按照我的步骤来。
编辑/etc/config/zerotier:
config zerotier zt_glan
# 启用开关
option enabled 1
# 永久存储配置路径
option config_path '/etc/zerotier'
# 将永久存储配置文件夹链接还是复制到/var/lib。我建议设置成0
# 如果不希望zerotier频繁修改硬盘/FLASH上的文件,可以将它设置为1
# 这里有个细节问题,根据不同需要可能配置不同。可参考2.2.5小节
option copy_config_path '0'
# 这个是告诉zerotier-cli,本地的服务运行在哪个端口,而不是服务监听端口
# 最好不配置,因为zerotier-cli会自动读取zerotier-one.port文件
# 如果你想配置服务监听端口,你应该在local.conf中配置
#option port '9993'
# 可以指定local.conf的路径
#option local_conf '/etc/zerotier.conf'
# 留空,第一次启动服务时会自动填入
option secret ''
# 要加入的网络id
list join 'abcdabcd'
# 要加入多个网络,在下面加即可
list join 'another_network_id1'
list join 'another_network_id2'
2.2.4 启动服务
命令:
root@openwrt:~# /etc/init.d/zerotier start
Generate secret - please wait...
服务启动后,在controller(ztncui/my.zerotier.com)上授权,即可加入网络了。
root@openwrt:~# zerotier-cli listpeers
200 listpeers <ztaddr> <path> <latency> <version> <role>
200 listpeers aaa 1.2.3.4/9993;1042;1030 50 1.10.6 PLANET
...
最后别忘了开机自启:
root@openwrt:~# /etc/init.d/zerotier enable
2.2.5 copy_config_path配置的细节问题
copy_config_path参数用来配置,对于永久保存的配置文件夹,是以symbol link的方式链接到/var/lib/zerotier 还是复制过去。配置’0’为链接,’1’为复制。为什么要这么设计呢?
zerotier-one选择将其配置文件存储到/var/lib下,是因为其配置文件是会不断改变的。比如某段时间发现某个节点不可用了,zerotier-one就会将这个节点的信息更新一下,保存到peers.d文件夹下。
但对于一些低成本的硬件,其存储器用的可能是FLASH。而频繁擦写对FLASH是有比较大的代价的,因此,可以配置成在zerotier-one服务运行前,将配置文件先复制到内存中的/var/libs/zerotier-one目录(参见https://github.com/mwarning/zerotier-openwrt/blob/master/zerotier/files/etc/init.d/zerotier 第46行),后面无论服务如何修改配置文件,修改的都是内存中的副本了。
但如果你想将其设置为’1’复制模式,那么建议尽可能地先准备好初始化好的配置。比如如果每次都将一个空的peers.d文件夹复制到内存,那么zerotier-one每次都需要进行发现peers、收敛路由等操作,启动流程明显会慢一些。
所以建如果要设置为复制模式,不外乎就是让zerotier-one多运行一会儿,再保存其配置罢了。有很多种方法可以实现这一点。我觉得最简单的方法是:
- 先照上面的步骤配置成’0’链接模式,启动服务
- 加入网络后,多ping一下其他节点,以保存相关的peers配置
- 停止服务
- 将copy_config_path配置成’1’复制模式,再重新启动服务,以后就不会再频繁修改FLASH了。
当然你也可以按照网上其他博主的做法,先运行zerotier-one,加入网络,再配置uci,再复制文件。他们的做法也没问题,就是要注意,在使用init.d启动服务前,需要先把手动运行的zerotier-one进程杀死)。
当然了,对于那些x86路由器、软路由、虚拟化的路由,我的建议是使用链接模式就可以了。
2.3 配置防火墙
新建一个ZONE,配置下转发规则、配置下覆盖的设备就可以了
再到ztncui配置相关的路由信息,就可以在节点下的子网之间也可以随意路由了。