一、前言
众所周知,所有网络服务在运行时都需要监听端口号,例如通过http(s)://地址:端口
的格式可以用来访问某个网站。如果这个网站使用的是80/443这样的默认端口,在访问时还可以省略端口号,比如百度https://www.baidu.com
的地址实际上是https://www.baidu.com:443
,省略掉端口号可以让网址更加直观,还能方便记忆。
但在国内由于运营商的各种限制,就算申请到公网IP也会发现80/8080/443
等常用端口被禁用。如果想要开通必须给网站备案,然后向运营商提交申请。而很多人发现申请解除了限制过段时间也有可能又被莫名其妙关掉,非常麻烦。
二、解决方案
在这种情况下想要访问自建的网站会增加一些麻烦,实际上能使用的方式其实有很多,而且各有优劣。
方案/效果 | 操作难度 | 隐藏端口 | 访问速度 | 实现成本 |
---|---|---|---|---|
更换端口 | ⭐️ | 否 | 快 | 低 |
隐/显性URL记录 | ⭐️⭐️ | 是 | 快 | 低 |
Cloudflare代理 | ⭐️⭐️⭐️ | 是 | 慢 | 低 |
NPS/FRP内网穿透 | ⭐️⭐️⭐️⭐️⭐️ | 是 | 快 | 高 |
1. 更换端口
这个方案其实是最简单,也最没有技术含量的一种方法了。换一个端口号不会影响添加证书使用SSL,缺点就是没办法隐藏端口号。
2. 隐/显性URL记录
这个需要配置两条域名解析才可以达到效果,例如您的域名是example.com
,网站监听在12345
端口,最终想要用redir.example.com
访问网站:
主机名
a
-> 记录类型A/AAA
-> 记录值IP地址
主机名
redir
-> 记录类型隐/显性URL记录
-> 记录值http(s)://a.example.com:12345
在只配置了第一条的情况下,访问网站的地址是http(s)://example.com:12345
。但在配置了第二条之后,就可以使用redir.example.com
访问网站了。
但这种方式有致命的缺点,您会发现用配置隐性URL记录
的域名访问网站,无论在如何切换页面URL都是redir.example.com
,地址栏不会发生任何变化,也就意味着不能复制定位到指定页面的URL路径。如果用配置显性URL记录
的域名访问网站,地址栏会立即跳转到http(s)://a.example.com:12345
,根本达不到隐藏端口号的目的。
这是因为隐性URL记录
是将网站内容直接展示在当前页面下,就像是嵌套了个网页,无论怎么切换页面地址栏的URL都不会发生变化。而显性URL记录
是直接将页面重定向了记录值,会把真实的域名和端口暴露出来。
如果您的网站只有单个页面,不在乎URL地址是否变化,配置隐性URL记录
来达到效果会更合适。
需要注意的是不同的域名注册商记录类型名称会有差异,已知阿里和腾讯的域名解析支持配置
隐/显性URL记录
。
3. Cloudflare代理
关于赛博活佛的事迹大家可能已经听过不少了,使用Cloudflare解析域名可以使用免费的代理功能,访问网站会通过代理服务器中转请求,能达到隐藏网站的真实IP的效果,而且还提供免费的SSL证书和DDOS攻击防御。
Cloudflare代理在开启状态下,会先通过443
端口强制SSL连接中转服务器,再由中转服务器通过80/443
端口连接至网站。由于网站的80/443
端口不通,因此需要额外的配置修改代理服务器连接网站使用的端口。
切换加密模式
点击菜单SSL/TLS
-> 概述
-> 配置
,切换加密模式到完全(严格)
。
获取边缘证书
切换加密模式后,代理服务器与我们的网站之间也需要使用SSL加密,因此需要下载边缘证书并配置到网站。点击菜单SSL/TLS
-> 边缘证书
获取和下载,该证书是通配符证书,到期后会自动续订,无需定期更新。
创建规则
点击菜单规则
-> Orign Rules
-> 创建规则
,网站的端口以123456
为例。字段选择SSL/HTTPS
,重写到123456
。
在像实例图片这样配置后,访问https://test.myhs.cc
就相当于访问的是http://123.123.123.123:12345
,而且还是SSL加密连接。
如果只需要对某个特定的域名解析生效,还可以点击图中的
And
按钮添加主机名
规则。
该方法唯一的缺点就是代理服务器都在国外,访问速度很慢。如果想加速自己电脑的访问速度,可以通过测试工具获取访问速度最快的代理服务器IP并修改Hosts文件,就能加速访问网站。
4. NPS/FRP内网穿透
该方法的原理是通过有公网IP的服务器来中转请求,需要在服务器和网站所在的设备上分别配置好服务端和客户端。好处是允许网站所在设备没有公网IP,但需要额外的支出购买服务器。
由于博主在撰写时没有可以使用的服务器,所以在未经测试的情况下无法提供教程,您可以自行参阅项目文档: