如何将我的服务开放给用户:构建 API 接口和用户认证的实践指南 | 青训营

85 阅读8分钟

一,网络接入

1.问题引入

在浏览器输入网络域名后,到网页加载出来都经历了什么?

简单来说:

1)域名解析

2)TCP连接

3)SSL握手

等等

关于浏览器的抓包,其会抓取大量包,只有第一条才是本质,剩余的则是对页面的渲染

而其过程主要经历了DNS解析,TCP建联,TLS握手,HTTP请求的发送。

2.一个example公司需要解决的问题

1)域名系统

其在建立之初就有了许多内部站点,如办公、文档、员工认证、人事等。其利用host来管理ip,从而来达到访问不同服务器的目的,随着员工数量和用户数量增加,其host包越来越大,传输所耗费的资源也指数级增加,同时,主机名也难以保证唯一,服务器出现了冲突,仅靠人工判断,时效性太差。

最终,他们决定用域名系统来代替host,域名系统有以下特点

  • 域名空间被组织成数型结构
  • 域名空间通过划分zone的方式进行分层授权管理
  • 全球公共域名空间仅对应一棵树
  • 根域名服务器:查询起点
  • 域名组成格式:[a-zA-Z0-9_-],以划分label

同时其在根的基础上又做了一层顶级域管理如:gov,edu,com,mil等

未得到他们专属的域名,他们首先需要购买一个,在购买到域名后,在二级域名处出现了一个专门用于example公司管理域名的域,当然,公司在对域名进行操作之前需要对其进行备案,防止域名被用做非法活动。

现在,公司可以进行修改配置操作,使用清空/etc/hosts和配置/etc/resolv.conf中nameservers未公共DNS迁移原配置,并通过控制台添加解析记录即可。

开放外网ip: 其可租赁一个外网ip,专用于外部用户访问门户网站,将www.example.com 解析到外网ip 100.1.2.3,将该ip绑定到一台物理机上,并发布公网route,用于外部用户访问。

2)自建DNS服务器

现在又出现了一些问题:

  1. 内网域名的解析也得去外网获取,效率低下
  2. 外部用户可以看到内网ip地址,容易被hacker攻击
  3. 云厂商权威DNS容易出故障,影响用户体验
  4. 持续扩大公司品牌技术影响力,使用自己的DNS系统

想要解决这些问题,example公司只能自己搭建一套属于自己的DNS系统,同时包含内网和外网。

以下是一些关于DNS的信息:

关于DNS的查询过程: 首先会向本地DNS服务器查询ip地址,若无,则会向根服务器询问,然后根服务器会告知其com服务器的地址,让其向com服务器查询,然后com服务器会告知其负责该主区域的地址,最后由该主区域的服务器告知其ip地址。

DNS记录类型:

  1. A/AAAA:IP指向记录,用于指向IP,前者为IPv4记录,后者为IPv6记录
  2. CNAME:别名记录,配置值为别名或主机名,客户端根据别名继续解析以提取IP地址
  3. TXT文本记录,购买证书时需要
  4. MX:邮件交换记录,用于指向邮件交换服务器
  5. NS:解析服务器记录,用于指定哪台服务器对于该域名解析
  6. SOA记录:起始授权机构记录,每个zone有且仅有唯一的一条SOA记录,SOA是描述zone属性以及主要权威服务器的记录

3)HTTPS协议

现在,公司又遇到了一些问题,如页面出现白页,返回奇怪的东西,返回了403页面,无法进行搜索,搜索问题带尾巴,页面出现弹窗广告,用户个人信息泄露等,这些都是因为使用的HTTP协议是明文传输,其间被抓包或篡改了数据。

这时就有了HTTPS协议,其应用了加密技术,常见的有对称加密和非对称加密,对称加密仅有一份密钥来进行加密和解密,而非对称加密有公钥和私钥来分别进行加密和解密。

其中较为典型的SSL的通信过程如下:

1.client random

2.server random

3.premaster secret

4.加密算法协商

最后生成了对称密钥session key

公钥一般存储于证书链中,其有自己的验证方式以防止公钥被劫持

  1. Clinet收到后会进行验证,过程如下:

    1.是否是可信机构颁布

    2.域名是否与实际访问的一致

    3.检查数字签名是否一致

    4.检查证书的有效期

    5.检查证书的撤回状态

3)接入全站加速

对于外网用户对于站点的访问,通常会出现以下问题,源站容量低,可承载的并发请求数量低,报文经过的网络设备越多,出现丢包,劫持,mtu的问题概率越大,自主选路网络链路长,延迟高,最终呈现在用户面前的就是响应慢,卡顿等造成用户的体验不佳。

对于源站容量不足可以通过增加机器的数量解决,如果是静态内容,可以使用静态加速 CDN

应对:解决服务器端第一公里问题,缓解不同营运商之间互联的瓶颈造成的影响,减轻各省的出口宽带压力,可优化网上热点内容的分布

原理:从源点获取的就不是DNS解析的结果,而是cdn节点解析的结果。cdn节点使用的是自动调取DNS,它是根据一些算法和策略将一些比较合适的cdn节点或IP地址返回给LocalDNS,最终返回client。同时cdn会发起一次请求,并且将此作为缓存。缩短了网络的链路码,缓解了不同运营商互相访问的成本。减轻了各省的出口带宽压力(将静态内容请求都控制在靠近clent端)。优化网络热点内容的分布。

而对于网络优化问题,则可使用动态加速 DCDN选取最通畅的路径进行传输

越往中间的中心节点容量算力越大数量越少,越往边缘的节点容量算力越小数量越多

全站加速包含静态和动态加速。

4)负载均衡

四层负载均衡:其是基于IP+端口,利用某种算法将报文转发给某个后端服务器,实现负载均衡地落到后端服务器上。基于OSI七层模型进行划分的。其主要有三个主要功能: 解耦vip和rs,NAT,防攻击:syn proxy,避免直接将公网IP暴露出来。

而四层负载对100.1.2.3只能bind一个80端口,而有多个外部站点需要使用,该如何解决?

1.SSL卸载,业务侧重是http服务,用户需要https访问

2.请求重定向:浏览器访问toutiao.com自动跳转www.toutiao.com

3.路由添加匹配策略:完全、前缀、正则

4.Header编辑

5.跨域支持

协议支持:websocket、grpc、quic

这就是七层负载均衡

以上就是关于网络接入的基础知识。

二,内网穿透工具ngrok

ngrok是一个内网穿透工具

内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。下面就相互通信的主机在网络中与 NAT 设备的相对位置介绍内网穿透方法。 UDP 内网穿透的实质是利用路由器上的NAT系统。NAT 是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型 Internet 接入方式和各种类型的网络中。NAT可以完成重用地址,并且对于内部的网络结构可以实现对外隐蔽。应用场景:上面叭叭一大堆,总结一句话就是本地运行的项目,如果不使用内网穿透,只能本机访问。用到了内网穿透,就会给一个公网的ip代替本地ip,我们就可以简单地部署和测试我们的网页了。

要使用ngrok,首先我们要在其官网(dashboard.ngrok.com/ )注册并下载一个符合自己版本的ngrok,运行后可以看到以下窗口:

841bca7b94ad368ab0deb9f0178b84c.png

此时,我们需要绑定自己的ngrok账号,我们只需在命令框内输入 ngrok config add-authtoken 自己的密钥 (密钥可以在Your Authtoken中查看) 绑定完成后可以使用ngrok config edit来查看储存密钥的文件夹。

接下来即可输入ngrok http 3000来将端口映射到外网:

aec293145f5de6f19f309cb04c5fc28.png 配置好本地端口:

package main  
  
import (  
"fmt"  
"net/http"  
)  
  
func main() {  
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {  
fmt.Fprint(w, "Hello, World!")  
})  
  
http.ListenAndServe(":3000", nil)  
}

复制网址浏览即可。