今年春节,返乡过年的朋友应该都有不少吧?离开了常住的居家和办公环境,偶尔还是会碰到需要访问家中/公司设备的场景。或许是临时下载放在服务器中的文件,或许是连上住所的 NAS 和亲朋好友一起观看自己收藏的电影。

但对我来说,通过外网访问 NAS 的速度相比局域网总觉得差点意思,有没有更好的解决方案,让我身在异地也能像局域网访问那样用上家里设备呢?

这次我选择了软件定义广域网(SD-WAN)来解决这个问题,效果还算不错。通过虚拟化的技术,SD-WAN 将不同网络下的设备连接到一个局域网中,让不同设备之间高效互访。比起传统内网穿透进行跨网段设备访问,整体操作相对简单,用起来更加灵活,并且还有相当不错的访问稳定性。

本文介绍其中一种不花钱、但需要花点时间的配置方案,希望你下次也能用得上。

SD-WAN 简评

在 SD-WAN 解决方案这条赛道上,市面上目前可以选择的产品主要要有 Zerotier、Tailscale 以及蒲公英这么几款。

关联阅读:身处异地也能「内网办公」,这个技巧你的团队或许能用得上

Zerotier 和蒲公英少数派此前已有介绍,这里简单梳理一下这些方案的优缺点:

Zerotier

  • 优点:可直接使用官方提供的方案快速,同时支持私有化部署
  • 缺点:
    • 由于网络协议的限制,不同的网络运营商下设备连接存在较高延迟
    • 在群晖 DSM 7 上没有图形化客户端
    • 官方免费版存在组网限制

Zerotier 的原理其实很容易理解:通过根节点来创建一个中心服务器,加入其中的设备都需要和这个中心服务器通信,从而构建起一个虚拟局域网。由于中心服务器部署在海外,国内访问难免会出现不稳定的情况,跨运营商设备互访时丢包尤其严重。

Tailscale

  • 优点:跨运营商设备互访稳定性较好,客户端开源
  • 缺点:
    • 控制服务器非开源软件
    • 官方免费账户存在较多限制

相比 Zerotier,Tailscale 在底层网络逻辑上采用了 WireGuard 协议,因此不同运营商之间的设备互访的速度更佳,有公网 IP 时效果更为明显。不过和 Zerotier 的问题类似,由于中心服务器均部署在海外,网络不稳定的情况在所难免。

蒲公英

  • 优点:国内厂商出品,网络访问最为稳定
  • 缺点:免费版套餐设备限制较大,必须付费升级

蒲公英属于国内厂商推出的 SD-WAN,相比以上两款的海外 SD-WAN 服务,最大的优势就是中心服务器均在国内,因此单就从网络访问性上自然最佳;在没有公网 IP 的设备之间通过国内服务器进行中继服务可谓是相当稳定。不过它的缺点也很明显:免费套餐对设备限制较高,要想真正用起来必须付费。

综上,如果你想少折腾并且需要解决刚需,花点钱直接选择蒲公英付费即可。但如果你和我一样希望通过私有化部署免费、无限制地使用 SD-WAN,不妨跟随下面的流程手动配置一套属于自己的远程设备访问方案。

HeadScale 是什么

上面提到的服务中,Tailscale 和 Zerotier 其实都是商业化服务,免费账户服务基本够用,服务稳定性则是个大问题。

因此 Tailscale 很早之前就有了可以私有化部署的开源方案。此前由于底层网络协议的限制,私有化部署后跨运营商设备穿透失败的情况依然时有发生——直到 HeadScale 的出现。

boxcnX3biS2GqroUJ3UwnGJEFwF

Headscale 是欧洲航天局的 Juan Font 使用 Go 语言开发,在 BSD 许可下发布,它基本上实现了 Tailscale 控制服务器的所有主要功能,没有任何设备数量的限制,同时可以直接借用 Tailscale 的客户端来牵线搭桥。

它唯一的缺点是目前尚没有可视化界面,也无法直接使用 Tailscale 的 iOS 客户端。考虑到我主要想实现不同区域下桌面设备的互访,针对移动端的这个小缺点倒显得不那么重要。

另外,既然我们搭建服务最终目的是「免费无限制地使用」,这次:

  1. 不再云服务器来部署 HeadScale 控制服务器,而是使用家中的 NAS
  2. 需要提前联系运营商获取家中网络的公网 IP

满足这两个条件,接下来就就可以部署 HeadScale 了。


恭喜你找到了这篇文章的新春彩蛋!

感谢大家今年对少数派的支持,点击这里领取我们精心制作的红包封面(小提示:分享到微信的文章打开更方便)。

链接中包含的红包封面数量有限,如果你来晚了,不妨留意近期的其他文章。


在群晖上部署控制服务器

我家中主要是使用群晖 NAS,并且部署 HeadScale 控制服务器需要有公网 IP,因此我首先需要做的是设置 DDNS 并开启相应的端口映射。DDNS 设置的操作视设备而定,开启后记得映射 8881、9090 以及 50443 这三个端口即可。

boxcnab3Y2MUNu2KLuwtNxVTkxb

接着我们需要添加 HeadScale 的软件安装源,这里笔者我选择了「我不是矿神」提供的一个第三方源:打开群晖中的「套件中心」,然后在「设置」中切换到套件来源,新增一个新的套件来源。

boxcnnSkCyyDrVVU4AMtXbGGo7f

名称填写「inmk」就好,这里需要注意的是,如果群晖系统版本为 DSM 6.X,位置填写 https://spk.imnks.com/,如果是 DSM 7.x,位置则填写 https://spk7.imnks.com/

boxcniy3hf5LTqy4yyIzaHq2SPf

回到套件中心,点击左边侧边栏切换到「社群」,找到 HeadScale 软件点击下载并安装,如果弹出警告请点击同意并安装。安装完成后我们就可以在主菜单中看到 HeadScale 了。

boxcnHKvdCKkzyoissiQvn9Tztb

点击 HeadScale 我们可以看到一个参数设置页面,这里面我们需要将 server_url 后面的 127.0.0.1 修改成 DDNS 地址,后面的端口号保持不动。另外 listen_addr:metrics_listen_addr: 以及 grpc_listen_addr: 后面的 127.0.0.1 均改为 0.0.0.0。

最后直接点击保存,这时 HeadScale 服务会再次重启。

接下来我们需要创建一个分组空间来方便标识加入的设备。这里需要使用 SSH 终端来访问家中群晖,以 root 权限登录后,输入:

cd /var/packages/headscale/target/bin

我们这里创建一个名为 sspaihx 的分组空间,接下来输入:

headscale namespaces create sspaihx

紧接着我们查看一下这个命名空间是否创建成功了,输入:

headscale namespaces list

如果看到 Name 里面有我们创建的这个 sspaihx 的分组空间就表示分组空间已经创建成功,至此我们的 HeadScale 控制服务器就已经部署完毕了。

boxcn4qAeWgagT6hjlRTIRbmH8d

使用 Tailscale 客户端连接

创建好 HeadScale 控制服务器后,接下来就是将客户端连接上了。正如上面所言,我们在客户端上依旧可以使用 Tailscale 的客户端——但需要进行一番小改造。

将 Windows 客户端连接到 HeadScale 网络中

我们最常使用的桌面系统自然是 Windows。这里我们首先在桌面打开浏览器,然后使用浏览器访问:

http://刚才设置的 ip 或者域名:8881/windows

boxcnMl23LrApSNnCiMGdfg4IFZ

在打开的页面中下载一个注册表文件,然后将其导入到系统中。紧接着去 Tailscale 下载 Windows 客户端并安装,然后鼠标单击系统托盘处的 Tailscale 图标并选择 log in。此时会打开如下页面:

boxcnOy8WjylNre5RkBC4aPA2rc

复制 headscale -n  这一段命令,将其中的 NAMESPACE 替换成前面我们创建的分组空间名(sspaihx),然后再次打开 SSH 终端,使用 root 权限连接群晖并输入如下两段命令:

cd /var/packages/headscale/target/bin
headscale -n NAMESPACE nodes register --key nodekey:7f2fdxxxxxxxx

如果终端显示 registered 则表示设备已经加入,这时候在右键点击系统托盘处的 Tailscale 图标,然后点击 sspaihx 分组空间点击加入即可。

最后,我们回到 SSH 终端中输入:

headscale nodes list

如果看到当前已经有设备名单,则表示已经成功将 Windows 设备加入到 HeadScale 网络了。

boxcnUI6bfKypk73ujtwgVNvZQb

将群晖连接到 headScale 网络中

群晖既然可以作为控制服务器,当然也可以作为客户端连接到控制器中。其中控制服务器软件是 HeadScale,客户端则依旧是官方的 Tailscale 客户端。

boxcnmo60ty74ELF6B6v8bzqYEc

我们需要到打开群晖的「套件中心」然后直接搜索「Tailscale」下载安装,安装完成后打开 SSH 客户端,通过 root 账户连接到群晖上并输入如下两段命令:

cd /var/packages/Tailscale/target/bin
tailscale up --login-server=http://刚才设置的 ip 或者域名:8881 --accept-dns=false
boxcnWy3e7iHQL3R6UmyEnRY1If

输入完成之后终端会打印出一段网址,将其复制并使用浏览器打开——其实就和刚才 Windows 上的呈现的设备认证一样,同样是 headscale -n 一段命令,将其中的 NAMESPACE 替换成前面我们创建的分组空间名。然后在 SSH 终端输入如下命令:

cd /var/packages/headscale/target/bin
headscale -n NAMESPACE nodes register --key nodekey:7f2fdxxxxxxxx

回车后应该可以看到终端显示 registered,如果不确定是否加入,可以再用下面这条命令查看设备是否加入。

headscale nodes list

将 macOS 连接到 HeadScale 网络中

相比 Windows ,macOS 加入 HeadScale 网络中会略微有些复杂,这里首先需要使用浏览器打开:

http://刚才设置的 ip 或者域名:8881/apple

boxcnarU2G9IVxc89W3AsULWLhe

在这个页面中我们需要确定下载什么版本客户端,如果你有外区的 Apple ID 账号,这里可以直接选择 App Store 版本的 macOS 客户端,否则就只能选择 Standalone 客户端。

选择好客户端之后,首先下载对应版本的描述文件(Profiles)并双击导入系统,打开「设置 > 隐私与安全性 > 描述文件」,选择已下载的描述文件,双击安装并授权。

boxcnDADYX92neSALkezHVPcXAe

最后我们再安装并启动 Tailscale 客户端:在菜单栏中点击 Tailscale 图标,然后点击 log in 打开相应的设备认证页面。

boxcnUnN2hWMiHD6DIHNlhYWtGd

同样是 headscale -n 这段命令,将其中的 NAMESPACE 替换成前面我们创建的分组空间名。然后直接在 macOS 打开 SSH 终端,使用 root 账户连接群晖,输入如下命令完成设备授权:

cd /var/packages/headscale/target/bin
headscale -n NAMESPACE nodes register --key nodekey:7f2fdxxxxxxxx

回车后看到 registered 表示设备已经完成添加,这时候再输入:

headscale nodes list
boxcnnk40t4seUt5jSTu6IbGSxR

可以看到不同系统设备都已经加入到这个虚拟局域网中了,我们使用各自对应的 IP 互相 ping 一下,看看能否直接实现互访,比如使用这个内网 ip 访问群晖 DSM 系统。

boxcntYIfu5uXi4SHcFfQolR6Mh

结语

通过以上方案,基于 DDNS + 动态公网 IP,在没有花费一分钱的情况下,我们实现了诸多商业 SD-WAN 软件才能获得互联效果。这种方案不仅没有设备数量限制,同时也有着不错的跨运营商互访稳定性。

另外,如果你的资金或者条件允许,也可以尝试直接购买一台云服务器来部署 HeadScale,具体的方法可以参考 GitHub

参考链接:

> 下载 少数派 2.0 客户端、关注 少数派公众号,解锁全新阅读体验 📰

> 实用、好用的 正版软件,少数派为你呈现 🚀