ZeroTier 02: 在OpenWRT上配置ZeroTier

OpernWRT提供的ZT软件包为定制版本,而开发者又没有给出详细的说明,本节我们就来结合源代码说明一下,怎样优雅地在OpenWRT上配置ZeroTier。

2 在OpenWRT上配置ZeroTierOne

上一章我们介绍了,ZeroTier的配置文件存储在/var/lib/zerotier-one下。但OpenWRT将/var挂载在内存中,意味着只要一重启,里面所有内容都会被还原。所以要在OpenWRT上配置ZT,需要通过UCI特殊配置下。

2.1 安装zerotier软件包

这个就不多说了,通过luci管理界面或通过opkg命令安装都可以。

安装zerotier软件包

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配置相关的路由信息,就可以在节点下的子网之间也可以随意路由了。

发表评论