【计网】将我的服务开放给用户

809 阅读10分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

1.全链路上的组件

域名系统

image.png

host文档

如图,主机表存储ip对域名的映射

image.png 但是会有流量和负载、名称冲突、时效性问题

使用域名系统(常用做法)

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

image.png 顶级域gTLD: general Top-level Domains

域名报文格式:

image.png

给外部用户访问

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

image.png

自建DNS服务器(大企业)

DNS查询过程

image.png Linux查询DNS解析过程的命令:
dig www.baidu.com +trace

DNS记录类型

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

image.png TTL是缓存时间,超过就会失效,从而要重新向权威服务器请求

image.png 版本号,Master和Slave之间的版本控制 Slave与Master间版本核对的间隔时间 Slave向Master核对时未获得响应的重试间隔时间 在没有Master响应的情况下,Slave仍然能提供权威DNS解析时间的长短 没有DNS解析结果时,缓存该请求的时间

权威DNS系统架构

以bind架构为例子: Client发起DNS Query,Master返回DNS Response,如果发现有DNS系统需要更新,APP Server就发送Update请求,Update的结果返回给下发端,Master收到Update之后会主动Notify Slave询问是否同步更新,若是则向Master发起XFR请求,返回更新信息。

image.png

有了权威DNS系统后,当前

image.png

接入HTTPS协议

对称加密和非对称加密

对称加密和非对称加密 RSA算法

对称算法:一份密钥,双方相同

image.png

非对称:公钥和私钥
公钥加密需要私钥来解密 image.png

SSL

SSL握手过程,RSA套件为例:

①Client向server端发送client hello消息,包含客户端支持的TLS版本和密码组合
②server收到后又发送client hello给client,包含数字增量、server random以及服务器所选择的密码组合
③client对server发来的公钥和证书进行验证,保证对方合法身份
④client对server发送预备主密钥premaster secret,通过公钥加密,要服务器的私钥解密
⑤最后算出对称的密钥session key,双方使用session key进行数据传输

image.png

证书链

需要验证的项目:

  • 是否是可信机构颁布
  • 域名是否与实际访问一致
  • 检查数字签名是否一致
  • 检查证书的有效期
  • 检查证书的撤回状态

验证签名的过程: 服务器进行信息摘要计算得出指纹,用证书私钥给摘要信息加密得出数字签名,证书数字签名和上级CA的签名会被一起发给Client,Client用上级CA(最终为根证书签名,可信)发的公钥来解密数字签名得到摘要信息,此时Client会使用相同加密算法计算摘要信息的签名,如果一致说明没有篡改

全站加速

可能出现的问题: 源站容量低,可承载的并发请求数低,容易被打垮 报文经过的网络设备越多,出问题的概率越大,丢包、劫持、mtu问题 自主选路网络链路长,时延高

源站容量问题 增加后端机器扩容;静态内容,使用静态加速缓存 网络传输问题 动态加速DCDN 全站加速 静态加速+动态加速

CDN静态加速

CDN加速,减轻站点服务器压力,此时DNS服务器返回的也是CDN节点的解析结果

image.png

作用:
解决服务器端的“第一公里”问题
缓解不同运营商之间互联的瓶颈造成的影响
减轻带宽压力
优化内容分布

DCDN动态加速

针对 POST等非静态请求等不能在用户边缘缓存的业务,基于智能选路技术,从众多回源线路中择优选择一条线路进行传输。

image.png

image.png 耗时计算 常规请求耗时计算:Via DCDN:100ms 20(TCP)+20*2(TLS握手)+20+10+10(routine穿透)

Direct: 140ms 35(TCP)+35*2(TLS)+35(routine)

使用全站加速

image.png

四层负载均衡

解决问题:对有限ip地址的使用

基于IP+端口,利用某种算法将报文转发给某个后端服务器,实现负载均衡地落到后端服务器上。

三个主要功能:

  1. 解耦vip和rs。应用服务不局限于某一台物理机,可以灵活指向后端,使后台容量可以灵活扩缩容。
  2. NAT。把请求转发给后端,作为流量代理(反向代理)
  3. 防攻击:syn proxy。避免物理机ip直接暴露在公网,负载均衡进行拦截

image.png

常见调度算法

  • RR轮询:Round Robin,将所有的请求平均分配给每个真实服务器RS
  • 加权RR轮询:给每个后端服务器一个权值比例,将请求按照比例分配
  • 最小连接:把新的连接请求分配到当前连接数最小的服务器
  • 五元组hash:根据sip、sport、proto、dip、dport对静态分配的服务器做散列取模——缺点︰当后端某个服务器故障后,所有连接都重新计算,影响整个hash环
  • 一致性hash:只影响故障服务器上的连接session,其余服务器上的连接不受影响

常见实现方式FULLNAT

VIP:virtual ip LIP: local ip RS: physical system 物理机

RS如何知道真实CIP?(场景:社交平台显示ip属地) 回答:通过TCP option字段传递,然后通过特殊的内核模块反解

image.png

4层负载均衡特点

  • 大部分都是通过dpdk技术实现,技术成熟,大厂都在用
  • 纯用户态协议栈,kernel bypass,消除协议栈瓶颈
  • 无缓存,零拷贝,大页内存(减少cache miss)
  • 仅针对4层数据包转发,小包转发可达到限速,可承受高cps

使用4层负载均衡

image.png

7层负载均衡

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

业务场景:

  • SSL卸载:业务侧是http 服务,用户需要用https访问
  • 请求重定向︰浏览器访问toutiao.com自动跳转www.toutiao.com
  • 路由添加匹配策略:完全、前缀、正则
  • Header编辑
  • 跨域支持(第三方网站支持)
  • 协议支持:websocket、grpc、quic

Nginx

模块化设计,较好的扩展性和可靠性 基于master/worker 架构设计(master主要用于进程管理,worker处理用户请求,http报文等) 支持热部署,可在线升级 不停机更新配置文件、更换日志文件、更新服务器二进制 较低的内存消耗:1万个 keep-alive连接模式下的非活动连接仅消耗2.5M内存 事件驱动:异步非阻塞模型、支持aio,mmap(内存映射)

反向代理示意图

image.png

代理服务器功能 ·Keepalive ·访问日志 url rewrite ·路径别名 ·基于ip 的用户的访问控制·限速及并发连接数控制

Nginx内部架构 每个worker进程可以响应多个用户请求,使用模块把模块编译 不同模块与不同后端通信,core跟web,upstream跟server 下面还实现了管理cache的组件 image.png

事件驱动模型

是Nginx效率提高一个很关键的点

不需要一直监听,发生事件后将事件以及对应回调函数存入队列当中,然后线程从队列当中取出并执行对应模块

异步非阻塞

提高CPU使用率 传统服务器: 一个进程/线程处理一个连接/请求阻塞模型、依赖OS 实现并发 Nginx: 一个进程/线程处理多个连接/请求异步非阻塞模型、减少OS 进程切换

image.png

简单调优

image.png

优化内核网络参数

fs.filemax= 999999 //文件最大句柄(对象或实例的标识)数,设置数值较大可限制并发连接数
net.ipv4.tcp_tw_reuse = 1 //允许timewait socket建立新的TCP连接,避免- timewait连接数很多
net.ipv4.tcp_keepalive_time = 600  //调小,清理无效的TCP连接
net.ipv4.tcp_fin_timeout = 30  //TCP主动延时
net.ipv4.tcp_max_tw_buckets = 5000 //允许timewait socket的最大值,太多会降低效率
net.ipv4.ip_local_port_range = 1024 61000 //client端口取值范围,调大一点处理更多连接
net.ipv4.tcp_max_syn.backlog=1024 //半连接队列长度,并发连接过多时不会丢包
net.ipv4.tcp_syncookies = 1 //连接攻击问题

提升CPU使用效率

合适的worker进程数
Worker进程数= CPU 核数

CPU亲和
每个worker进程绑定一个CPU核,提升缓存命中率

减少CPU开销的参数

  • multi_accept允许worker同时接受新连接,为on时让worker一次接受监听队列所有请求,然后再处理
  • accept_mutex解决惊群问题(waiting时,一下子都被唤醒,然而只有一个worker被接受,其他又继续waiting)
  • reuseport 监听同端口,内核负载均衡,使用reuseport后accept_mutex就无效(因为用不着了)

提升网络效率

  • 连接复用 减少upstream建连
  • 使用Cache 超时时间对业务的影响
  • gzip压缩 会增加cpu开销,需平衡使用
  • 开启proxy_buffering 谨慎设置proxy_buffer大小,磁盘io读写

使用7层负载均衡

image.png 注意:权威DNS服务器主要基于UDP/TCP转发,不需要七层负载均衡

实践

DNS服务器搭建

四层负载均衡实验

开源的解决方案:LVS+keepalived
LVS: linux virtual server,linux虚拟服务器,根据目标地址和目标端口实现用户请求转发,本身不产生流量,只做用户请求转发,详见www.linuxvirtualserver.org/
Keepalived: LVS集群高可用,解决某个节点故障问题

Nginx stram模块:可进行四层协议tcp/udp报文进行转发、代理

七层负载均衡实验

本地服务开放外网访问

提问:服务开发前期,如何低成本的让别人访问自己的服务?
回答: Ngrok,Expose your localhost to the web

使用条件:使用github账户授权登录,即可使用,详见dashboard.ngrok.comIget-started/setup

EXAMPLES:
ngrok http 80 #secure public URL for port 80 web server
ngrok http -subdomain=baz 8080 # port 8080 available at baz.ngrok.iongrok http foo.dev:80 #tunnel to host:port instead of localhost
ngrok http https:/localhost # expose a local https server
ngrok tcp 22 #tunnel arbitrary TCP traffic to port 22
ngrok tls -hostname=foo.com 443 # TLS traffic for foo.com to port 443ngrok start foo bar baz #start tunnels from the configuration file

QA

dns污染和劫持
DHCP(Dynamic Host Configuration Protocol)被禁止,因为需要监测,劫持是会被中间抓包和抢先回答

TTL时间越短越好吗?
TTL时间过短,权威DNS压力会比较大