2.7.4 DNS与HTTP排错要点

4. DNS与HTTP排错要点#

导语
本节聚焦 DNS 解析与 HTTP/HTTPS 请求的快速定位方法,给出原理草图、安装与命令示例、排错步骤与练习,便于实战复现与证据留存。

原理草图:DNS 解析路径

文章图片

原理草图:HTTP/HTTPS 请求路径

sequenceDiagram
  participant C as Client
  participant DNS as DNS
  participant LB as LB/Nginx
  participant APP as App
  C->>DNS: A/AAAA 查询
  DNS-->>C: IP
  C->>LB: TCP 三次握手
  C->>LB: TLS 握手(HTTPS)
  C->>LB: HTTP 请求
  LB->>APP: 转发请求
  APP-->>LB: HTTP 响应
  LB-->>C: HTTP 响应

安装与工具准备(示例)

# Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y dnsutils curl openssl tcpdump

# RHEL/CentOS
sudo yum install -y bind-utils curl openssl tcpdump

# 预期效果:dig/curl/openssl/tcpdump 可用
dig -v && curl --version | head -n 1 && openssl version

DNS 排错要点(含示例与解释)
1) 确认本地配置与递归 DNS

# 查看系统 DNS 配置
cat /etc/resolv.conf

# 使用指定递归 DNS 解析
dig @1.1.1.1 example.com

# 预期:ANSWER SECTION 返回 A/AAAA

2) 分层定位与权威解析

# 跟踪整个权威链路
dig +trace example.com

# 解释:逐级查询根/TLD/权威,确认是哪一层出现异常

3) 缓存与 TTL 影响

# 查看 TTL 和记录类型
dig example.com

# 清理 systemd-resolved 缓存(如启用)
sudo resolvectl flush-caches

4) 多记录与 CNAME 冲突

# 查看所有记录类型
dig example.com ANY

# 单独检查 CNAME 目标
dig cname-target.example.net A

5) DNS 劫持/污染验证

# 对比不同出口解析结果
dig @8.8.8.8 example.com
dig @1.1.1.1 example.com

HTTP/HTTPS 排错要点(含示例与解释)
1) 连通性与端口

# TCP 端口探测(无返回即等待/拒绝)
ss -tn sport = :443 or dport = :443

# 解释:确认本机是否已与目标建立连接

2) HTTP 语义与状态码

# 查看详细请求/响应
curl -v http://example.com/path

# 预期:< HTTP/1.1 200 OK 或 3xx/4xx/5xx

3) Host/SNI 与代理头

# 访问 IP 但指定 Host(虚拟主机场景)
curl -v -H "Host: example.com" http://1.2.3.4/

# 解释:验证反向代理/虚拟主机匹配

4) TLS/证书与协议

# 查看证书链与 SNI
openssl s_client -connect example.com:443 -servername example.com

# 解释:检查证书是否过期、链是否完整、SNI 是否匹配

5) 超时与慢请求

# 设置超时定位瓶颈
curl -m 3 -v https://example.com/slow

# 解释:-m 3 表示总超时 3 秒,定位慢在 DNS/TCP/TLS/应用

抓包辅助(DNS/HTTP/HTTPS)

# DNS 抓包
sudo tcpdump -ni eth0 port 53 -vv

# HTTP/HTTPS 抓包(不解密,仅定位建连/重传)
sudo tcpdump -ni eth0 port 80 or port 443 -vv

排错流程(可执行清单)
1. DNS:本地配置 → 递归可达 → 权威记录 → 缓存与 TTL → 多出口比对
2. HTTP:TCP 建连 → TLS 握手 → HTTP 状态码 → 头部与路由 → 后端响应
3. 证据:保存 dig 结果、curl -v 日志、抓包时间戳

典型排错示例:DNS 解析慢

# 1) 测试解析耗时
time dig @1.1.1.1 example.com

# 2) 跟踪权威链路
dig +trace example.com

# 3) 对比本地与外部 DNS
dig @127.0.0.53 example.com
dig @8.8.8.8 example.com

# 预期:确定是否递归 DNS 超时或权威链路异常

典型排错示例:HTTPS 证书错误

# 1) 证书链检查
openssl s_client -connect example.com:443 -servername example.com | \
  openssl x509 -noout -dates -issuer -subject

# 2) 通过 curl 验证
curl -Iv https://example.com

# 预期:证书未过期、链完整、Hostname 匹配

练习
1) 将本机 DNS 指向错误服务器(如不可达 IP),观察 dig 超时信息并恢复。
2) 用 curl -H "Host: example.com" 访问一台 Nginx 的 IP,验证虚拟主机是否匹配。
3) 使用 tcpdump 抓取一次 HTTPS 访问,标记 TCP 三次握手与 TLS 握手时序。