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:抓包与命令速查

附录 C:抓包与命令速查

全书出现过的代理排查命令汇总,按工具分类。配合 第32章 排错决策树 使用。


curl:代理客户端瑞士军刀

# 正向 HTTP 代理
curl -x http://proxy:3128 http://example.com/
curl -x http://user:pass@proxy:3128 https://example.com/    # 带认证 → Proxy-Authorization

# SOCKS5 代理
curl --socks5 proxy:1080 http://example.com/                # 本地 DNS(可能泄漏)
curl --socks5-hostname proxy:1080 http://example.com/       # 远端 DNS(不泄漏)

# 分段计时(定位慢在哪段,第03章)
curl -w "DNS:%{time_namelookup} 连:%{time_connect} TLS:%{time_appconnect} 首字节:%{time_starttransfer} 总:%{time_total}\n" \
     -s -o /dev/null https://example.com/

# 看 CONNECT 隧道握手 / 协议版本
curl -v -x http://proxy:3128 https://example.com/ 2>&1 | grep -E "CONNECT|200|ALPN"
curl --http2 / --http3 ... -w "%{http_version}\n"

# 强制走/不走代理
curl --noproxy '*' http://example.com/     # 忽略环境变量代理

tcpdump / tshark:看字节与握手

# 看某端口的明文(HTTP 代理报文,第01章)
sudo tcpdump -i any -n -A 'tcp port 3128'

# 提取 TLS ClientHello 的 SNI(第02章 SNI 嗅探)
sudo tshark -i any -f "tcp port 443" -Y "tls.handshake.extensions_server_name" \
     -T fields -e tls.handshake.extensions_server_name

# 看 SOCKS5 二进制握手(第06章)
sudo tcpdump -i lo -n -X 'tcp port 1080'

# 看 DNS 查询(验证 DNS 泄漏,第03章)
sudo tcpdump -i any -n 'udp port 53'

openssl s_client:TLS 诊断

# 看 ALPN 协商(h2/http1.1,第07章)
openssl s_client -connect host:443 -alpn h2,http/1.1 </dev/null 2>/dev/null | grep ALPN

# 看证书签发者(判断是否被 MITM,第05章)
openssl s_client -connect host:443 -servername host </dev/null 2>/dev/null \
  | openssl x509 -noout -issuer

# 经代理诊断
openssl s_client -connect host:443 -proxy proxy:3128 </dev/null

ss / netstat:连接状态

ss -s                                  # 连接总览
ss -tanp                               # 所有 TCP 连接 + 进程
ss -tan state time-wait | wc -l        # TIME_WAIT 堆积(第31章)
ss -tan state close-wait | wc -l       # CLOSE_WAIT 堆积 = 连接泄漏(第21章)

iptables:透明代理劫持(第11章)

# REDIRECT 把出站 80 劫持到本地 3128(放过代理自己防环路)
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -m owner ! --uid-owner 1000 \
     -j REDIRECT --to-port 3128

# TPROXY(支持 UDP,不改包)
sudo iptables -t mangle -A PREROUTING -p tcp --dport 80 \
     -j TPROXY --on-port 50080 --tproxy-mark 0x1/0x1
sudo ip rule add fwmark 0x1 lookup 100
sudo ip route add local 0.0.0.0/0 dev lo table 100

# 看 conntrack 用量(透明代理/NAT,第31章)
cat /proc/sys/net/netfilter/nf_conntrack_count

mitmproxy:抓改 HTTPS 明文(第18章)

mitmproxy --listen-port 8080            # 交互式 TUI
mitmweb --listen-port 8080              # Web UI(移动端抓包)
mitmdump -s addon.py --listen-port 8080 # 脚本化改包
# CA 位置:~/.mitmproxy/mitmproxy-ca-cert.pem(客户端需信任)

内核调优(第31章)

ulimit -n 1048576
sudo sysctl -w net.core.somaxconn=65535
sudo sysctl -w net.ipv4.ip_local_port_range="1024 65535"
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
sudo sysctl -w net.netfilter.nf_conntrack_max=1048576

压测(第31章)

# wrk2 恒定速率,避开协调遗漏,看真实 p99/p999
wrk2 -t8 -c200 -d30s -R10000 --latency http://proxy/api

Docker 代理(第25章)

# daemon 代理(拉镜像)
sudo systemctl show --property=Environment docker
# 容器内代理指向宿主
docker run --add-host=host.docker.internal:host-gateway \
  -e HTTP_PROXY=http://host.docker.internal:3128 img
docker info | grep -A2 "Registry Mirrors"

istioctl:Mesh 数据面排查(第26/29章)

# 看 sidecar 的 iptables 劫持规则(防环路 uid 1337)
kubectl exec <pod> -c istio-proxy -- iptables -t nat -S | grep ISTIO

# 看 Envoy 拿到的 xDS 配置
istioctl proxy-config listeners <pod>
istioctl proxy-config routes    <pod>
istioctl proxy-config clusters  <pod>
istioctl proxy-config endpoints <pod>
istioctl proxy-status                       # xDS 是否 SYNCED
istioctl authn tls-check <pod> <svc>        # mTLS 状态

# Envoy admin(第15章)
kubectl exec <pod> -c istio-proxy -- curl -s localhost:15000/config_dump | jq .
kubectl exec <pod> -c istio-proxy -- curl -s localhost:15000/stats | grep upstream_rq

安全自检(第33章)

# 检测开放代理(外部应被拒)
curl -x http://你的代理:3128 http://example.com/ -m 5    # 期望 407/403

# 验证 Proxy-Authorization 不外泄
curl -x http://u:p@代理:3128 http://httpbin.org/headers  # 响应里不应有 Proxy-Authorization

三份附录到此结束。回到 手册首页 查看完整目录,或从 第01章 重读。

Prev
附录 B:组件选型决策树