群晖Synology docker部署私有zerotier-planet内网穿透

说明

群晖docker安装zerotier-planet客户端镜像,启动容器链接自建zerotier-planet节点,实现远程组网穿透内网及内网转发,外网访问群晖所在内网的其他设备。

安装启动

  1. 部署自有zerotier-planet服务,请参考项目主页docker-zerotier-planet

    • 下载planet,后面需要替换使用
      zerotier-planet信息
  2. 群晖上启动过程

    • 创建持久TUN
      通过 SSH 进入你的 NAS

      以下设置步骤必须以 root 身份运行

      编写/usr/local/etc/rc.d/tun.sh将/dev/net/tun在启动时设置的脚本

      echo -e '#!/bin/sh -e \ninsmod /lib/modules/tun.ko' > /usr/local/etc/rc.d/tun.sh

      设置脚本的可执行权限

      chmod a+x /usr/local/etc/rc.d/tun.sh

      运行脚本一次以创建 TUN

      /usr/local/etc/rc.d/tun.sh

      检查 TUN

      ls /dev/net/tun

      /dev/net/tun

      如果你在使用 TUN 时遇到问题,请查看Rui Marinho 的指南

    • 在NAS安装Docker

      Package Center -> Search “Docker” -> Install

      设置容器

      创建目录来存储 ZeroTier 的身份和配置

      mkdir /var/lib/zerotier-one

      警告

      在下一步中,我们将绑定挂载到/var/lib/zerotier-one上面创建的主机,以存储 ZeroTier 的身份。这不能保证在 DSM 更新后仍然有效。我建议将其放在自动挂载的卷上,您的其他私人用户数据也位于该卷上。您选择存储身份的位置应保持安全,并且切勿放在其他人可以访问的共享卷上。

    • 创建一个 Docker 容器并命名为zt(Repo: lance59/zerotier-planet )

    1
    2
    3
    4
    5
    6
    7
    8
    docker run -d           \
    --name zt \
    --restart=always \
    --device=/dev/net/tun \
    --net=host \
    --cap-add=NET_ADMIN \
    --cap-add=SYS_ADMIN \
    -v /var/lib/zerotier-one:/var/lib/zerotier-one lance59/zerotier-planet:latest
    • 查看节点状态
    1
    docker exec -it zt zerotier-cli status
    • 替换planet
      zerotier-planet信息

      1
      2
      3
      4
      5
      docker exec -it zt bash
      cd /var/lib/zerotier-one
      mv planet planet.bk
      wget <上图planet文件下载的地址>
      exit
    • 重启容器

      1
      docker restart zt
    • 加入你的网络

    1
    docker exec -it zt zerotier-cli join e5cd7a9e1cae134f

    “e5cd7a9e1cae134f”是zerotier-planet添加的网络ID

    • 退出加入的网络

      1
      docker exec -it zt zerotier-cli leave e5cd7a9e1cae134f
    • 在节点服务端上授权 NAS 。然后查看网络状态:

    1
    docker exec -it zt zerotier-cli listnetworks
    • 显示正在运行的容器(可选)
    1
    docker ps
    • 进入容器(可选)
    1
    docker exec -it zt bash
    • 要升级 ZeroTier,您需要停止并删除容器,然后拉取最新版本并启动一个新容器:
    1
    docker ps

    示例输出:

    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    52c7cb58a1dd lance159/zerotier-planet:latest “zerotier-one” 5 weeks ago Up 9 days zt
    • 停止容器
    1
    docker stop 52c7cb58a1dd
    • 取出容器
    1
    docker container rm 52c7cb58a1dd
    • 提取最新更新
    1
    docker pull lance159/zerotier-planet:latest

在外网访问群晖所在内网的其他设备

设置群晖的内网转发

  1. 使用SSH连接到NAS并切换到ROOT身份

  2. 启用IP转发(永久修改)

    1
    2
    3
    echo ‘net.ipv4.ip\_forward = 1’ | tee -a /etc/sysctl.conf  
    echo ‘net.ipv6.conf.all.forwarding = 1’ | tee -a /etc/sysctl.conf
    sysctl -p /etc/sysctl.conf

    第三行可能会执行失败,可以重启系统或者执行以下代码临时开启IP转发:

    1
    echo 1 > /proc/sys/net/ipv4/ip\_forward
  3. 设置NAT转发

    • 方式一(推荐

      1
      iptables -t nat -A POSTROUTING -o ! lo -j MASQUERADE
    • 方式二

    eth0为网卡名,如果是多网口的机器,请使用ifconfig查找自己机器的网卡名

    1
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
  4. 添加用户自定义脚本,使得启动时自动设置NAT转发

    操作路径:

控制面板->服务->任务计划->新增->触发的任务->用户自定义的脚本
常规->一般设置->事件->开机
任务设置->用户自定义的脚本,输入以下代码并确定

1
2
sleep 1m  
iptables -t nat -A POSTROUTING -o ! lo -j MASQUERADE

为保证开机启动已加载所有网络模块,延迟1分钟再添加NAT,否则会遇到模块不存在错误

客户端设置

MacOS客户端

步骤如下:
1. 进入 `/Library/Application\ Support/ZeroTier/One/` 目录,并替换目录下的 `planet` 文件
2. 重启 ZeroTier-One:`cat /Library/Application\ Support/ZeroTier/One/zerotier-one.pid | sudo xargs kill`
3. 加入网络 `zerotier-cli join` 网络 `id`
4. 管理后台同意加入请求
5. `zerotier-cli peers` 可以看到 `planet` 角色

安卓客户端配置

Zerotier 非官方安卓客户端

Linux客户端

步骤如下:
1. 安装linux客户端软件
2. 进入目录 `/var/lib/zerotier-one`
3. 替换目录下的 `planet` 文件
4. 重启 `zerotier-one` 服务(`service zerotier-one restart`)
5. 加入网络 `zerotier-cli join` 网络 `id`
6. 管理后台同意加入请求
7. `zerotier-cli peers` 可以看到 `planet` 角色

iOS 客户端配置

方案一: 越狱后安装ZeroTie,然后替换`planet`文件

方案二: 使用Wireguard接入到ZeroTier网络