前言
上一篇《树莓派4B记录——NO.1 - 初始化篇》已经介绍了如何将新到手的树莓派配置成NodeJS+MySQL+Nginx的开发环境。
假定此时,你已经完成了Web服务的搭建(或者安装完Nginx即可),通过内网IP,在浏览器中可以打开网页。
本篇将介绍如何在外网打开我们的Web服务。主要分为以下几步:
- 宽带IP私网转公网
- 设置DMZ和端口映射
- DDNS动态域名解析
- 隐藏端口
备注:网上有内网穿透的教程,即没有公网IP,利用花生壳等工具来实现。比较适合一对一的访问,即访问者和内网服务提供者都需要配置花生壳的服务,才能实现穿透访问。但是我们这里需要实现的是Web服务器,让每个访问者都配置穿透,不现实。故这里不介绍。
宽带IP私网转公网
万里长征第一步,也是最关键的一步。要想外网访问你的Web服务,你必须有自己的公网IP。
我家里是合肥电信100M宽带,默认给的是私网IP。各位如无意外,各个运营商给的99.99%是私网IP,所以需要申请开通公网IP。以下是本人操作的具体步骤:
- 电话10000号打给客服,告诉服务小姐姐你需要私网转公网。
此时客服不会多问,给你提工单。 - 第二天会有客服电话打给你,让你去大营业厅去办理“修改终端拨号并发数”。
原来私网模式下我们家庭宽带默认拨号并发数是4个,也就是在你家可以同时用4个路由器,输入宽带帐号密码来拨号。有个疑问,假如不同的家庭利用同一个宽带账号拨号,不知道有没有限制?
第二天我去了稍微大点的营业厅,不到十分钟很快也能办好。但是不会立马生效,估计也是提工单待后台运维来完成配置后生效。 - 当晚电信师傅上门
师傅上门前,并发数修改生效了,此时家里的宽带也掉线了。原因后来才发现,需要光猫为路由模式,下接的路由器为桥接模式。
师傅会让你在一个单子上签字,一顿折腾改完路由桥接模式后,宽带恢复,iTV也恢复。 - 公网生效
此时,你什么都不需要做,就等生效就行了。我是师傅第二天告诉我生效了,检查光猫的WAN
口IP后,可确定生效了,并在外网ping
这个IP,是可以通的!
设置DMZ和端口映射
公网IP已经到手了,如何访问Web服务?两种途径:
- DMZ主机
可以理解为完全对外开放的一台主机。所有IP可以访问它,可以访问所有端口。
可一劳永逸,但是安全性低。 - 端口映射
配置有限的对外开放的端口,并且内外端口可以不相等。
一个服务可以理解为一个端口,安全性和定制性较高。
上面2种方法都可,都需要在电信的光猫上配置,推荐端口映射。
注意,最好将树莓派与光猫直连,否则连在路由器的话,可能不在同一个子网里,那么还需要该子网掩码。
配置完成后,在外网环境下打开http://公网IP:8088
(假定Web服务对外端口为8088),能看到页面,说明配置成功!
DDNS动态域名解析
家庭宽带虽然公网不花钱,但是是动态的。大约1天(没有统计过,感觉差不多)会刷新后换一个新的IP。这就给访问带来问题,假如你希望通过域名来访问,如何绑定这个动态的IP呢?
网上也有各种方案,我本人也尝试了几种:
花生壳DDNS
优点:配置较为简单
只能说较为简单,因为需要修改几处:- 改域名的解析为
NS
指向花生壳的某个url - 修改光猫的DDNS服务
- 改域名的解析为
缺点:
- 收费,费用为40/年,虽然不多。
- 需要光猫支持,并且尝试后发现会经常显示设备离线,不知道这个光猫出了什么问题。
动态修改域名解析记录
我的域名是在阿里云下的,阿里云的云解析有开放的API
,支持开发者通过AccessKey
调用SDK接口来实现对域名的管理。
优点:- 灵活
- 不收费
只需要以下2个
API
:缺点:
- 需要自己编码并部署实现,有技术门槛
- 我设置的轮询周期为5分钟,所以理论上可能会出现长达5分钟的解析失败。因为是个人博客,所以可以不介意。
具体选择哪个方案,读者可根据自身情况来选择。我选择的是后者。
总之配置成功的标志是通过域名加端口能够访问页面,即成功第一步!
另外公网IP变化后,也能访问,才是真正的成功!
隐藏端口
到这里,已经可以通过域名:端口
访问到我们的页面了。
这里之所以要加端口,是因为运营商会将80,443等常用端口封禁,这是硬伤。
但是,也有办法绕过。阿里云的域名解析中有隐性URL,可以实现。
具体步骤如下:
- 新建一个二级域名
blog.shiwang.wang
指向我们的web服务,这里需要配置Nginx。 - 在阿里云域名解析增加一条A记录,指向上一步的
blog
二级域名。配置完成后,外网下http://blog.shiwang.wang:8088
能正常打开我们的页面。 - 阿里云域名解析增加一条隐性URL:
大功告成,再打开http://shiwang.wang
即可打开我们的页面。基本原理可F12打开,阿里云给用iFrame包了一层,浏览器地址栏不带端口,而iFrame里的地址是带端口的并且是二级域名。
注意:结合上一步的DDNS,后面每次通过API修改解析记录,只需要修改blog
那一条即可。
问题
虽然通过隐性URL实现了隐藏80端口,但是在实践中还是会有问题:
- URL不会变化
如首页的URL为http://shiwang.wang
,点击某个链接跳转至http://shiwang.wang/blog
后,浏览器地址栏URL仍然为http://shiwang.wang
,这样就无法实现收藏功能。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。