这条路径解决“ping 不通就重启网卡、超时就怪网络抖动”的问题:把连通性拆成链路、IP、路由、DNS、TCP、TLS 和 K8s 转发逐层验证。适合后端开发、SRE、以及需要处理线上网络问题的运维工程师。
前置知识:会用 Linux 命令行,知道 IP 地址、端口、网关和 DNS 的基本概念。四个阶段按依赖排序,每阶段建议 2–3 小时;实验在虚拟机、一次性容器或 kind 集群里做。
抓包可能包含凭据、Cookie 和个人数据;改路由、防火墙、MTU 或 CNI 可能直接断网。所有破坏性操作只允许在测试环境执行,并事先准备回滚命令。
目标:能把“连不上”拆成链路、IP、路由和端口四层,并用命令确认每一层的状态。
阅读顺序:
ifconfig。ss 的字段对应。动手任务:在 Linux 虚拟机或带网络工具的容器里检查地址、路由、监听端口,并起一个本地 HTTP 服务确认监听。环境必须是本机测试机;风险是修改 IP 或默认路由会让你从 SSH 断开,本任务只读不改。
ip -br addr
ip route
ss -lntp
ping -c 3 127.0.0.1
ethtool eth0 2>/dev/null | head -20
python3 -m http.server 8080 &
ss -lntp | grep 8080
kill %1
过关标准:
ip route 判断一个目标地址走哪条路由、下一跳是谁。ss 中 LISTEN、ESTABLISHED、TIME_WAIT 和 SYN-SENT 的含义。ss -lntp 找到监听进程。目标:能区分解析失败、解析慢、连不上和路径不通,并定位到具体 DNS 服务器或中间跳。
阅读顺序:
动手任务:对比公共 DNS 与系统解析结果,用 getent 验证应用路径,再用 mtr 和 nc 检查目标端口。环境是本机测试机;风险是外部 DNS 查询会泄露访问域名,mtr 可能被限速,端口探测只能针对你拥有或获授权的目标。
dig example.com +short
dig @1.1.1.1 example.com +short
getent hosts example.com
resolvectl status 2>/dev/null | head -20
mtr -rwc 20 example.com
nc -vz -w 3 example.com 443
过关标准:
dig 成功但应用解析失败的可能原因:NSS、resolv.conf、缓存或搜索域。NXDOMAIN、SERVFAIL 和查询超时分别说明什么。nc -vz 成功只代表 TCP 握手成功,不代表 TLS 和 HTTP 正常。目标:能用握手、重传、MTU 和 TLS 告警判断问题在传输层还是应用层,并用抓包验证判断。
阅读顺序:
-w 保存和回读。s_client 验证证书链、协议和 SNI。动手任务:在本机回环地址起一个自签名 TLS 服务,用 curl、s_client 和 tcpdump 分别验证握手与证书。环境是本机测试机,证书只用于本次实验;风险是自签名证书不能用于生产,抓包可能捕获敏感内容,过滤器要限定端口和数量,实验结束删除 pcap。
mkdir -p /tmp/net-lab
openssl req -x509 -newkey rsa:2048 -nodes -keyout /tmp/net-lab/lab.key -out /tmp/net-lab/lab.crt -days 1 -subj '/CN=lab.local'
openssl s_server -accept 8443 -cert /tmp/net-lab/lab.crt -key /tmp/net-lab/lab.key -www &
curl -vk --max-time 3 https://127.0.0.1:8443/
openssl s_client -connect 127.0.0.1:8443 -servername lab.local </dev/null
tcpdump -ni lo 'tcp port 8443' -c 20
kill %1
过关标准:
time_namelookup、time_connect、time_appconnect、time_total 分段定位。ping -M do 验证。目标:能把 Pod 网络问题映射到 CNI、CoreDNS、kube-proxy、NetworkPolicy 和抓包点。
阅读顺序:
resolv.conf 故障。动手任务:用 kind 起一个本地集群,运行带网络工具的 Pod,验证 Service DNS、Endpoints 和 CoreDNS 日志。环境是独立 kind 集群;风险是 netshoot 工具权限较大,不要在生产节点或共享集群运行,实验后删除整个集群。
kind create cluster --name netlab
kubectl run client --image=nicolaka/netshoot:v0.13 --restart=Never -- sleep 3600
kubectl wait --for=condition=Ready pod/client --timeout=90s
kubectl exec client -- dig kubernetes.default.svc.cluster.local +short
kubectl get svc,endpoints,endpointslices -A | head -30
kubectl -n kube-system logs -l k8s-app=kube-dns --tail=20
kind delete cluster --name netlab
过关标准:
合上页面,先回答,再展开对照。
curl 卡住不返回,如何用四个时间指标和抓包判断卡在 DNS、TCP、TLS 还是 HTTP?dig 正常,可能是什么原因?time_namelookup 判断 DNS,再看 time_connect 判断 TCP 握手,time_appconnect 判断 TLS,time_total 与响应头判断 HTTP;同时用 tcpdump 看 SYN、握手和重传停在哪一步。resolv.conf 搜索域或 ndots 配置、CoreDNS 不可达、NetworkPolicy 拒绝、Service/Endpoints 异常,或 Pod 所在节点的 DNS 转发路径与节点本机不同。