家庭网络对外网网络服务搭建指南

大部分情况下云服务器拥有高稳定性、安全性,推荐服务器新手租用云服务器学习。但是生命在于折腾,拥有公网IP怎么可能不尝试下呢?!

本文仓促之间完成,难免对技术、方法等描述模糊、错漏,如读者发现问题、建议,请在评论区留言

对于拥有公网IP(特指IPv4,IPv6因连通性等问题暂不考虑)的读者,在技术条件允许的情况下,可以考虑基于公网IP对外网提供服务。通过自己在家庭环境下学习社时间网络服务架设,可以提高自身对服务器及服务器网络环境配置的了解,提高自身专业素养。但由于自架服务器具有不稳定、高风险的问题,推荐新手服务器玩家租用云服务器。

本文暂时计划有三部分,第一部分为公网IP条件下搭建对外网络服务,第二部分为内网IP条件下搭建对外网络服务,第三部分为HTTPS证书申请及部署。

一、公网IP下搭建对外网络服务

本文以阿里云服务为例,若读者采用其他云服务供应商,因提前查找该供应商是否支持 自定义端口CDN 资料

本章将叙述拥有公网IP的家庭宽带环境如何使用端口映射、域名绑定、域名解析、域名加速等技术一步一步实现使用域名直接访问HTTP服务。

(一)、什么是公网IP

有的读者可能会问,不是每次拨号后ISP供应商都会提供一个IP吗?这个IP和公网IP有什么区别吗?为什么ISP供应商不直接给我分配公网IP?以上问题将一一解答。

首先我们要了解的是IPv4(Internet Protocol version 4 RFC 791)。IPv4是互联网的核心协议,每一个需要与互联网进行通讯的设备都需要分配一个IP地址才有与互联网通讯的前提。而IPv4使用32位(4Byte)地址,即0.0.0.0~255.255.255.255,总地址空间包含4,294,967,295(约42亿)个地址,但由于其中包含专用网络(即下文三段IP地址块约1800万个地址)和多播地址(约2.7亿个地址)等特殊地址保留使用,总共可使用IP数量再次降低。同时由于IPv4地址资源大部分掌握在各列强手中,中国分配的IP地址相对较少。国内掌握IP直到现在所有可分配的公网IP地址已全部耗尽(被科研、军事、运营商分配掌控),在国内各大供应商是用户能直接接触到的为家庭网络提供公网IP服务的组织。而RFC 1631(网络地址转换协议) 中提出的NAT(Network Address Translator)概念有效减缓了可用IP地址空间枯竭的窘境。

拥有公网IP地址的设备,可以直接通过其IP地址访问其开放的服务端口,但由于对于所有连接英特网的用户均是可见的,导致公网设备容易遭到黑客攻击和渗透。从本文的角度来讲,拥有公网IP的设备可以为互联网提供多种多样的网络服务。

注意:请斟酌后再进行公网IP申请,由于公网IP与内网IP在ISP供应商方面所走链路可能不同,导致网络延迟可能由于链路原因提高,网络带宽降低等现象。而且我的ISP供应商告诉我更改后无法再改回内网IP。虽然我更改为公网IP后网络延迟还降低了,网速也没有变化(͏ ˉ ꈊ ˉ)。

(二)、NAT协议

在IPv4资源日益匮乏的今天,NAT协议无疑是一个解决的有效办法。NAT协议提出计算机可以使用以下三段专有网络IP段分配私网IP而后通过NAT协议与拥有公网IP的设备进行通信,利用拥有公网IP的设备作为网关对外访问。通过少量公网IP+私网IP的模式为组织、企业、公司内部提供网络服务。

1.NAT协议概述

RFC 1918(私有网络地址分配)中有三个IP地址区域被保留:

RFC1918中关于保留地址描述

上述三个IP地址区域不会被公共网络(因特网环境)分配,而作为组织、企业内部专有网络使用。如果你通过查看你的光猫或者入户网关IP为以上三类地址段中一员,则你的家庭宽带分配的IP地址为ISP供应商局域网IP,下文缩写为内网IP。内网IP通过内网IP与ISP网关通讯而后ISP网关将你的请求使用NAT协议与外界通讯,同时可能存在不止一层NAT,如果你运气不好在在一些地区可能存在2~3层ISP供应商NAT,总体来说NAT会增加网络延迟。

如果外网设备想访问在内网环境下的电脑,不通过内网穿透软件或供应商,就只有在外网网关(拥有外网IP的ISP供应商网关)上进行内网端口映射,将内网某一端口映射到外网网关上。但ISP供应商不可能为你单独开启端口映射,对于家庭宽带用户也不会默认分配公网IP,因此如需为公网环境提供网络服务,需要向ISP供应商提出获取公网IP请求。该请求根据地区、政策等不同会得到不同答复。地区相对越偏僻越容易获得公网IP。

2.NAT协议举例

a.NAT协议流程比喻

举个栗子:

A同学想给B同学写信

拥有公网IP:B同学地址为X省X市X区X小区X楼X单元X号房。

A同学邮寄信件时直接可以邮寄到B同学家里。

没有公网IP:B同学地址为X省X市X区X机密单位(该单位不允许泄露内部地址)。当然适用到IPv4上就是门牌号不够_(:τ」∠)_。

A同学邮寄信件给B同学时只能邮寄到X机密单位门卫处,如果门卫不转送则无法邮寄(没有开端口映射),而由门卫代为转送,如果门卫不能转送。

B同学想与外界通信则需要通过门卫进行转送,门卫会记录发送方内网IP并帮助转发,而A通信也只知道B同学单位门卫地址。

b.RFC1631 NAT实例

总结一下,在内网IP设备上在没有设置的情况下无法通过公网直接访问,需要通过其他方法进行内网穿透。NAT具体实现请阅读RFC1631

c.路由网关查询公网IP

在路由网关上可以方便的查看是否IP为内网IP:

PPPoE拨号

(三)、家用网络宽带如何申请公网IP

公网IP申请方法很多,请自行百度,由于地区政策不同而不同。

(四)、将网络服务开放到因特网上

在拥有公网IP后首先要对光猫进行设置,将光猫中设置端口映射后即可将服务开放至互联网,对于家庭监控、私人云盘、私人邮件服务器、物联网设备直连等都是一样的操作。

1.光猫设置

如果需要向外网提供服务必须使用路由网关进行端口映射,而家庭环境下网关一般为光猫。光猫在默认情况下没有开启端口映射功能,需要使用光猫超级密码账户进行登录后,选择开启端口映射并填写具体设备IP(即映射源设备,需要使用映射服务的设备)及端口。映射源设备一般来收会在HDCP服务器上设置静态IP,保证其不会因为IP租期到期而被重新分配为其他IP。我的光猫因更改为桥接模式(相当于交换机),将拨号等服务转移到了爱快软路由上,所以直接设置即可。

ikuai对Gitla的端口映射

2.映射源设备设置

映射源设备上需要在对应端口(网关端口映射)关闭防火墙,并将所提供的服务其监听端口修改为映射端口。以Docker Gitlab容器为例开启30000端口,如果读者有兴趣可以自己尝试一下我的Gitlab服务器(目前只将几个项目Public了出来)。

Docker中对Gitlab的配置

到此为止,你的服务应该可以通过 http://—-IP—-:port 的形式为互联网提供服务了。

但由于ISP供应商在每次拨号后会重新分配公网IP,所以你需要在每次拨号后更改IP访问

同时由于国内ISP供应商由于为了保证企业宽带收入及管理便捷性一般会封禁由于web HTTP访问的 80 端口和HTTPS服务的 443 端口等常用网络服务端口,因此如果你想为互联网提供HTTP网站服务,需要将内网设备 80 端口映射到其他端口上,比如端口 6000等。因此其他用户访问你的HTTP网站服务时需要使用http://—IP—:映射端口 的形式,而后文我们将找出解决办法

这样操作在我看来非常麻烦,可以找一个DDNS(Dynamic Domain Name Server)供应商提供DDNS服务,将供应商某一域名的自定义子域名解析到你的IP上。你需要在本地设备上安装DDNS客户端,在设备自身公网IP发生变化时告知DDNS供应商新IP,自动修改解析地址。这样的服务你最后访问的URL可能是下图示例,下图中“ tests ”为自定义前缀。图片来自花生壳

(五)、域名绑定

如果你觉得使用IP或DDNS供应商的域名对你使用造成了不便,那么你就需要自己申请域名建站了。使用自有域名建站需要花费时间精力进行域名申请和网站备案。在国内,只有进行过备案(在国内备案后才有资格提供网络服务)的域名DNS解析商才会提供DNS解析服务。下面将会把如何进行域名购买、备案的整个流程展示出来。

1.域名购买及实名制

首先你需要选择一个域名供应商,国内各大云服务商均有自己的域名平台,读者可选择自己常用的平台进行申请。因博主常用阿里云云服务,因此以阿里云平台上进行域名注册申请为例:

(1)查询想购买的域名

a.登录阿里云账户
阿里云登录界面
b.进入控制台
控制台入口
c.选择左上角抽屉菜单栏“ 域名 ”按钮
域名控制台
d.进入域名注册页面
域名注册按钮
e.域名查询

选择域名后缀(这里随便选也行,搜索结果内会出现所有后缀列表),推荐选择top等价格较低的域名,然后填入自己想要的域名名称后查询域名是否被注册,这里以zhusige.xxx为例。实际搜索结果为所有域名后缀均出现的一个列表,以阿里万网推荐注册顺序排列。

阿里万网域名查询平台
f.选择自己想要的域名

在列表中选择自己想要的域名,加入购物车。在这里推荐服务器新手购买价格便宜一点的域名,比如 .top .cn 等,如果有财力的读者也可购买 .com域名。域名根据其域名后缀(顶级域名)有不同用途,但实际上个人使用过程中没有太大差异。

(2)域名实名制

由于我的域名之前做过实名制,现在可以直接提取实名制模板,所以这部分现在的操作我不是很清楚。但是过程是比较简单的,需要填写自身身份信息,可能会使用 阿里云APP 脸识别认证。而认证过程一般为2~3天。认证之后,可以在域名服务商出查询出该域名拥有者信息(非隐私信息)。该糊的还是得糊一糊。

推荐大家使用 阿里云APP,在手机上能够方便快捷的查看各种账户实例信息,可以实时监控ECS服务器等系统数据。

2.域名备案

在国内,域名拥有者想对国内使用域名解析服务则必须要对被解析域名进行备案。如果不进行备案,DNS服务商将不会对该域名提供解析服务。备案的流程就相对比较繁杂了,需要花费大概一个月时间(实际操作时间3~4h,其余为审核时间)。根据域名备案淡季及旺季,可能审核时间上有所不同,但总体上差异不大。如果这里引用阿里云对域名备案的描述:

根据 《互联网信息服务管理办法》以及 《非经营性互联网信息服务备案管理办法》,国家对非经营性互联网信息服务实行备案制度,对经营性互联网信息服务实行许可制度。未取得许可或者未履行备案手续的,不得从事互联网信息服务。即所有对中国内地(大陆)提供服务的网站都必须先进行ICP备案,才可开通服务。阿里云ICP代备案管理系统为您提供申请备案、修改注销备案信息、认领备案等服务。

如果您未在阿里云提交过备案,直接将域名解析至阿里云中国内地(大陆)服务器上,将被阿里云监测系统识别并阻断网站的访问服务,提示您需先完成备案操作。

如果您已经在其他接入商处申请过备案,现在希望将域名解析至阿里云中国内地(大陆)服务器上,根据政策要求,您需要将备案信息接入阿里云。如果您没有将备案信息接入阿里云,将被阿里云监测系统识别并阻断网站的访问服务,提示您需要将备案信息接入阿里云。

阿里云备案指南
阿里云ICP备案图例

(1)备案详情

剩余的操作我写的再详细也不会有阿里云备案指南详细,因此如有兴趣,请读者自行访问:

阿里云备案指南

阿里云域名备案指南

(2)域名备案结果查询

在进行域名备案后,域名拥有者可以在阿里云 我的备案 界面查看网站备案情况,同时可以对拥有域名使用DNS解析服务。

备案菜单
阿里云ICP备案信息

3.域名解析

进行域名备案后,即可使用DNS供应商服务,而DNS服务简单的说就是把网站的名字翻译成IP地址(仅代表A类及AAAA类DNS解析记录),然后客户机再去与IP地址通讯。而DNS提供商则充当了这个翻译官,将备案域名按配置解析为对应IP等形式。

(1)阿里云DNS解析配置

在阿里云控制台中,备案域名能够方便快捷的进行DNS解析。

a.添加DNS解析记录

在阿里云控制台页面左上角抽屉菜单中,点击产品与服务将整个列表展开,而后在搜索框内直接搜索“ DNS ”即可查询出云解析DNS菜单,比较常用可以点击按钮右边的星星进行收藏,下次直接显示到左侧快捷菜单中

进入DNS云解析菜单后默认在域名解析界面,在购买域名并对对应域名备案后阿里云会提供免费DNS解析服务,点击对应域名右侧解析设置,即可进入该域名解析记录列表

域名解析页面

如果没有进行域名解析时,域名解析记录列表将为空,需要点击添加记录,将自己想要解析的域名记录加入。这里不得不提一下域名解析记录的类型,对初学者简单来说,A类型 用于对IPv4类型解析,即我们需要使用的解析方式,CNAME类型 一般用于CDN解析,其他的类型请读者自行学习。DNS详细介绍:阿里云云解析DNS-添加解析记录 | RFC1035(域名实现与说明)

域名解析记录列表

在添加记录窗口中选择 A类型 ,添加自己想要的主机记录,添加记录值(你的IPv4公网地址),其余不用修改确认即可。

A类型DNS解析记录实例
b.检查DNS解析结果

然后等待几分钟,你的域名就可以解析到你的公网ip上,以上方解析例子与6000端口提供HTTP服务为例,你现在可以使用http://test.your.domain:6000 访问你的网站。在这种情况下,该解析记录在你进行下一次PPPoE重拨更换公网IP地址前都有用。一般情况下,如果长时间不进行PPPoE重拨,网络速度将会逐渐减慢,所以在拨号设备处一般会进行定时重拨设置,比如我就在爱快路由器上设置了每天凌晨4点重拨,更新IP。而此时我们就需要DDNS服务(类似于上述花生壳方案),在内网设备或路由网关出开启DDNS服务。一般来说,主流路由器中都会有DDNS服务,可以设置需要更新域名等,但由于一些路由器没有这种服务,我们就只有使用DNS服务商所提供的OpenAPI进行DNS解析记录更新,具体操作我将会在下一篇博文 使用阿里云OpenAPI更新DNS解析服务(完成后将赋为链接) 中写出。

在浏览器中访问被解析域名+服务端口,如果访问成功则说明解析正确。

此时,你已经拥有了一个较为稳定的通过域名访问的网络服务体系,可以长期通过http://your.domain:port 对某一服务进行访问。

但是一个喜欢折腾的程序员怎么可能就此止步呢?

(六)使用自定义端口CDN服务去除网站访问端口

CDN(Content Delivery Network 内容分发网络)是一种用于提高网站访问速度的服务。一个网站从资源类型(关联阅读:HTML MIME)的角度由多种元素构成例如 .js文件、.css文件、.webp文件(压缩图片格式)、.html文件。对于网站来说,上述文件都属于静态文件,即在长期时间内该文件不会发生重大变化,可以作为网站访问所固定需要的文件。而CDN可以看成一种分布在各地区的缓存服务器。当你访问使用CDN的网站时,你的访问路径从 客户机->服务器 变成了 客户机->经DNS解析的延迟最低的CDN服务器,若为静态数据该CDN服务器将会查询本机是否有被访问数据请求,命中缓存则返回,未命中则使用回源地址(源数据地址,本文环境下即你服务器IPv4地址)记录进行数据获取(从其他CDN服务器或访问源地址获取),若为动态数据则会进行访问加速回源访问。以上叙说说明CDN能够提高各地区网站访问速度的优点。同时,部分CDN服务商提供回源地址自定义端口,比如阿里云CDN。利用CDN将带端口回源地址映射到不带端口(HTTP默认 80 端口)的域名进行访问是很有效且方便的。以下将会对如何设置自定义端口CDN做描述(以阿里云CDN为例)。阿里云CDN服务中,被加速的网站域名被称为 加速域名

a.在CDN菜单创建加速域名

首先打开阿里云控制台左上角抽屉栏,搜索并进入CDN页面

搜索CDN服务

点击添加域名按钮后进入域名添加页面

CDN概览页面

在加速域名中填入你需要去除端口的域名,支持泛域名(*.your.domain)即所有子域名(例如www.your.domain storage.your.domain blog.your.domain )都将做CDN加速。业务类型选择图片小文件即可。源站信息选择IP并填入你的公网IP,此时只能选择端口为80或者443端口,等创建好后再进行修改。如果有向国外提供CDN服务的读者可以勾选加速区域 全球。填写完成后提交将会出现 已提交人工审核,预计需要1~2工作日 的提示,实际上我平均等待时间就一两个小时。

CDN域名添加页
CDN域名添加审核提示
b.为被加速域名添加CNAME记录

创建完成后如下图 gitlab.oyxf.top 域名,处于停止状态,且未开启HTTPS协议,

点击CNAME列中感叹号会说明 未配置CNAME ,将CNAME属性复制后进行下一步操作。打开DNS云解析菜单,为申请CDN的域名添加解析记录并等待一会儿CDN菜单中CNAME感叹号就会变为绿色的小勾,如下图

为CDN服务添加CNAME解析记录
检测到CNAME解析
c.修改加速域名设置

然后在CDN菜单域名管理页中点击该CDN域名记录 管理 操作按钮,进入CDN域名管理页,如下图

CDN域名管理页

自定义端口解析需要的操作(参考 阿里云CDN自定义端口教程)有

  1. 修改基本配置页中源站信息 地址属性中 源站信息为你的公网IP 端口改为自定义端口填入你的 HTTP服务的端口(路由网关上端口映射出的HTTP服务端口)
  2. 修改回源配置页中 回源协议关闭
  3. 按需修改高级配置页中 宽带封顶 属性(高流量会导致CDN费用偏高,推荐直接买流量包,一次购买在低流量访问情况下基本能用一年价格也不贵)
源站配置页
d.刷新加速域名并测试

你可以在CDN菜单中选择 刷新预热页面,填入你需要刷新的 URL(即你CDN服务添加的域名 此处为http://gitlab.oyxf.top),注意刷新目录需要在域名后方加入 ” / “。然后等待一会儿,就可以通过域名访问你的网站啦!(第一次访问可能会比较缓慢)

e.检查CDN是否生效

1.通过浏览器访问被CDN加速的域名,如正常打开,则进行下一步,若出现 有关 kunlun 字样的报错信息,说明上述配置未生效或配置错误,仔细检查一遍配置信息后等待几分钟再访问(CDN缓存更新具有延迟性,等不及可以在刷新预热页面刷新一下)

2.打开页面后按 F12 打开DevTools ,选中网络选项卡,按 F5 刷新页面,在数据流中选中一条数据查看右侧标头信息,将远程地址复制下来

DevTools中查看远程IP

3. 进入阿里云控制台CDN菜单进入工具服务页面,将复制的远程地址填入IP检测框搜索,若搜索出该IP为CDN节点,则说明CDN加速成功

CDN加速节点检测
f.查询CDN服务使用情况,及回源成功率

进入阿里云控制台CDN菜单监控查询菜单组下资源监控页面,可以通过 流量带宽、回源统计、访问次数、命中率、HTTPCODE、HTTPCODE(回源)六个角度进行查询。推荐在刷新预热后先查询HTTPCODE(回源)页面,如果对CDN流量带宽价格有疑问,则请查看阿里云CDN资费规则

HTTPCODE(回源) 2xx状态统计
g.重拨IP变更问题

细心的读者会发现,在此处填写的源地址是一个固定的IP,但由于PPPoE重拨公网IP变更的问题,该CDN仅能用于IP不变更的情况。我将在下一篇博文中提出如何在Nodejs环境下阿里云OpenAPI、网络公共IP查询API、emailjs实现自动更新CDN 回源IP并邮件回源结果。(正在抓紧写)

到此为止,整个家庭环境下通过公网IP非80端口使用CDN提供域名直接访问服务就完成了。如果有什么疑问或本文有错漏之处,请留言评论,敬请斧正。

拓展阅读

  1. 百度百科 NAT(网络地址转换协议)
  2. 百度百科 公网IP
  3. MDN 术语表CDN
  4. MDN MIMEtype
  5. Mag[i] 端口映射搜索结果
  6. 花生壳DDNS域名申请查询
  7. RFC 1035 Domain names -implementation and specification
  8. RFC 791 Internet Protocol
  9. RFC 1631 The IP Network Address Translator (NAT)
  10. RFC 823 DARPA Internet gateway
  11. 阿里云CDN服务文档
  12. 阿里云云解析DNS服务文档

网站测试服务

  1. 站长工具 SEO综合查询
  2. Microsoft Edge DevTools LightHouse页
  3. 网上有很多,剩下的自己寻找吧。。。。
  • 0.2wep 新建文章并撰写至NAT部分 2021/3/19 8:30
  • 0.5ap 将第一章节撰写完毕 2021/3/19 18:30

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注