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

2022-07-01 15:45:43 92点赞 916收藏 45评论

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

本篇文章记录下,如何在外网访问群晖,并利用群晖来访问内网其他设备(以目前比较流行的虚拟局域网软件有ZeroTierTailscale为例)。

写在前面

异地访问NAS,常见的还是公网IP+DDNSFRP方案,需要暴露较多的端口在公网上,因此考虑使用虚拟局域网组网。
个人使用感受:
ZeroTier稳定易用,但异网打洞成功率较低,且由于中继服务器在外国,中继后对速度较慢,要求高的可以尝试自建Moon/根服务器或采用双ZeroTier网络(参考扩展链接)。
Tailscale打洞成功率更高,支持MagicDNShttps://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

授权入网

  1. 查看节点ID和状态(c715e6680c 为节点ID)

    docker exec -it zt zerotier-cli status
    200 info c715e6680c 1.6.5 ONLINE

  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个月过期)

操作路径:后台->Machines->点击节点右侧『•••』->Disable key expiry

  • 启用MagicDNS(可使用用机器名作为域名访问设备

操作路径:后台->DNS->Add nameserver然后Enable MagicDNS

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

设置群晖的内网转发

  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

  1. 设置NAT转发

  • 方式一(推荐

    iptables -t nat -A POSTROUTING -o ! lo -j MASQUERADE

  • 方式二

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

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

  1. 添加用户自定义脚本,使得启动时自动设置NAT转发

操作路径:
控制面板->服务->任务计划->新增->触发的任务->用户自定义的脚本
常规->一般设置->事件->开机
任务设置->用户自定义的脚本,输入以下代码并确定
为保证开机启动已加载所有网络模块,延迟1分钟再添加NAT,否则会遇到模块不存在错误

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

设置ZeroTier

  1. 登录管理后台(https://my.zerotier.com/),进入NetWorks管理页面

  2. NetWorks->Advanced->Managed Routes添加子网路由规则即可

    10.10.2.0/24 via 10.10.10.10

根据自己实际设置,第一个为群晖所在内网的IP段、第二个为ZeroTier分配给群晖的IP

设置Tailscale

  1. 设置子网路由(10.10.2.0/24为当前节点的内网段,自行替换)

    docker exec ts tailscale up —advertise-routes=10.10.2.0/24 —accept-routes

  2. 登录管理后台(https://login.tailscale.com/admin/machines)并启用该节点的子网:

操作路径:后台->Machines->点击节点右侧『•••』->Edit route settings->打开对应子网前面的开关

验证

在外网设备上配置好对应的虚拟局域网客户端,然后就可以直接Ping群晖以及内网IP了

后记

本文外网访问内网设备的重点在于设置TUN设置内网转发部分,虽然是以群晖为例,但各位也可以根据下方的官方文档稍加变通,应用于其他设备。
TailscaleZeroTier还有其他强大的功能,大家可以自行探索。目前免费版额度均可满足个人使用,有额外需求的可以考虑它们的付费套餐。

参考链接

  1. Tailscale官方安装文档 https://tailscale.com/kb/installation/

  2. 群晖DSM7安装Docker版Zerotier教程(官方) Install ZeroTier For Synology NAS

  3. 群晖DSM7安装Docker版Zerotier教程(译文) https://zhuanlan.zhihu.com/p/479171790

  4. 外网使用内网IP访问全内网设备 https://post.smzdm.com/p/adwgkopd/

扩展阅读

  1. 详解+原理:基于Zerotier的虚拟局域网(内网穿透方案) https://zhuanlan.zhihu.com/p/383471270

  2. 中继+优化:基于Zerotier的虚拟局域网(VPS中继优化) https://zhuanlan.zhihu.com/p/431770438

  3. ZeroTier 配置Moon节点 https://post.smzdm.com/p/allv5k6o/

  4. 放弃moon节点,直接搭建Zerotier根服务器 https://post.smzdm.com/p/apxkx2m7/

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
44评论

  • 精彩
  • 最新
  • 不想公开端口,openvpn不就得了,还能证书,随便找个openwrt的路由器点选几步就可以了。

    校验提示文案

    提交
    首先,OpenVpn的部署并不比这俩个要容易;其次,当没有公网IP的时候,打洞和互通还是要引入其他服务器;再者,如果你能控制两边的路由器,那直接选择带有ZeroTier插件的OpenWrt会更容易。所以说,使用群晖的方案,有它存在的必要性,很普遍的应用场景:当你控制不了公司的路由的时候,本文的方案应该是相对易用的。

    校验提示文案

    提交
    单部署的话,openvpn挺简单的,前两天我刚弄过,几分钟就完事儿了😂😂,当然除部署在也存在你说的其他问题,这就看大家自身网络情况了。至于公网ip➕ddns,针对公开端口问题,其实并没有公开所有端口,你不在路由器做端口转发是根本进不来,所以你把想外网的做转发,其他的不做就行了。当然这个方案也有网络要求问题,也看自身的条件了。

    校验提示文案

    提交
    收起所有回复
  • 最近用的zerotier,虚拟网络带宽显示100mbps,在外面连接后测速基本能跑到80mbps,完全够用了。 [傻笑]

    校验提示文案

    提交
    [喜极而泣] ZeroTier在能打洞成功的情况下,易用性方面的体验还是很棒的。我改用Tailscale也是迫于ZeroTier异网打不通。。。

    校验提示文案

    提交
    打洞不成功主要看NTA,电信两个不同市延迟在10左右,电信和联通都有公网ip情况下延迟在20左右 [邪恶]

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • 买nas还是慎重选择,不要轻信营销号啊,我就被坑,具体牌子就不说了

    校验提示文案

    提交
    [小眼睛] 我玩的蜗牛星际

    校验提示文案

    提交
    自己组服务器,我用的是unraid虚拟黑裙 [ok了]

    校验提示文案

    提交
    还有4条回复
    收起所有回复
  • wireguard也看网络环境,起码在广东的移动网络下不好用,协议特征太明显,运营商直接对udp包限流,我连接上2分钟就给我断了,后面再也连不上,后台日志握手成功但是就无法传输数据

    校验提示文案

    提交
    那可以试试zerotier噢,它不是基于wg的

    校验提示文案

    提交
    最后还是用OP

    校验提示文案

    提交
    收起所有回复
  • 对了,为何tailscale打洞成功率更高呢

    校验提示文案

    提交
    Tailscale 在用户态对 NAT 穿透做了很多优化,他们还专门写了一篇文章介绍 NAT 穿透的原理:去看看

    校验提示文案

    提交
    收起所有回复
  • 搞了个魔法服务端映射了端口,客户端对内网地址走代理,体验也不错

    校验提示文案

    提交
    展开来说说

    校验提示文案

    提交
    比如做好了ddns后,映射魔法端口8388出去,客户端配置192.168.0.0/16走这个端口,就和在内网体验一样了

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • 有公网IP的情况下,架个家挺VPN不好吗 [阴笑]

    校验提示文案

    提交
    看场景吧。家里,我个人主路由求稳,用的硬的不刷OP,所以是群晖跳转;公司,没有路由管理权,通过办公室服务器跳转。以上两种情况,使用虚拟局域网体验可以的。

    校验提示文案

    提交
    收起所有回复
  • 博主咨询下,我是群晖,docker部署zerotier,只要docker一关机重启,再用 zerotier的join命令就返回500,每次都得重建docker,感觉是没有加你用ssh做的那几个命令,是这样么?谢谢

    校验提示文案

    提交
    曾经试过那几个命令,但是tun.ko貌似找不到。

    校验提示文案

    提交
    echo -e ‘#!/bin/sh -e ninsmod /lib/modules/tun.ko’ > /usr/local/etc/rc.d/tun.sh
    楼主这个脚本肯定不对,这个是注释了的。
    echo -e ‘#!/bin/sh -e \n insmod /lib/modules/tun.ko’ > /usr/local/etc/rc.d/tun.sh

    校验提示文案

    提交
    还有2条回复
    收起所有回复
  • tailscale特别好用,特别是现在可以转发整个网段,美滋滋

    校验提示文案

    提交
  • 先收藏,有空看

    校验提示文案

    提交
  • 支持一下。目前zerotier加自建moon,很稳定。

    校验提示文案

    提交
  • zerotier 可以自建中转服务器 缺点是不能ios 主要ios 不能用自定义的planet 其他平台都是完全可用

    校验提示文案

    提交
  • zertier已经组了一年半了,非常稳定,外网情况下跑满宽带上传,不过我是借助了第三方vps做moon节点,三网运营商下,随便上传下载

    校验提示文案

    提交
  • Ssr服务器回家也挺好用,配置比openvpn方便

    校验提示文案

    提交
  • Tailscale上手感觉比zerotier难一点,但是用好了真心舒服,打洞成功率高,配置也更简单,再家里openwrt上装一个,然后在公司电脑和手机都能畅快访问家庭内网了,看电影竟然可以跑满带宽

    校验提示文案

    提交
  • 大佬,你的zerotier还好用吗,我的pc端显示requesting_configuration,连不上了,只有nas还正常,阿里云,pc,手机,都显示online,不显示物理ip了

    校验提示文案

    提交
  • 谢谢楼主发帖。能否简要说下设置tun和内网转发作用是什么? 因公司网络复杂、个人不能控制路由器、外网访问有很多限制,这个方案是否合适在公司访问家里的网络设备?以前在家里op设置好wireguard节点,公司安装客户端一直连不上 现在想试试别的法子

    校验提示文案

    提交
  • echo -e ‘#!/bin/sh -e ninsmod /lib/modules/tun.ko’ > /usr/local/etc/rc.d/tun.sh
    这一条执行不了 参考网上的帖子应该是
    echo -e ‘#!/bin/sh -e \n insmod /lib/modules/tun.ko’ > /usr/local/etc/rc.d/tun.sh

    校验提示文案

    提交
  • 为啥不把路由器接入虚拟网?

    校验提示文案

    提交
  • open#v#p#n配置一分钟的事情,只需要暴露一个用于open#v#p#n的端口+ddns就能访问到所有内网服务了,再加个两步验证,应该是比较安全了

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章

NowAnti

Ta还没有介绍自己

关注 打赏
最新文章 热门文章
916
扫一下,分享更方便,购买更轻松