本篇文章记录下,如何在外网访问群晖,并利用群晖来访问内网其他设备(以目前比较流行的虚拟局域网软件有ZeroTier和Tailscale为例)。 写在前面 异地访问NAS,常见的还是公网IP+DDNS或FRP方案,需要暴露较多的端口在公网上,因此考虑使用虚拟局域网组网。 个人使用感受: 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 授权入网 查看节点ID和状态 docker exec -it zt zerotier-cli status # 200 info c715e6680c 1.6.5 ONLINE # c715e6680c 为节点ID 加入您的网络 (替换成自己的网络ID) docker exec -it zt zerotier-cli join e5cd7a9e1cae134f 在管理后台(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 授权入网 执行以下代码,获取授权链接 docker exec ts tailscale up 复制并在浏览器打开授权链接,然后登录(鉴于国内环境,建议选择Microsoft)并授权 可以进入管理后台查看节点状态(https://login.tailscale.com/admin/machines) 可选操作 禁用授权自动过期(Tailscale的授权默认6个月过期) 操作路径:点击节点右侧『•••』->Disable key expiry
在外网访问群晖所在内网的其他设备 设置群晖 使用SSH连接到NAS并切换到ROOT身份 启用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 设置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 登录管理后台(https://my.zerotier.com/),进入NetWorks管理页面 在NetWorks->Advanced->Managed Routes添加子网路由规则即可 # 根据自己实际设置,第一个为群晖所在内网的IP段、第二个为ZeroTier分配给群晖的IP 10.10.2.0/24 via 10.10.10.10 设置Tailscale 设置子网路由(10.10.2.0/24为当前节点的内网段,自行替换) docker exec ts tailscale up --advertise-routes=10.10.2.0/24 --accept-routes 登录管理后台(https://login.tailscale.com/admin/machines)并启用该节点的子网: 操作路径:点击节点右侧『•••』->Edit route settings->启用子网 验证 在外网设备上配置好对应的虚拟局域网,然后就可以直接Ping群晖内网IP了 参考文章 群晖DSM7安装Docker版Zerotier教程(官方) Install ZeroTier For Synology NAS 群晖DSM7安装Docker版Zerotier教程(译文) https://zhuanlan.zhihu.com/p/479171790 外网使用内网IP访问全内网设备 https://post.smzdm.com/p/adwgkopd/ 扩展链接 详解+原理:基于Zerotier的虚拟局域网(内网穿透方案) https://zhuanlan.zhihu.com/p/383471270 中继+优化:基于Zerotier的虚拟局域网(VPS中继优化) https://zhuanlan.zhihu.com/p/431770438 ZeroTier 配置Moon节点 https://post.smzdm.com/p/allv5k6o/ 放弃moon节点,直接搭建Zerotier根服务器 https://post.smzdm.com/p/apxkx2m7/