群晖接入虚拟局域网:实现外网访问群晖和内网设备
本篇文章记录下,如何在外网访问群晖,并利用群晖来访问内网其他设备(以目前比较流行的虚拟局域网软件有ZeroTier
和Tailscale
为例)。
写在前面
异地访问NAS,常见的还是公网IP
+DDNS
或FRP
方案,需要暴露较多的端口在公网上,因此考虑使用虚拟局域网
组网。
个人使用感受:ZeroTier
稳定易用,但异网打洞成功率较低,且由于中继服务器在外国,中继后对速度较慢,要求高的可以尝试自建Moon/根服务器或采用双ZeroTier网络(参考扩展链接)。Tailscale
打洞成功率更高,支持MagicDNS
(https://tailscale.com/kb/1081/magicdns/),使用也很方便。
笔者由于目前使用环境是电信与联通组网,ZeroTier无法成功打洞,且暂不想折腾自建Moon,所以选用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和状态(c715e6680c 为节点ID)
docker exec -it zt zerotier-cli status
200 info c715e6680c 1.6.5 ONLINE加入您的网络 (替换成自己的网络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个月过期)
操作路径:后台->Machines
->点击节点右侧『•••』->Disable key expiry
启用MagicDNS(可使用用机器名作为域名访问设备
操作路径:后台->DNS
->Add nameserver
然后Enable MagicDNS
在外网访问群晖所在内网的其他设备
设置群晖的内网转发
使用
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 ! lo -j MASQUERADE
方式二
eth0为网卡名,如果是多网口的机器,请使用ifconfig查找自己机器的网卡名
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
添加用户自定义脚本,使得启动时自动设置NAT转发
操作路径:控制面板
->服务
->任务计划
->新增->触发的任务->用户自定义的脚本
常规->一般设置->事件->开机
任务设置->用户自定义的脚本,输入以下代码并确定
为保证开机启动已加载所有网络模块,延迟1分钟再添加NAT,否则会遇到模块不存在错误
sleep 1m
iptables -t nat -A POSTROUTING -o ! lo -j MASQUERADE
设置ZeroTier
登录管理后台(https://my.zerotier.com/),进入NetWorks管理页面
在
NetWorks
->Advanced
->Managed Routes
添加子网路由规则即可10.10.2.0/24 via 10.10.10.10
根据自己实际设置,第一个为群晖所在内网的IP段、第二个为ZeroTier分配给群晖的IP
设置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)并启用该节点的子网:
操作路径:后台->Machines
->点击节点右侧『•••』->Edit route settings
->打开对应子网前面的开关
验证
在外网设备上配置好对应的虚拟局域网客户端,然后就可以直接Ping群晖以及内网IP了
后记
本文外网访问内网设备的重点在于设置TUN
和设置内网转发
部分,虽然是以群晖为例,但各位也可以根据下方的官方文档稍加变通,应用于其他设备。Tailscale
与ZeroTier
还有其他强大的功能,大家可以自行探索。目前免费版额度均可满足个人使用,有额外需求的可以考虑它们的付费套餐。
参考链接
Tailscale官方安装文档 https://tailscale.com/kb/installation/
群晖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/
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
shootingzq
校验提示文案
hank2007
校验提示文案
百思买
校验提示文案
usee00123
校验提示文案
BanKnight
校验提示文案
Zerouscn
校验提示文案
值友3300060792
校验提示文案
jdstkxxzou
校验提示文案
我在东湖边上
校验提示文案
盗版方文山
校验提示文案
yinhao
校验提示文案
KG_KENN
校验提示文案
bhuang123
校验提示文案
怎样才能不重名
校验提示文案
yoyomomomo
校验提示文案
angussleeping
校验提示文案
wangmillion2009
校验提示文案
wangmillion2009
这一条执行不了 参考网上的帖子应该是
echo -e ‘#!/bin/sh -e \n insmod /lib/modules/tun.ko’ > /usr/local/etc/rc.d/tun.sh
校验提示文案
sjyh
校验提示文案
老而不朽
校验提示文案
yihonggz
校验提示文案
xiaoshang军
校验提示文案
老而不朽
校验提示文案
sjyh
校验提示文案
wangmillion2009
这一条执行不了 参考网上的帖子应该是
echo -e ‘#!/bin/sh -e \n insmod /lib/modules/tun.ko’ > /usr/local/etc/rc.d/tun.sh
校验提示文案
wangmillion2009
校验提示文案
angussleeping
校验提示文案
yoyomomomo
校验提示文案
怎样才能不重名
校验提示文案
bhuang123
校验提示文案
我在东湖边上
校验提示文案
jdstkxxzou
校验提示文案
usee00123
校验提示文案
值友3300060792
校验提示文案
KG_KENN
校验提示文案
Zerouscn
校验提示文案
百思买
校验提示文案
BanKnight
校验提示文案
hank2007
校验提示文案
yinhao
校验提示文案