换宽带引起的折腾

搬新之后,新小区拉不了移动宽带,肉疼的拉了个300M的电信。想到电信宽带是有公网IP的,再想到原先用vultr的VPS+frp内网穿透代理方式的访问速度太感人,就想要直接使用公网IP访问nas的方式代替之。

简单配置光猫和路由器上的端口映射后,实测对nas的外网访问速度,在线看视频、上下传文件、远程桌面虚拟机再也不卡了👍。直接使用IP+端口号方式访问,虽然配置很简单,但是在浏览器里输入IP和端口号,强迫症是忍不了的,况且买了三五年的域名也不能浪费呀。那么问题来了,怎么折腾能直接用二级域名访问到我nas上的应用服务呢?

捋了一下手上现有的资源清单

VPS vultr上租的虚拟主机,含有公网IP + 80和443端口
xrr.fun 阿里云上租的域名
xurr.work 阿里云上租的域名
电信宽带 含有公网IP是动态分配的,在光猫的WLAN上,光猫可配置端口映射,但80和443端口被封
华硕路由器 路由器的WLAN口接在光猫的LAN口上
群晖NAS 白群晖,很多功能有待开发,通过有线接在路由器的LAN口上

电信宽带的IP默认是动态的

原先VPS的IP是固定的,在阿里云上做域名解析的时候,直接使用A记录的方式解析到这个IP就可以了。电信宽带的IP默认是动态分配的,可以打客服电话申请改为固定IP。但是使用固定IP不是我想要的,有些网站下载或其他其他操作的限制是根据公网上的IP来的,如果IP被限制了,只要重启下光猫分配我一个新IP就可以绕过限制,所以觉得还是得保留动态IP。

用动态IP就要做DDNS才方便,不然每次IP一变,就去阿里云改域名的A记录值,也是要逼shi懒人的节奏(网上搜索说阿里云提供了DDNS的SDK,但复杂啰嗦的配置也不是我想要的)。

群晖提供了动态域名解析的功能,配置路径在控制面板->外部访问->DDNS,一堆的DDNS服务商里选择了Synology,毕竟nas是他亲儿子,配置后,电信宽带动态IP就和设置的二级域名绑定了。然后在阿里云上配置购买的域名指向这个DDNS的二级域名,虽然这种域名解析转了两次,但是配置简单省钱😀。

电信宽带的80和443端口被封了

一开始的时候443端口没有被封,通过群晖的控制面板->应用程序门户->反向代理服务器,可以直接通过例如https://book.xrr.fun访问到我的书单。然鹅,没过两天,443端口也被封了。在浏览器地址栏里输入https://book.xrr.fun:4000的方式,实在没法忍,只能想其他办法了。

方法一

阿里云DNS解析中有显式转发和隐式转发两种方式可以设置,但是要求目标服务器做备案。简便的一种方法是购买阿里云的虚拟主机可以得到备案服务号,但是要新买一个vps,比较费钱,pass。

方法二

利用301、302跳转,配置点如下,

  • 在阿里云DNS配置book.xrr.fun指向vps的固定IP;
  • 在阿里云DNS配置book.xurr.work指向nas配置DDNS的二级域名;
  • 可选步骤:在nas上配置反向代理,将http的应用转到https及4000端口上;
  • vps上docker部署nginx,配置nginx将book.xrr.fun的访问转到https://book.xurr.work:4000。虽然跳转后浏览器地址栏显示的是https://book.xurr.work:4000,但是打开浏览器时只要输入book.xrr.fun就可以访问,还是很拯救强迫症的。第一次跳转可能需要花费几秒钟,之后访问就比较省时间了。

    修改nginx配置参考,打开默认配置文件/etc/nginx/default.conf,增加如下if配置段,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    server {
    listen 80;
    server_name localhost;

    if ($host = 'book.xrr.fun' ) {
    return https://book.xurr.work:4000;
    }

    ...
    }
  • 因为使用了https,所以还需要一个ssl证书。nas虽然提供了Let’s Encrypt的免费证书申请,但是浏览器中对这个证书还是会报不安全。阿里云提供了免费个人版的赛门铁克(Symantec)ssl证书购买,每个证书可以和一个一级或二级域名绑定,将证书下载后配置到nas中,浏览器中终于显示小绿锁,满满的安全。

跳转示例:http://book.xrr.fun

假装做个总结

换工作+新冠疫情的影响,过了毕业工作以来的最长的一个假期——2个月+,得重新折腾起来哇,折腾自己,人生就怕没有追求,将来需要的事,现在必须要着手准备。