附录 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