25
2024
06
00:20:24

通过自建SSLVPN访问家里的NAS



推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

在搭建好家里的存储系统之后,我遇到了一个新问题:如何在外部安全地访问这个系统。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;">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 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

您的IP地址是: