1. 服务器/VPS/主机用户Telegram电报群: https://t.me/openos
    黑群晖 Synology Telegram电报群: https://t.me/nasfan
    排除公告

群晖接入虚拟局域网:实现外网访问群晖和内网设备

本帖由 NowAnti2022-06-30 发布。版面名称:群晖 Synology DSM

  1. NowAnti

    NowAnti New Member

    注册:
    2022-06-23
    帖子:
    4
    本篇文章记录下,如何在外网访问群晖,并利用群晖来访问内网其他设备(以目前比较流行的虚拟局域网软件有ZeroTierTailscale为例)。
    写在前面

    异地访问NAS,常见的还是公网IP+DDNSFRP方案,需要暴露较多的端口在公网上,因此考虑使用虚拟局域网组网。
    个人使用感受:
    ZeroTier老牌稳定,功能强大易用,但异网打洞成功率较低,且由于中继服务器在外国,中继后对速度较慢,要求高的可以尝试自建Moon/根服务器或采用双ZeroTier网络(参考扩展链接)。
    Tailscale打洞成功率更高,但测试中在网络里能发现NAS的SMB,却无法直接双击设备名链接(在ZeroTier中正常)
    笔者由于目前使用环境是电信与联通组网,ZeroTier无法成功打洞,所以暂用Tailscale
    准备工作

    • 由于 DSM 7 不允许第三方应用直接使用root权限运行,因此使用Docker安装。
    • 本文在容器上执行的所有操作都通过 Docker CLI 完成。
    • 本文均为在DSM7下操作,理论上可以兼容DSM6(未测试)。
      创建持久性 TUN

      使用SSH 连接到NAS
      ssh user@local-ip -p 22

      以下设置步骤必须以 root 用户身份运行
      sudo -i

      写入脚本,使得设备启动时调用/dev/net/tun
      echo -e '#!/bin/sh -e \ninsmod /lib/modules/tun.ko' > /usr/local/etc/rc.d/tun.sh


      给这段脚本添加权限(其实应该先vi这个空的脚本,然后添加权限,最后在写入上面的脚本内容,不然会提示你readonly)
      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


      在 NAS 上安装 Docker

      打开套件中心->搜索Docker->安装
      ZeroTier的安装和配置

      设置容器

      创建目录以存储ZeroTier的身份和配置
      mkdir /volume1/docker/zerotier-one

      创建ZeroTier容器,命名为zt(Repo: zerotier/zerotier-synology)
      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-one:/var/lib/zerotier-one zerotier/zerotier-synology:latest


      授权入网
    1. 查看节点ID和状态
      docker exec -it zt zerotier-cli status
      # 200 info c715e6680c 1.6.5 ONLINE
      # c715e6680c 为节点ID
    2. 加入您的网络 (替换成自己的网络ID)
      docker exec -it zt zerotier-cli join e5cd7a9e1cae134f
    3. 在管理后台(https://my.zerotier.com/),对 NAS 进行授权和分配ID。
      ZeroTier管理后台的其他设置和详细用法可以参考官方文档或者网上其他教程
    常用命令

    # 查看节点状态
    docker exec -it zt zerotier-cli status
    # 查看网络状态
    docker exec -it zt zerotier-cli listnetworks
    # 显示正在运行的容器(可选)
    docker ps
    # 输入容器(可选)
    docker exec -it zt bash

    Tailscale的安装和配置

    设置容器

    创建目录以存储Tailscale的身份和配置
    mkdir /volume1/docker/tailscale

    创建Tailscale容器,命名为ts(Repo: tailscale/tailscale)
    docker run -d \
    --name ts \
    --restart=always \
    --device=/dev/net/tun \
    --net=host \
    --cap-add=NET_ADMIN \
    --cap-add=SYS_ADMIN \
    -v /volume1/docker/tailscale:/var/lib/tailscale tailscale/tailscale:stable

    授权入网

    1. 执行以下代码,获取授权链接
      docker exec ts tailscale up
    2. 复制并在浏览器打开授权链接,然后登录(鉴于国内环境,建议选择Microsoft)并授权
    3. 可以进入管理后台查看节点状态(https://login.tailscale.com/admin/machines
      可选操作
    • 禁用授权自动过期(Tailscale的授权默认6个月过期)
    操作路径:点击节点右侧『•••』->Disable key expiry
     
  2. NowAnti

    NowAnti New Member

    注册:
    2022-06-23
    帖子:
    4
    在外网访问群晖所在内网的其他设备

    设置群晖
    1. 使用SSH连接到NAS并切换到ROOT身份
    2. 启用IP转发(永久修改)
      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转发:
      echo 1 > /proc/sys/net/ipv4/ip_forward
    3. 设置NAT转发
      iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
      命令中的eth0为网卡名,如果是多网口的机器,请使用ifconfig查找自己机器的网卡名
    • 添加用户自定义脚本,使得启动时自动设置NAT转发
    操作路径:
    控制面板->服务->任务计划->新增->触发的任务->用户自定义的脚本
    常规->一般设置->事件->开机
    任务设置->用户自定义的脚本,输入以下代码并确定
    sleep 1m:为保证开机启动已加载所有网络模块,延迟1分钟再添加NAT,否则会遇到模块不存在错误
    sleep 1m iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

    设置ZeroTier
    1. 登录管理后台(https://my.zerotier.com/),进入NetWorks管理页面
    2. NetWorks->Advanced->Managed Routes添加子网路由规则即可
      # 根据自己实际设置,第一个为群晖所在内网的IP段、第二个为ZeroTier分配给群晖的IP 10.10.2.0/24 via 10.10.10.10
      设置Tailscale
    3. 设置子网路由(10.10.2.0/24为当前节点的内网段,自行替换)
      docker exec ts tailscale up --advertise-routes=10.10.2.0/24 --accept-routes
    4. 登录管理后台(https://login.tailscale.com/admin/machines)并启用该节点的子网:
    操作路径:点击节点右侧『•••』->Edit route settings->启用子网
    [​IMG] [​IMG]
    验证
    在外网设备上配置好对应的虚拟局域网,然后就可以直接Ping群晖内网IP了

    参考文章
    1. 群晖DSM7安装Docker版Zerotier教程(官方) Install ZeroTier For Synology NAS
    2. 群晖DSM7安装Docker版Zerotier教程(译文) https://zhuanlan.zhihu.com/p/479171790
    3. 外网使用内网IP访问全内网设备 https://post.smzdm.com/p/adwgkopd/
      扩展链接
    4. 详解+原理:基于Zerotier的虚拟局域网(内网穿透方案) https://zhuanlan.zhihu.com/p/383471270
    5. 中继+优化:基于Zerotier的虚拟局域网(VPS中继优化) https://zhuanlan.zhihu.com/p/431770438
    6. ZeroTier 配置Moon节点 https://post.smzdm.com/p/allv5k6o/
    7. 放弃moon节点,直接搭建Zerotier根服务器 https://post.smzdm.com/p/apxkx2m7/
     
    已获得 tingqin 的点赞。
  3. tingqin

    tingqin Member

    注册:
    2022-06-21
    帖子:
    36
    我是家里和办公室的路由器都安装了zerotier插件并允许访问LAN资源,实现两个地方互相访问。手机上再安装了一个zerotier软件,在外面需要的时候用
     
  4. NowAnti

    NowAnti New Member

    注册:
    2022-06-23
    帖子:
    4
    对于有路由器权限的确实是最完美的方式。装在内网其他机器上的方式虽然可以访问对方内网资源,但缺陷就是当前机器必须也安装客户端并接入了虚拟局域网