背景

家用的宽带是联通的,自带公网 IP ,但是封锁了 80 端口和 443 端口,无法隐藏端口进行访问。因为前段时间一直在给 NAS 增加服务,都是通过公网 IP + 端口的形式通过路由器的端口映射访问服务,随着服务逐渐增多,端口名越来越乱,脑子快记不过来了

需求

能否通过不同域名的相同端口实现对不同服务的访问呢?比如我令 blog.xxx.xyz 和 git.xxx.xyz 两个域名都解析到我的公网 IP 上,但是 blog.xxx.xyz:8080 访问的是我自己的博客,而 git.xxx.xyz:8080 访问的是我的代码仓库

摸索

我的域名是阿里云上买的,首先搜到的方法是可以通过域名解析的 隐形URL 对域名转发到指定端口,很可惜这种方法需要对网站进行备案,而我的域名并不是用来建网站的,所以无法使用此方法

下一个思路是反向代理,关于正向代理与反向代理的相关介绍可以看这里:
反向代理为何叫反向代理? - 刘志军的回答 - 知乎

我个人的理解,反向代理本质上也是一种 NAT,类似于路由器上的端口映射,只不过反向代理可以将域名的指定端口映射到内网中的指定端口上,而威联通的 QTS 5.0 版本刚好更新了反向代理的功能,但我的 NAS 毕竟是放在内网里的,如果想要实现反向代理,需要将其设置为 DMZ 主机,刚好 TP-LINK 的路由器具有这个功能,所以到此为止一切顺利

但是有个很麻烦的问题就来了,映射之后服务的 web 端确实可以打开,但是也仅限于打开。比如博客这个服务,通过反向代理只能打开主页,却不能访问博文或跳转到其他子页面。究其原因,似乎是如果跳转到其他页面,反向代理会使用内网的路径访问,所以在外网无法正常访问。因为网上几乎搜不到任何相关案例,遂只能放弃。

但是反向代理这条路还没有走到头,于是我去简单学习了 nginx 反向代理,在 docker 中安装后,开始使用,起初也遇到了和上一段一模一样的问题,但是这次网上搜到了相关案例,并且解决了。但是接下来又出现了一个很致命的问题:外网无法访问内核!简单来说,博客可以正常跳转了,但是其他服务如jupyter notebook,无法正常使用内核。尝试解决半天无果,也只能放弃。

最后抱着试试看的心理安装了宝塔服务,相对于 nginx 来说图形化界面更方便操作一些,虽然用其反向代理的功能仍然无法满足需求,但是发现宝塔面板下有一个重定向的功能,完美满足了我的个人需求

正文

还是先用 Container Station 安装宝塔面板,我用的是 pch18/baota

在这里插入图片描述
创建 docker 时我用的是桥接模式,分配的 IP 地址为 192.168.2.6。如果使用 NAT模式,记得将所需端口映射一下。

创建完毕后,终端显示如下所示

在这里插入图片描述
然后登陆 web 端进行配置就可以了,web 端的端口为 8888,所以我的内网地址就是 192.168.2.6:8888

如果初始用户名和密码登不上去,终端里输入指令 bt 重置一下就好了

在软件商店安装一个 Apache 用来搭网站

在这里插入图片描述
如果安装的过程中提示需要先卸载 Nginx 的话,直接商店搜索然后卸载就好了

安装完成后,点击左侧导航栏的网站 - 添加站点

在这里插入图片描述
在这里插入图片描述

建好网站后,点最后面的设置 - 重定向(测试版)- 添加重定向

将域名转发到所需要的的端口就可以了,其他选项都默认

最后记得在路由器中将这个 docker 作为 DMZ 主机

然后再去访问相应的域名,就可以正常转发了

写在后面

这种方法的优缺点也简单总结一下

首先关于 DMZ 主机,虽然开放 DMZ 主机可以自由的通过外网访问内网设备,但也意味着设备完全暴露在互联网中了,可能会被不法分子盯上并恶意攻击,注意保护,可以关闭自己不需要的端口,只保留需要使用端口

关于宝塔面板的重定向功能,因为是重定向,简单理解就是你输入的域名变成了一个目录,实际访问的地址还是最初的 公网 IP + 端口的形式,所以在连接的速度和稳定性上并不会受第三方软件的影响,这点还是比较好的

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐