配合 第04章 HTTP、第06章 SOCKS、第08章 PAC、第09章 PROXY protocol 速查。
| 形态 | 样例 | 场景 |
|---|
| origin-form | GET /path HTTP/1.1 | 直连 / 反向代理 |
| absolute-form | GET http://host/path HTTP/1.1 | 正向代理 |
| authority-form | CONNECT host:443 HTTP/1.1 | 仅 CONNECT |
| asterisk-form | OPTIONS * HTTP/1.1 | 服务器级 OPTIONS |
→ CONNECT example.com:443 HTTP/1.1
Host: example.com:443
Proxy-Authorization: Basic xxx (如需认证)
← HTTP/1.1 200 Connection Established (无 body,之后裸转字节)
Connection Keep-Alive Proxy-Authenticate Proxy-Authorization
TE Trailer Transfer-Encoding Upgrade
(外加 Connection 头里点名的所有字段)
| 角色 | 质询码 | 质询头 | 应答头 |
|---|
| 代理 | 407 | Proxy-Authenticate | Proxy-Authorization |
| 源站 | 401 | WWW-Authenticate | Authorization |
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)
① 方法协商 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
④ 转发 双向裸转字节
| 字段 | 值 | 含义 |
|---|
| 认证 METHOD | 00/01/02/FF | 无 / GSSAPI / 用户密码 / 无可接受 |
| CMD | 01/02/03 | CONNECT / BIND / UDP ASSOCIATE |
| ATYP | 01/03/04 | IPv4 / 域名(1字节长+N) / IPv6 |
| REP | 00 | 成功 |
| 01/02/03/04 | 一般失败 / 规则不允许 / 网络不可达 / 主机不可达 |
| 05/06/07/08 | 连接被拒 / TTL 过期 / 命令不支持 / 地址类型不支持 |
+-----+------+------+----------+----------+----------+
| RSV | FRAG | ATYP | DST.ADDR | DST.PORT | DATA |
| 2 | 1 | 1 | 变长 | 2 | 变长 |
+-----+------+------+----------+----------+----------+
| SOCKS4 | SOCKS4a | SOCKS5 |
|---|
| 域名(远端 DNS) | ❌ | ✅ | ✅ |
| IPv6 | ❌ | ❌ | ✅ |
| 认证 | userid | userid | 无/密码/GSSAPI |
| UDP | ❌ | ❌ | ✅ |
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:port | HTTP 代理 |
SOCKS / SOCKS5 host:port | SOCKS 代理 |
辅助函数:isInNet dnsDomainIs shExpMatch myIpAddress dnsResolve weekdayRange
WPAD 发现顺序:DHCP option 252 → DNS wpad.<domain> → http://wpad.<domain>/wpad.dat
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)。
http_proxy=http://proxy:3128
https_proxy=http://proxy:3128
all_proxy=socks5h://proxy:1080
no_proxy=localhost,127.0.0.1,.svc,.cluster.local,10.0.0.0/8,169.254.169.254