3. 网络基础与安全组配置:TCP/IP协议栈、DNS解析原理、HTTP/HTTPS协议、云上VPC与安全组规则实战

网络是云上运维的命脉。你想想看,应用跑得再快,网络不通,一切都是白搭。我见过太多新手,一上来就折腾代码,结果连个安全组规则都没配对,排查了一整天。这一章,咱们就把网络基础和安全组配置彻底捋清楚。

3.1 TCP/IP协议栈:数据包在云上的旅行

TCP/IP协议栈,说白了就是数据包从你的应用出发,到对端服务器,再回来的完整路径。它分四层,每一层都有自己的职责。

层级 核心协议 职责 我常关注的坑
应用层 HTTP, DNS, SSH 定义数据格式和交互逻辑 协议版本、超时时间
传输层 TCP, UDP 端到端可靠传输或快速传输 端口号、连接状态、重传率
网络层 IP, ICMP 寻址和路由选择 IP冲突、路由表、TTL
网络接口层 以太网, ARP 物理介质上的帧传输 MAC地址、MTU大小

我记得有一次线上故障,应用响应极慢。查了半天,发现是MTU设置过大,导致IP分片严重。嗯,从那以后,我排查网络性能问题,第一件事就是看MTU和TCP重传率。

核心要点:TCP的三次握手和四次挥手,是排查连接问题的基本功。你可以用 tcpdump 或 ss -tpan 观察连接状态。如果大量 TIME_WAIT 或 CLOSE_WAIT,说明应用层没处理好连接复用或关闭。

3.2 DNS解析原理:域名背后的寻址之旅

DNS解析,就是把域名翻译成IP地址的过程。这个过程看似简单,但坑特别多。我建议你把它拆成几个关键步骤来理解。

  1. 本地缓存查询:浏览器或操作系统先查自己的DNS缓存。如果命中,直接返回。
  2. 递归查询:本地DNS服务器(通常是云服务商提供的)向根域名服务器发起查询。
  3. 迭代查询:根服务器返回顶级域(如 .com)的地址,本地DNS再去问顶级域服务器。
  4. 权威解析:顶级域服务器返回权威域名服务器的地址,最终拿到目标IP。

避坑指南:我曾经遇到一个诡异的问题,应用偶尔连不上数据库。排查发现,是DNS缓存了旧的IP地址。数据库迁移后,TTL没设短,导致部分请求路由到了旧IP。从那以后,我坚持把关键服务的DNS TTL设为60秒,并且用 nslookup 或 dig 定期验证解析结果。

为什么会这样?因为DNS解析是分层缓存的。你改了DNS记录,全球生效需要时间。这个时间取决于TTL值。所以,做DNS变更前,先把TTL调低,等变更生效后再调回去。

3.3 HTTP/HTTPS协议:应用层的通信语言

HTTP协议,是咱们和云上服务打交道最频繁的协议。HTTPS就是在HTTP外面套了一层TLS加密。我个人习惯,在生产环境中,强制使用HTTPS,除非是内部监控或调试接口。

HTTP的核心是请求-响应模型。一个典型的请求包含:方法(GET/POST)、路径、头部(Headers)、主体(Body)。响应包含:状态码、头部、主体。

状态码速查表:

  • 2xx:成功。200 OK,201 Created。
  • 3xx:重定向。301永久,302临时,304未修改(缓存)。
  • 4xx:客户端错误。400 Bad Request,401未授权,403禁止,404未找到,429限流。
  • 5xx:服务端错误。500内部错误,502 Bad Gateway,503服务不可用,504网关超时。

HTTPS的握手过程,比HTTP多了TLS协商。这个协商会消耗额外的CPU和网络开销。我建议你在负载均衡器上终结TLS,而不是在后端服务器上。这样能减轻后端压力,也方便统一管理证书。

注意:HTTPS证书有有效期。我见过不止一次,因为证书过期导致线上服务大面积不可用。建议设置证书到期前30天的告警,并定期检查证书链是否完整。

3.4 云上VPC与安全组规则实战

VPC(虚拟私有云)是你在云上的专属网络空间。你可以把它想象成一个独立的机房,里面可以划分子网、配置路由、设置防火墙。安全组,就是VPC里的虚拟防火墙,控制进出云资源的流量。

下面这张图,是我自己总结的VPC核心逻辑。你看一眼,就能明白数据流怎么走。

VPC 网络架构与安全组逻辑 VPC (10.0.0.0/16) Internet 网关 负载均衡 (ALB/NLB) 安全组 (SG-Web) 公有子网 (10.0.1.0/24) EC2 实例 / ECS 任务 私有子网 RDS 说明:安全组是有状态的。允许入站流量后,出站响应自动放行。你只需要关注入站规则。

3.4.1 安全组规则配置实战

安全组规则,说白了就是“谁可以访问我的哪个端口”。配置时,我建议你遵循最小权限原则:只开放必要的端口,只允许必要的源IP或源安全组。

下面是一个典型的Web应用安全组配置示例:

# 安全组:SG-Web
# 入站规则
# 允许来自负载均衡的HTTP流量
Protocol: TCP
Port: 80
Source: sg-xxxxx (负载均衡的安全组ID)

# 允许来自负载均衡的HTTPS流量
Protocol: TCP
Port: 443
Source: sg-xxxxx (负载均衡的安全组ID)

# 允许运维人员SSH登录(限制源IP)
Protocol: TCP
Port: 22
Source: 203.0.113.0/24 (公司公网IP段)

# 出站规则(默认允许所有流量)
Protocol: All
Port: All
Destination: 0.0.0.0/0

实战技巧:我习惯用安全组引用安全组的方式,而不是直接写IP。比如,Web层的安全组只允许来自负载均衡安全组的流量。这样,即使负载均衡的IP变了,规则也不用改。另外,别忘了给数据库层单独配一个安全组,只允许来自Web层安全组的流量。

3.4.2 网络ACL vs 安全组

很多新手分不清网络ACL和安全组的区别。我直接给你列个对比表:

特性 安全组 网络ACL
作用范围 实例级别(如EC2、ENI) 子网级别
状态 有状态(自动允许回程流量) 无状态(需显式配置入站和出站规则)
规则顺序 所有规则都评估(允许优先) 按编号从小到大评估(匹配即停)
默认行为 隐式拒绝所有入站,允许所有出站 允许所有入站和出站(需手动修改)
使用场景 精细控制单个服务的访问 子网级别的全局防护(如封禁某个IP段)

注意:网络ACL是无状态的。如果你配置了入站规则允许HTTP,但忘了配出站规则允许响应流量,客户端能发请求,但收不到响应。我曾经因为这个坑,排查了整整两个小时。所以,用网络ACL时,一定要成对配置入站和出站规则。

3.4.3 实战:搭建一个三层Web架构

咱们来一个完整的实战。假设你要在云上部署一个Web应用,包含负载均衡、Web服务器、数据库。网络架构如下:

  1. 创建VPC:CIDR为10.0.0.0/16。
  2. 创建子网:
    • 公有子网A:10.0.1.0/24(放负载均衡和Web服务器)
    • 公有子网B:10.0.2.0/24(放Web服务器,用于高可用)
    • 私有子网C:10.0.3.0/24(放数据库)
  3. 配置路由表:
    • 公有子网的路由表指向Internet网关。
    • 私有子网的路由表只指向本地。
  4. 配置安全组:
    • SG-ALB:允许来自0.0.0.0/0的80和443端口。
    • SG-Web:允许来自SG-ALB的80端口,允许来自公司IP的22端口。
    • SG-DB:允许来自SG-Web的3306端口(MySQL)。
  5. 部署服务:启动EC2实例,关联对应的安全组。

验证命令:

# 从Web服务器测试数据库连通性
telnet 10.0.3.10 3306

# 从本地测试Web服务
curl -I https://your-domain.com

# 查看安全组规则是否生效
aws ec2 describe-security-groups --group-ids sg-xxxxx

嗯,到这里,网络基础和安全组配置的核心内容就讲完了。你想想看,这些知识其实都是环环相扣的。理解了TCP/IP,你就能看懂DNS解析;理解了HTTP,你就能配置好安全组规则。多动手,多踩坑,慢慢就熟练了。