在搭建好家里的存储系统之后,我遇到了一个新问题:如何在外部安全地访问这个系统。Qnap提供了一个名为myQnapCloud Link的服务,这与群晖的QuickConnect类似,可以通过NAT穿透和中继技术实现在互联网上访问家里的NAS。但我总觉得,把NAS直接暴露在公网上并不太安全。幸好,我家的网络可以获取公网IP地址,于是我决定采用DDNS结合自建SSL VPN的方式来访问家里的应用,这样既更安全,又能满足我的需求。
(一)购买域名
原本我考虑通过直接拨号SSL VPN来访问家里的应用,但很快意识到这样做并不理想,因为家里的IP地址是动态分配的,每天都在变,不可能时刻记住当前的IP地址。虽然Qnap提供了免费的DDNS服务,但这种服务只能提供一个域名,而且不易记忆。因此,我决定购买一个个人域名来解决这个问题。在网上搜索后,我发现NameSilo上的域名价格非常实惠,一个.top后缀的一级域名仅需1.88美元一年。经过一番考虑,我最终选定了一个我喜欢的名字,并购买了这个.top的一级域名。
一个需要注意的细节是,由于NameSilo的服务器位于国外,当在国内修改DNS记录时,这些更改在互联网上的生效时间可能会比较长。为了加快这一过程,可以把域名添加到国内的域名解析服务商进行管理。我选择使用的是Dnspod,因为它的操作步骤简单直观。首先,在Dnspod注册账号,并在域名管理界面添加你的域名。添加成功后,Dnspod会提示你需要到原域名解析商处修改NS(NameServer)记录。这时,只需登录到NameSilo的管理平台,找到你的域名,点击修改NameServer,然后将Dnspod提供的NS记录填入并保存即可。这样操作后,域名解析的速度会显著提升,特别是在国内访问时。
(二)部署DDNS-Go服务
首先,得在Dnspod上增加DNS记录。由于地址不固定,我们需要使用名为ddns-go的Docker应用来自动将动态IP注册到Dnspod。以Qnap为例:
在Qnap的APP Center中安装Container Station服务。
打开Container Station,点击“容器→创建”,在映像处输入jassy/ddns-go,然后点击“下一步”。
在配置容器页面,自定义容器名称后点击“高级设置”。
在高级设置中选择网络,选择Host模式(注意,我已经部署过,可能会提示端口冲突)。
在存储页面,添加卷时绑定装载主机路径。在主机处输入在NAS中预先创建的共享文件夹路径,在容器中输入
/Root,点击应用。
点击上一个窗口的“下一步”,再点击“完成”,此时容器应该已成功创建。
(三)配置DDNS-Go服务
在浏览器中输入http://[Nas的ip]:9876,即可访问ddns-go管理界面。
对于DNSPod:
登录DNSPod,创建API密钥。
点击头像→API密钥→DNSPod Token→创建密钥。
保存好ID和Token。
在ddns-go管理页面,输入ID和Token,填写IPv4框的Domain(如vpn.test.com" class=" external" target="_blank" rel="nofollow noreferrer" data-za-detail-view-id="1043" style="text-decoration-line: none; border-bottom: 1px solid rgb(129, 133, 143); cursor: pointer;">http://vpn.test.com),点击“Save”。ddns-go会自动在DNS上创建相应的记录。
(四)部署SSLVPN服务
在VPN选择上,我考虑了两个开源项目:OpenConnect Server(ocserv)和AnyLink。OpenConnect Server是一个功能丰富的SSL VPN解决方案,而AnyLink是基于ietf-openconnect协议开发的,具有Web管理界面,支持二次认证等功能。但由于AnyLink在基于DNS的隧道实现上有些问题,我最终选择了部署Ocserv。
部署Ocserv的步骤:
在Qnap或Windows的虚拟化服务上部署Linux系统(例如Rocky Linux)。
安装ocserv。
dnf install ocserv
配置ocserv,设置用户名密码认证、证书、隧道配置等。
vi /etc/ocserv/ocserv.conf
auth = "plain[passwd=/etc/ocserv/ocpasswd]"
tcp-port = 8443
#证书部分
#可以使用默认不受信任证书,也可以在dnspod申请免费证书上传到服务器替换
server-cert = /etc/letsencrypt/live/vpn.example.com/fullchain.pem
server-key = /etc/letsencrypt/live/vpn.example.com/privkey.pem
#隧道配置部分,用于基于域名进行隧道加密
split-dns = example.com
#sslvpn客户端获取的ip配置,可以自定义,如192.168.2.0,不能和内网网段冲突
ipv4-network = 192.168.2.0/24
#sslvpn客户端获取的dns
dns = 192.168.0.11
dns = 192.168.0.12
#sslvpn下发的路由配置,比如你家里的网段是192.168.0.0/24,那就填写如下
route = 192.168.0.0/255.255.255.0
#修改mtu
mtu = 1420
#关闭所有dns都基于隧道提供的dns进行解析。好处是如果家里有dns服务器,只有指定的域名才会通过SSLVPN下发的dns进行解析。
tunnel-all-dns = false
创建本地用户名密码。
$ sudo ocpasswd -c /etc/ocserv/ocpasswd username
Enter password:
Re-enter password:
启动并检查VPN服务。
systemctl start ocserv
systemctl status ocserv
设置防火墙策略,允许SSLVPN客户端访问内部网络。
#安装ufw防火墙工具
sudo apt update
sudo apt install ufw
配置规则
sudo ufw route allow in on ens3 out on ens3 from 192.168.2.0/24
sudo ufw route allow in on ens3 out on ens3 to 192.168.2.0/24
sudo ufw allow 8443/tcp
在路由器或光猫上设置NAT规则,暴露8443端口。我选择使用Cisco AnyConnect作为VPN客户端,安装完AnyConnect后双击打开,在文本框中输入自己的域名加上端口,点击Connect,在弹出的对话框中输入用户名和密码,点击确定,如果验证成功,则说明连接好了。
这个时候就能在浏览器访问内部nas了。
以上分享的观点和经验仅基于我的个人环境,可能并不适用于所有人。每个人的家庭网络配置、硬件条件和安全需求各不相同,因此我的解决方案可能不会完全符合其他人的实际情况。尽管如此,我希望我的经历能为他人提供一些灵感和参考,但在具体实施时,每个人都应根据自己独特的需求来调整和选择合适的方案。
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/6784.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~