HiHuo
首页
博客
手册
工具
关于
首页
博客
手册
工具
关于
  • 代理技术全栈手册

    • 代理技术全栈手册 - HiHuo
    • 原理篇

      • 第01章 代理是什么:正向 / 反向 / 透明 / 隧道的统一模型
      • 第02章 代理与网络层级:L3 / L4 / L5 / L7 在哪里截断流量
      • 第03章 一个请求穿过代理的一生:连接生命周期全景
    • 协议篇

      • 第04章 HTTP 代理协议:绝对 URI、CONNECT 隧道、转发头与连接池
      • 第05章 HTTPS 与 TLS 代理:终止 / 透传 / MITM / SNI / mTLS
      • 第06章 SOCKS 协议:SOCKS4/4a/5 与 UDP ASSOCIATE 报文级解析
      • 第07章 HTTP/2、gRPC 与 HTTP/3(QUIC) 代理的挑战
      • 第08章 代理自动配置:PAC / WPAD / 系统代理 / NO_PROXY
    • 层级与转发篇

      • 第09章 L4 代理:TCP/UDP 转发与连接级负载均衡
      • 第10章 L7 代理:协议感知与基于内容的路由
      • 第11章 透明代理:iptables REDIRECT/DNAT、TPROXY 与 eBPF 劫持
      • 第12章 数据搬运的艺术:splice / sendfile / 零拷贝 / io_uring
    • 组件横评篇

      • 第13章 Nginx / OpenResty:反向代理、upstream 与 Lua 可编程
      • 第14章 HAProxy:L4/L7、ACL、健康检查与 stick table
      • 第15章 Envoy:xDS 动态配置与 filter chain,为何是云原生数据面
      • 第16章 Traefik / Caddy:自动服务发现与自动 HTTPS
      • 第17章 Squid 与正向/缓存代理:企业出网、缓存与审计
      • 第18章 mitmproxy:抓包、改包、脚本化调试
      • 第19章 内网穿透与隧道:frp / gost / SSH 隧道 / ngrok
      • 第20章 科学上网生态的技术原理(技术中立)
    • 多语言手写篇

      • 第21章 Go:100 行手写 HTTP/CONNECT + SOCKS5 代理
      • 第22章 Rust:基于 tokio 的高性能 TCP 代理
      • 第23章 Python:asyncio 实现,适合调试与脚本
      • 第24章 C:epoll 裸写与零拷贝,及语言选型对比
    • 容器与K8s篇

      • 第25章 Docker 里的代理:HTTP_PROXY、build/pull 与 daemon 配置
      • 第26章 Sidecar 与流量劫持:Istio init-container 的 iptables 原理
      • 第27章 Ingress 与南北流量:Ingress-nginx 与 Gateway API
      • 第28章 Egress 与出网治理:出口网关、registry mirror、审计
      • 第29章 Service Mesh 数据面:Envoy Sidecar 全链路
    • 进阶篇

      • 第30章 可编程代理:Lua / Wasm / eBPF / xDS,代理的"软件定义"
      • 第31章 性能调优:并发模型、连接池、超时与重试、压测
      • 第32章 排错决策树:502 / 504 / 握手失败 / 环路 / 泄漏
      • 第33章 代理安全:开放代理、SSRF、凭证泄漏与攻击面
    • 底层机制篇

      • 第34章 代理的背压与流控:一个代理最难的部分
      • 第35章 socket 与 TCP 状态机:半关闭、超时、连接生命周期
      • 第36章 HTTP/2 帧、流控与 HPACK:h2 代理的内部机制
      • 第37章 负载均衡算法推导与韧性状态机
      • 第38章 Capstone:把玩具代理改造成生产级骨架
    • 综合实战篇

      • 第39章 企业多跳转发链:拓扑、协议矩阵与贯穿性难题
      • 第40章 端到端实战:把 6 类流量全代理通
      • 第41章 更刁钻的流量:gRPC、长轮询、WebRTC、大文件、双向流
      • 第42章 可落地完整参考实现:一套能跑的多协议转发栈
    • 附录

      • 附录 A:代理协议报文速查(HTTP / SOCKS / PAC / PROXY protocol)
      • 附录 B:组件选型决策树
      • 附录 C:抓包与命令速查

附录 A:代理协议报文速查(HTTP / SOCKS / PAC / PROXY protocol)

配合 第04章 HTTP、第06章 SOCKS、第08章 PAC、第09章 PROXY protocol 速查。


HTTP 代理

request-target 四形态(RFC 7230 §5.3)

形态样例场景
origin-formGET /path HTTP/1.1直连 / 反向代理
absolute-formGET http://host/path HTTP/1.1正向代理
authority-formCONNECT host:443 HTTP/1.1仅 CONNECT
asterisk-formOPTIONS * HTTP/1.1服务器级 OPTIONS

CONNECT 隧道

→ CONNECT example.com:443 HTTP/1.1
  Host: example.com:443
  Proxy-Authorization: Basic xxx        (如需认证)
← HTTP/1.1 200 Connection Established    (无 body,之后裸转字节)

hop-by-hop 头(代理必须删除)

Connection   Keep-Alive   Proxy-Authenticate   Proxy-Authorization
TE           Trailer      Transfer-Encoding     Upgrade
(外加 Connection 头里点名的所有字段)

代理认证

角色质询码质询头应答头
代理407Proxy-AuthenticateProxy-Authorization
源站401WWW-AuthenticateAuthorization

转发溯源头

Via: 1.1 proxyname (squid/5.7)
X-Forwarded-For: 真实客户端, 代理1, 代理2     (最左=真实,可伪造!)
X-Forwarded-Proto: https
X-Forwarded-Host: example.com
Forwarded: for=203.0.113.7;proto=https;by=10.0.0.2   (RFC 7239)

SOCKS5(RFC 1928)

握手四步

① 方法协商  C→ VER(05) NMETHODS METHODS...     S→ VER(05) METHOD
② 认证(可选) C→ VER(01) ULEN UNAME PLEN PASSWD   S→ VER(01) STATUS   (RFC 1929)
③ 请求       C→ VER(05) CMD RSV(00) ATYP DST.ADDR DST.PORT
            S→ VER(05) REP RSV(00) ATYP BND.ADDR BND.PORT
④ 转发       双向裸转字节

字段表

字段值含义
认证 METHOD00/01/02/FF无 / GSSAPI / 用户密码 / 无可接受
CMD01/02/03CONNECT / BIND / UDP ASSOCIATE
ATYP01/03/04IPv4 / 域名(1字节长+N) / IPv6
REP00成功
01/02/03/04一般失败 / 规则不允许 / 网络不可达 / 主机不可达
05/06/07/08连接被拒 / TTL 过期 / 命令不支持 / 地址类型不支持

UDP ASSOCIATE 包头

+-----+------+------+----------+----------+----------+
| RSV | FRAG | ATYP | DST.ADDR | DST.PORT |   DATA   |
|  2  |  1   |  1   |   变长   |    2     |   变长   |
+-----+------+------+----------+----------+----------+

SOCKS 版本能力

SOCKS4SOCKS4aSOCKS5
域名(远端 DNS)❌✅✅
IPv6❌❌✅
认证useriduserid无/密码/GSSAPI
UDP❌❌✅

PAC(第08章)

function FindProxyForURL(url, host) {
    if (isInNet(host, "10.0.0.0", "255.0.0.0")) return "DIRECT";
    if (shExpMatch(host, "*.video.com"))        return "SOCKS5 s:1080";
    return "PROXY a:8080; PROXY b:8080; DIRECT";   // 分号回退链
}
返回值含义
DIRECT直连
PROXY host:portHTTP 代理
SOCKS / SOCKS5 host:portSOCKS 代理

辅助函数:isInNet dnsDomainIs shExpMatch myIpAddress dnsResolve weekdayRange

WPAD 发现顺序:DHCP option 252 → DNS wpad.<domain> → http://wpad.<domain>/wpad.dat


PROXY protocol(第09章)

v1(文本,连接最前面一行):
  PROXY TCP4 198.51.100.7 203.0.113.1 56324 443\r\n
        协议  源IP        目的IP       源端口 目的端口

v2(二进制,12 字节签名 0D0A0D0A000D0A515549540A + 版本/命令/地址族 + 地址)

后端需显式开启接收(Nginx proxy_protocol、HAProxy accept-proxy)。


环境变量代理(第08章)

http_proxy=http://proxy:3128       # 小写优先;HTTP_PROXY 大写被 curl 忽略(Httpoxy)
https_proxy=http://proxy:3128      # 值用 http://(不是 https://)
all_proxy=socks5h://proxy:1080     # socks5h = 远端 DNS(不泄漏)
no_proxy=localhost,127.0.0.1,.svc,.cluster.local,10.0.0.0/8,169.254.169.254
Next
附录 B:组件选型决策树