banner
约 300 字
1 分钟

代理排障实战:超时、DNS 污染与证书问题

摘要

按连接、解析、加密三层给出代理排障路径:区分超时/拒绝、本地与远端 DNS 解析、自签/中间人/证书锁定问题,并附 curl/tcpdump/openssl、日志、浏览器与移动端及真实案例。

代理排障实战:超时、DNS 污染与证书问题

引言

代理配完不通,是最让人抓狂的运维场景。本文按“连接→解析→加密”三层,给出可落地的排查路径与真实案例。

一、连接层:超时还是拒绝?

bash
curl -v -x http://proxy:8080 https://target.com
  • Connection refused:代理地址/端口写错,或代理进程没起。

  • Connection timed out:网络不通或被防火墙拦截。先验证链路:

    bash
    ping -c 3 proxy.host
    nc -vz proxy.host 8080      # 或 telnet proxy.host 8080
  • Read timed out:连上了但后端迟迟不响应,调大 proxy_read_timeout

二、解析层:DNS 在哪发生?

代理有“本地解析”和“远端解析”两种模式,差异巨大:

  • 远端解析(推荐):客户端把域名发给代理,由代理去解析,可绕过本机 DNS 污染。

  • 本地解析:客户端先解析出 IP 再交给代理,若本机 DNS 被污染,代理也无能为力。

排查 DNS 污染:

bash
dig target.com @223.5.5.5
dig target.com @8.8.8.8
# 两个公共 DNS 结果不一致,往往说明存在污染或劫持

三、加密层:证书问题

  • 自签证书:代理做中间人解密时,需把自定义 CA 装到客户端信任库。

  • SNI 不匹配:SNI 残留旧域名时后端握手失败。

  • 证书锁定(Certificate Pinning):部分 App 锁死证书,强行代理会直接报错,这类通常无法简单绕过,属预期安全行为。

用 OpenSSL 直接验证链路:

bash
openssl s_client -connect target.com:443 -servername target.com

四、防火墙与 iptables

确认没有规则把代理流量挡掉:

bash
iptables -L -n -v        # 查看 filter 表
iptables -t nat -L -n -v  # 查看 NAT(透明代理相关)

五、日志定位

  • 代理访问日志:看请求是否到达、返回码是什么。

  • 后端错误日志:看是否收到请求、为何 5xx。

  • Nginx 可加 $upstream_response_time$upstream_addr 定位慢后端。

六、抓包定位

bash
tcpdump -i any -n host proxy.ip and port 8080 -w proxy.pcap

抓下来用 Wireshark 看请求到底卡在哪一跳:是 TCP 没建起来、TLS 握手失败,还是应用层一直没响应。

七、浏览器与移动端

  • 浏览器:设置里配置 HTTP/SOCKS 代理;用无痕窗口排除扩展干扰。

  • 移动端:Wi-Fi 高级设置里填代理;注意部分 App 不遵守系统代理,需借助 VPN/透明代理才能覆盖。

八、两个真实案例

案例 A:连得上但偶尔 504 —— 代理读超时设了 10s,而后端报表任务要 40s。把 proxy_read_timeout 调到 60s 解决。

案例 B:某些域名打不开,其他正常 —— dig 对比发现该域名本地解析被劫持。改用远端解析(socks5h/远端 HTTP 代理)后恢复。

九、排障清单(按顺序)

  1. TCP 连通性(ping/telnet/nc)。

  2. 代理进程与端口(ss -lntp)。

  3. DNS 解析位置与是否被污染(dig 对比)。

  4. TLS 握手(openssl s_client)。

  5. 后端健康(curl 直连后端)。

  6. 抓包看真实交互(tcpdump)。

小结

代理排障的本质是分层定位:先确认 TCP 通不通,再看 DNS 在哪解析,最后查 TLS 握手。按顺序来,很少解决不了。

延伸

  • 本系列前四篇:正向/反向代理、Nginx、HAProxy、代理协议

END