网络抓包与高级工具:traceroute、tcpdump、nc
traceroute:追踪路由路径
traceroute 显示数据包到达目标主机所经过的每一跳路由器,是排查网络延迟和路由问题的利器。
# 基本用法
traceroute baidu.com
# 使用 ICMP 模式(-I,类似 Windows 的 tracert)
traceroute -I baidu.com
# 使用 TCP 模式(-T,绕过防火墙)
traceroute -T -p 80 baidu.com
# 设置最大跳数(-m max_ttl,默认 30)
traceroute -m 20 baidu.com
# 每跳发送 3 个探测包(默认)
traceroute -q 1 baidu.com
traceroute 工作原理
利用 IP 的 TTL(Time To Live)机制:
- 发送 TTL=1 的包,第 1 跳路由器 TTL 减为 0,丢弃并返回 ICMP Time Exceeded
- 发送 TTL=2 的包,第 2 跳路由器返回 ICMP Time Exceeded
- 依次递增 TTL,直到到达目标主机
traceroute 输出解读
traceroute to baidu.com (110.242.68.66), 30 hops max, 60 byte packets
1 192.168.1.1 (192.168.1.1) 1.234 ms 1.456 ms 1.678 ms
2 10.0.0.1 (10.0.0.1) 5.432 ms 5.678 ms 5.901 ms
3 * * * # 超时,可能防火墙丢弃 ICMP
4 61.135.1.1 (61.135.1.1) 15.234 ms 15.456 ms 15.678 ms
5 110.242.68.66 (110.242.68.66) 20.123 ms 20.345 ms 20.567 ms
| 字段 | 含义 |
|---|---|
| 1, 2, 3... | 跳数(TTL) |
| IP 地址 | 该跳路由器的地址 |
| ms | 往返时间(3 个探测包的 RTT) |
* * * | 超时,该跳不响应 ICMP(可能是防火墙) |
tcpdump:网络抓包
tcpdump 是命令行下的 Wireshark,用于捕获和分析网络数据包。
# 需要 root 权限
sudo tcpdump
# 抓取特定接口(-i interface)
sudo tcpdump -i eth0
# 抓取特定端口
sudo tcpdump port 80
# 抓取特定主机
sudo tcpdump host 192.168.1.1
# 抓取特定协议
sudo tcpdump icmp # ICMP(ping)
sudo tcpdump tcp # TCP
sudo tcpdump udp # UDP
# 组合条件(and / or / not)
sudo tcpdump host 192.168.1.1 and port 80
sudo tcpdump port 80 or port 443
# 保存到文件(-w write)
sudo tcpdump -w capture.pcap
# 读取文件(-r read)
tcpdump -r capture.pcap
# 显示详细内容(-v verbose, -vv 更详细)
sudo tcpdump -vv
# 只显示摘要(不显示内容,-q quiet)
sudo tcpdump -q
# 抓取 100 个包后停止(-c count)
sudo tcpdump -c 100 -w capture.pcap
# 抓取 HTTP 请求(ASCII 显示,-A)
sudo tcpdump -A port 80
tcpdump 过滤表达式
# 源/目的地址
sudo tcpdump src 192.168.1.1 # 源地址
sudo tcpdump dst 192.168.1.1 # 目的地址
# 源/目的端口
sudo tcpdump src port 80 # 源端口
sudo tcpdump dst port 443 # 目的端口
# TCP 标志
sudo tcpdump 'tcp[tcpflags] & tcp-syn != 0' # SYN 包
sudo tcpdump 'tcp[tcpflags] & tcp-fin != 0' # FIN 包
sudo tcpdump 'tcp[tcpflags] & tcp-rst != 0' # RST 包
# 数据包大小
sudo tcpdump greater 100 # 大于 100 字节
sudo tcpdump less 500 # 小于 500 字节
nc(netcat):网络瑞士军刀
nc(netcat)是功能极其丰富的网络调试工具,被称为"网络界的瑞士军刀"。
端口扫描
# 扫描单个端口
nc -vz baidu.com 80
# Connection to baidu.com 80 port [tcp/http] succeeded!
# 扫描端口范围
nc -vz baidu.com 1-1000
# 快速扫描(-z 零 I/O 模式,不发送数据)
nc -z -v 192.168.1.1 20-80
创建临时服务端
# 监听 8080 端口,把收到的内容显示在终端
nc -l 8080
# 监听并把收到的内容保存到文件
nc -l 8080 > received.txt
# 监听并发送文件内容
nc -l 8080 < file.txt
创建临时客户端
# 连接远程端口
nc baidu.com 80
# 连接后发送 HTTP 请求
nc baidu.com 80
GET / HTTP/1.1
Host: baidu.com
# 按两次回车发送请求
文件传输
# 接收方(先启动)
nc -l 1234 > received.zip
# 发送方
nc <接收方IP> 1234 < file.zip
聊天工具
# 服务端
nc -l 5555
# 客户端
nc <服务端IP> 5555
# 双方输入的内容会实时显示在对方终端
综合实战:排查网络问题
场景:无法访问某个网站
# Step 1: DNS 解析正常?
nslookup example.com
# Step 2: 路由可达?
ping example.com
# Step 3: 哪一跳出问题?
traceroute example.com
# Step 4: 端口开放?
nc -vz example.com 80
nc -vz example.com 443
# Step 5: HTTP 服务正常?
curl -v http://example.com
# Step 6: 抓包看细节
sudo tcpdump -i any host example.com -w debug.pcap
# 同时执行 curl,然后用 Wireshark 分析
本篇小结
traceroute:追踪路由路径,利用 TTL 递增机制,* * *表示该跳不响应 ICMPtcpdump:命令行抓包,-i指定接口,-w保存文件,host/port/proto过滤nc:网络瑞士军刀,-vz端口扫描,-l创建服务端,支持文件传输和聊天- 排查流程:DNS → ping → traceroute → nc 端口测试 → curl HTTP 测试 → tcpdump 抓包
动手实践
traceroute 追踪:
traceroute baidu.com traceroute -I baidu.com # 对比两种模式的输出差异tcpdump 抓包:
# 终端 1:抓包 sudo tcpdump -i any port 80 -w http.pcap # 终端 2:发起请求 curl http://example.com # 终端 1:Ctrl+C 停止抓包 # 用 Wireshark 打开 http.pcap 分析nc 端口扫描:
nc -vz localhost 1-1000 # 观察哪些端口开放nc 创建临时服务端:
# 终端 1 nc -l 8080 # 终端 2 nc localhost 8080 # 在终端 2 输入文字,观察终端 1 是否收到综合排查:
# 选择一个无法访问的网站(如果都正常,用错误端口模拟) # 按排查流程逐步定位问题思考:为什么
traceroute的某些跳显示* * *?这一定意味着网络故障吗?防火墙如何影响 traceroute 的结果?