群晖NAS经验谈-4: 如何使用https访问

前言

通过前几篇教程,相信你已经对群晖NAS的强大功能有了深刻印象。那些眼疾手快的客官此刻一定已经入手了属于自己的群晖,当一切都准备妥当之后,如何从公网安全地访问数据便成了当务之急。

本文首先简明扼要地介绍使用https安全访问互联网的基本原理(各种细节还请大家自行谷歌),帮助那些喜欢刨根问底的同学理清脉络。然后便从群晖现有提供的设置入手,讲解通过https访问群晖的各种方法及相关配置。这里可能会涉及群晖NAS所在网络的拓扑结构,因此具体设置还应该根据你的实际情况进行微调。

我们开始吧。

如何安全访问网络

可以把访问互联网想象成送快递,作为一个快递员,送快递的过程中你需要解决的三个核心问题是:

  1. 如何找到快递接收方
  2. 如何到达快递接收方所在地
  3. 如何确保快递的安全

如何找到快递接收方

在任何网络中,都需要唯一标识来标记一个个实体。互联网中,这样的标识就是IP地址。因为IP地址是一串数字编码,为了方便记忆,通常我们会通过域名系统(DNS)将数字编码映射成可读性高的英文字母,例如通过在命令行中输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>> dig google.com.tw

; <<>> DiG 9.10.6 <<>> google.com.tw
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6218
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;google.com.tw. IN A

;; ANSWER SECTION:
google.com.tw. 299 IN A 172.217.1.131

;; Query time: 384 msec
;; SERVER: 10.8.0.1#53(10.8.0.1)
;; WHEN: Thu Apr 08 13:51:20 CST 2021
;; MSG SIZE rcvd: 58

从结果中可以发现google.com.tw这个域名映射的是172.217.1.131这个地址。

在浏览器中,我们通常通过输入网站的域名来访问具体的网站。

关于DDNS

既然提到DNS域名服务,就免不了介绍DDNS动态域名解析服务。由于个人家庭一般使用PPPoE协议接入互联网,获得的外网IP是动态变化的。因此需要一个本地客户端在感知到外网IP变化后及时通知DNS服务商修改DNS记录(即修改域名映射到的公网IP地址),这就是DDNS。

如何到达快递接收方所在地

互联网中传递数据和现实生活中在一级级大大小小的快递站点间传递货物非常相似。每个路由器就是一个快递站点,根据数据包的目的IP地址路由器会判断哪一个相邻的路由器该接手下一跳传递。这些路由器按树状层次组织起来,就像现实生活中的省市区,按照所管辖区域由大到小各司其职。

由于这部分不是本文的重点,具体实现细节还请参考TCP/IP

如何保证安全

这里的安全指如何保证我们传递的数据不被窥探,篡改。

我猜你直接想到的一定是加密,bingo!没错,https的确是一种基于加密的传输协议,简单来说:

  1. 通过非对称加密技术在建立连接的过程中确认身份,并传输随机生成的密钥
  2. 通过密钥在发送端加密内容,传输给目标后再进行解密

这里就需要重点提一下非对称加密了,它由一对公钥(对外公开)和私钥(需要保密)构成,由其中一把钥匙加密的信息必须由另一把钥匙才能解密,这就形成了两种使用模式:

  1. 数字签名:个人或者机构先计算信息的摘要(哈希值),再用私钥加密该哈希值得到签名,将签名和信息内容一同发布。公众先对信息计算得到摘要,并通过对应公钥进行解密得到的哈希值进行比较,如果一致确认该信息由该机构发布且未经篡改。
  2. 安全传输:使用公钥加密信息后发布,只有对应机构或者个人使用私钥才能解密,确保信息在不安全信道传输时的安全。

另外,如果一个权威机构使用自己的私钥将一个网站的公开信息(网站域名/公钥等)进行加密得到的就是这个网站的电子证书。
当我们在浏览器中通过https协议访问网站时,在建立连接这一步被访问站点会将自己的证书一同发送过来。此时浏览器通过操作系统内置的权威机构私钥来验证证书的有效性,进而确认该网站的公开信息的有效性。

因此,通过https安全访问群晖NAS的关键是拥有自己的域名证书

如何获得域名证书

购买域名

如果想彰显个性,大陆用户可以在阿里云上购买自己的域名并进行解析,个人则更推荐国外服务商Name.com

获取域名证书

目前从Let’s Encrypt申请为期3个月的免费证书是最经济的域名证书获取方案,在图1的设置中,群晖提供了一步步生成Let’s Encrypt证书的向导(有兴趣的同学可以自行查阅DSM自带帮助说明)。遗憾的是,群晖证书向导目前只支持通过访问80端口验证域名所有权,因此对于大陆的普通家庭用户来说并不可行。

图1 创建证书向导

为了解决这个问题,有兴趣的同学可以参看我这篇文章,了解在群晖NAS上如何自动化部署域名证书。

群晖内置的外部访问方法

在介绍具体方法前,为了启用https,请在控制面板中设置强制https访问(图2):
图2 强制https访问

QuickConnect

QuickConnect是由群晖官方提供的一种外部访问方式,特点是配置简单,效率高。所有群晖提供的手机端应用(Drive/Moments等等)默认使用这种方式和NAS连接交互。注意天朝用户如果需要使用这项服务,需要备案自己的手机号。

配置步骤

  1. 创建QuickConnect ID
    首先需要在图3所示的设置面板中创建属于你的QuickConnect ID并启用QuickConnect服务。
    图3 创建QuickConnect ID

  2. 配置自定义域名和端口号(可选)
    接下来,如果你已经拥有自己的专属域名,可以在图4所示的设置面板中配置。
    图4 配置外部域名和端口号

如此简单两个步骤,你就可以在浏览器中通过http://quickconnect.to/quickconnect_id或者http://quickconnect_id.quickconnect.to访问自己的NAS了。

原理

通过查看白皮书,可以发现QuickConnect通过中间人的模式以及步退策略实现了外网和群晖NAS的通信。

  1. 上文提到的配置过程会将群晖NAS所在的网络环境(外网域名/端口/内外网IP地址)等信息同步到群晖部署的QuickConnect服务器上
  2. 客户端浏览器发起访问时,脚本(Serv.php)在浏览器获取到上述信息,并进行判断:
    2.1 如果NAS在LAN可达,则跳转地址http://192.168.x.x:port进行访问,否则
    2.2 如果配置了外网域名,则跳转地址https://domain:port进行访问,否则
    2.3 采用Hole punching,尝试在客户端浏览器和NAS间建立直接连接,否则
    2.4 通过群晖提供的中继服务直接在浏览器中访问,此时地址不变(quickconnect_id.quickconnect.to

值得一提的是,2.1/2.2/2.3中都是浏览器到NAS之间直接建立连接;2.4中采用的则是两个连接,数据从NAS发送到群晖的服务器,再由群晖的服务器中继到用户浏览器。因此2.4的延迟肯定至少两倍于前几者。

使用DDNS访问

上文已经介绍过DDNS的作用,如果配置得当,在公网可以直接通过域名高效地访问群晖NAS。相应的,应用这种方法的前提是在路由器上配置好NAS的端口映射(NAT)。具体操作还请移步参考我的这篇文章。

具体实践过程中,在控制面板中既可以选择群晖自带的DDNS服务(图5所示),也可以选择其它的DDNS服务商(例如DNSPod.cn)。
图5 群晖自带DDNS服务

最后,笔者发现,如果在家用路由器上设置了酸酸/酸酸乳,群晖NAS运行的DDNS客户端拿到的外网IP会变成酸酸/酸酸乳所在机器的IP,从而错误地更新域名对应的IP地址。这应该和群晖内部获取外部IP时所访问的站点命中酸酸/酸酸乳的代理规则所致,对应的解决方法可把DDNS客户端放在路由器上运行。

总结

文章最后罗列一下从外部通过https访问群晖的各种方法以及优缺点:

方法 优点 缺点
QuickConnect 配置最简单,系统自带 传输速度低
DDNS 传输速度高 配置复杂,至少需要配置上一级路由器(端口转发)以及自备域名及证书

推荐阅读

系列相关

  1. 群晖NAS经验谈-1: 功能及选购
  2. 群晖NAS经验谈-2: 搭建家庭数据中心(备份篇)
  3. 群晖NAS经验谈-3: 搭建家庭数据中心(应用篇)