黑群晖(DSM7)使用docker挂载zerotier one实现内网穿透
前言
由于 Synology 的 DSM 7 不允许第三方应用程序以 root 用户身份运行。所以 DSM7 以上的版本将只能使用 docker 的方式来安装 zerotier(而 DSM6 的 zerotier 将在 2023 年进入 EOL 阶段(停止服务),且用且珍惜吧。
通过 docker 安装 zerotier 主要分为以下四个步骤:
1、在 nas 启动 ssh 访问;
2、创建 TUN 服务;
3、安装 docker 服务(群晖套件直接安装即可,这里略过);
4、拉取并启动 zerotier one 镜像;
5、将 zerotier-one 镜像加入你的网络,并添加 moon 节点
在 nas 启动 ssh 访问
在群晖页面控制面板下,找的 “终端机和 SNMP” 这一项,把 “启动 SSH 功能” 勾上即可,默认使用 22 端口即可;
之后使用远程访问工具(我这里使用 putty)登录群晖;
创建 TUN 服务
首先切换到 root 用户(以下所有的操作都需要有 root 权限)
1 | sudo -i |
创建一个 /usr/local/etc/rc.d/tun.sh 脚本 到 /dev/net/tun 目录下
1 | echo -e '#!/bin/sh -e \ninsmod /lib/modules/tun.ko' > /usr/local/etc/rc.d/tun.sh |
给刚刚创建的 tun 脚本授予所有用户均可执行的权限
1 | chmod a+x /usr/local/etc/rc.d/tun.sh |
使用以下命令检查以下 tun.ko 是否存在
1 | lsmod | grep tun |
由于我的群晖默认已经有 tun 这个包了,所以就不需要安装,直接用即可,如果使用 lsmod 命令找不到 tun 这个包,则执行以下脚本,创建 TUN
1 | /usr/local/etc/rc.d/tun.sh |
如果执行脚本遇到以下报错,说明 tun.ko 模块可能已存在,不需要重新编译
检查一下 TUN
1 | ls /dev/net/tun |
如果您在让 TUN 工作时遇到困难,请查看 Rui Marinho 的指南
创建 zerotier 镜像
创建一个文件夹用于挂载 zerotier-one 的配置文件和认证信息(我这里路径指定到我自己创建的 docker/zerotier 文件夹下)
1 | mkdir /volume1/docker/zerotier |
这里也可以直接在群晖 file Station 上创建,然后再文件夹属性中获取实际路径(建议使用这步,比较直观,不容易出错)
以下是 zerotier 官方给的注意: In the next step we bind mount to the host’s created above in order to store ZeroTier’s identity. This is not guaranteed to survive DSM updates. I would suggest placing this on an automatically-mounted volume where your other private user data resides. The location you choose to store your identities should be kept secure and never placed on a shared volume that others can access./var/lib/zerotier-one 译文版本: 在下一步中,我们将装载绑定到上面创建的主机,以存储 ZeroTier 的身份(我的理解是 config 配置和用户信息)。这不能保证在 DSM 更新后仍然有效(zerotier 自己也不确定,为了群晖更新后,会不会不再允许用户使用 zerotier 做内网穿透,毕竟 DSM7 之后,群晖直接不再支持 zerotier 的套件了,可能 zerotier 自己也感觉后续可能会被不再支持,故在此给用户打个预防针)。zerotier 建议将其放在其他私人用户数据所在的自动装载卷上。您选择存储身份(用户信息和 config 信息)的位置应保持安全,切勿放置在其他人可以访问的共享卷上。
构建 zerotier-one 镜像 (Repo: zerotier/zerotier-synologyzt)
1 | docker run -d \ --name zt \ --restart=always \ --device=/dev/net/tun \ --net=host \ --cap-add=NET_ADMIN \ --cap-add=SYS_ADMIN \ -v /volume1/docker/zerotier:/var/lib/zerotier-one zerotier/zerotier-synology:latest |
执行完,出现一串检验码即表示镜像部署启动成功,回到群晖管理页面,既可以看到多了一个群晖镜像;
配置 zerotier-one 加入网络,并配置 moon 节点
配置 zerotier-one 加入网络
使用以下命令检查 zerotier-one 的运行状态
1 | docker exec -it zt zerotier-cli status |
再使用以下命令加入你的 zerotier-one 网络(其中后面的 e5cd7a9e1cae134f 换成你自己的 zerotier-one 生成的网络 id)
1 | docker exec -it zt zerotier-cli join e5cd7a9e1cae134f |
当看到 200 join OK,既是表示加入网络成功,这时候登录 zerotier 控制台,即可看到网络列表多了一条未授权加入的网络,勾选允许其加入即可;
接下来在为 docker 环境下的 zerotier-one 添加 moon 节点
这个比较简单,直接在群晖 file station 下,找到你上面创建的 docker 文件夹下的 zerotier 文件夹,将你的 moon.d 拖拽进入即可
最后,重启 zerotier docker 容器,在 ssh 端执行以下命令,检查 moon 节点是否加载成功(看到多了 moon 的那行即表示成功)
1 | docker exec -it zt zerotier-cli listpeers |
最后在手机上使用 zerotier 分配的 ip 即可顺便在 4G 网络下接入局域网内的群晖了(前提是你的手机需要先安装 zerotier 客户端,并已加入同一个网络 id)