附录 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章 重读。