Linux 抓包入门:tcpdump 如何定位网络问题?

📅 2026/7/23 20:31:28
Linux 抓包入门:tcpdump 如何定位网络问题?
Linux 抓包入门tcpdump 如何定位网络问题1. 前言当ping、curl、ss都不能完全说明问题时就需要抓包。抓包可以直接看到网络数据包有没有到达服务器、有没有返回、端口是否正确、连接是否被重置。Linux 中最常用的命令行抓包工具是tcpdump它适合在服务器上快速定位网络问题。本文重点讲解tcpdump 基本用法如何按网卡、主机、端口过滤如何保存 pcap 文件如何分析 TCP 三次握手常见网络问题如何用 tcpdump 判断。2. 安装 tcpdumpUbuntu / Debiansudo apt install tcpdumpCentOS / RHELsudo yum install tcpdump查看版本tcpdump --version抓包通常需要 root 权限。3. 查看网卡抓包前先查看网卡ip addr常见网卡eth0 ens33 ens160 lo如果不确定抓哪张网卡可以使用sudo tcpdump -D列出可抓包接口。4. 基本抓包命令抓取 eth0 上的数据包sudo tcpdump -i eth0抓取并不解析域名和端口名sudo tcpdump -i eth0 -nn推荐加-nn输出更清晰。限制抓 10 个包sudo tcpdump -i eth0 -nn -c 105. 按主机过滤只抓某个 IP 相关的数据包sudo tcpdump -i eth0 -nn host 192.168.1.10只抓源 IPsudo tcpdump -i eth0 -nn src host 192.168.1.10只抓目标 IPsudo tcpdump -i eth0 -nn dst host 192.168.1.106. 按端口过滤抓取 80 端口sudo tcpdump -i eth0 -nn port 80抓取目标端口 8080sudo tcpdump -i eth0 -nn dst port 8080抓取源端口 8080sudo tcpdump -i eth0 -nn src port 8080抓取 TCP 80sudo tcpdump -i eth0 -nn tcp port 80抓取 UDP 53sudo tcpdump -i eth0 -nn udp port 537. 组合过滤条件抓某个客户端访问本机 8080sudo tcpdump -i eth0 -nn host 192.168.1.20 and port 8080抓来自某 IP 且目标端口为 443sudo tcpdump -i eth0 -nn src host 192.168.1.20 and dst port 443抓 80 或 443sudo tcpdump -i eth0 -nn port 80 or port 443复杂表达式建议加引号避免被 Shell 解析。8. 显示包内容以 ASCII 显示数据内容sudo tcpdump -i eth0 -nn -A port 80以十六进制和 ASCII 显示sudo tcpdump -i eth0 -nn -X port 80HTTP 明文请求可以看到部分内容。HTTPS 是加密的通常看不到明文请求体。9. 保存抓包文件保存为 pcap 文件sudo tcpdump -i eth0 -nn port 8080 -w capture.pcap之后可以用 Wireshark 打开分析。读取 pcap 文件tcpdump -nn -r capture.pcap抓包文件适合发给其他人协助分析。10. TCP 三次握手怎么看TCP 建立连接时会出现三次握手SYN SYN, ACK ACK抓 8080 端口sudo tcpdump -i eth0 -nn tcp port 8080如果看到client server: Flags [S] server client: Flags [S.] client server: Flags [.]说明 TCP 连接建立成功。Flags 含义标志含义SSYN.ACKFFINRRSTPPUSH11. 常见问题判断11.1 服务器收不到包客户端访问时服务器抓包sudo tcpdump -i eth0 -nn host 客户端IP and port 8080如果完全没有包说明请求没有到达服务器。可能原因客户端没发出路由不通云安全组拦截上游防火墙拦截抓错网卡。11.2 服务器收到 SYN但没有 SYN ACK如果只看到客户端发 SYNclient server: Flags [S]但没有服务器返回 SYN ACK可能原因服务没监听端口本机防火墙丢包内核没有响应目标端口不对。先检查ss -lntp | grep :8080 iptables -L -n firewall-cmd --list-all11.3 服务器返回 RST如果看到server client: Flags [R.]说明连接被重置。常见原因端口没有服务监听应用主动拒绝中间设备重置连接协议不匹配。11.4 TCP 建立成功但 HTTP 没响应能看到三次握手但 curl 一直等待。说明网络层通了问题可能在应用层应用线程阻塞后端处理慢数据库卡住反向代理超时应用没有返回响应。这时继续看应用日志和服务状态。12. 抓 DNS 请求DNS 通常使用 UDP 53。sudo tcpdump -i eth0 -nn udp port 53测试nslookup www.baidu.com如果没有 DNS 请求发出可能是本机解析配置问题。如果请求发出但没有响应可能是 DNS 服务器不可达。13. 抓 ICMP ping 包抓 pingsudo tcpdump -i eth0 -nn icmp另一个终端执行ping 目标IP可以看到 ICMP echo request 和 echo reply。14. tcpdump 常用参数总结参数作用-i指定网卡-nn不解析域名和端口名-c指定抓包数量-w保存到文件-r读取 pcap 文件-AASCII 显示内容-X十六进制和 ASCII 显示host按主机过滤src源地址dst目标地址port按端口过滤tcpTCP 协议udpUDP 协议icmpICMP 协议15. 小结tcpdump 的价值在于直接看到数据包有没有到达、有没有返回、返回了什么。常用命令sudo tcpdump -i eth0 -nn sudo tcpdump -i eth0 -nn host 192.168.1.10 sudo tcpdump -i eth0 -nn port 8080 sudo tcpdump -i eth0 -nn tcp port 80 sudo tcpdump -i eth0 -nn -w capture.pcap排查网络问题时可以这样判断抓不到包请求没到服务器 只看到 SYN服务或防火墙可能有问题 看到 RST连接被拒绝或重置 握手成功但无响应应用层问题掌握 tcpdump 后网络排查就不再只能靠猜。