飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • 基础入门

    • Linux 命令概述与环境准备
    • 文件与目录操作(上):ls、cd、pwd
    • 文件与目录操作(下):cat、touch、mkdir、rm、cp、mv
    • 获取帮助与基础工具:man、help、clear、exit、sudo
  • 文件权限

    • 文件权限管理:chmod、chown
  • 系统与监控

    • 进程管理与系统监控:ps、top、kill、df、du、free
    • 用户与环境:whoami、id、env、echo、history
  • 网络命令

    • 网络诊断(上):ping、curl、wget
    • 网络诊断(下):netstat、ss、ip
    • 网络抓包与高级工具:traceroute、tcpdump、nc
    • DNS 与防火墙:nslookup、dig、iptables
  • 文本处理

    • 文本搜索:grep
    • 文本处理(上):awk
    • 文本处理(下):sed
    • 文本排序与统计:sort、uniq、wc
    • 文件查看与查找:head、tail、cut、find
    • 归档压缩与管道组合:tar、gzip、xargs
  • 开发工具

    • 开发工具链(上):gcc、make
    • 开发工具链(下):gdb、time
    • 版本控制:git
    • 远程操作:ssh、scp
    • 编辑器:vim、nano
  • Shell 编程

    • Shell 编程基础(上):变量、管道、重定向
    • Shell 编程基础(下):条件、循环、函数
  • 综合实战

    • 综合实战:日志分析

网络抓包与高级工具: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)机制:

  1. 发送 TTL=1 的包,第 1 跳路由器 TTL 减为 0,丢弃并返回 ICMP Time Exceeded
  2. 发送 TTL=2 的包,第 2 跳路由器返回 ICMP Time Exceeded
  3. 依次递增 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 递增机制,* * * 表示该跳不响应 ICMP
  • tcpdump:命令行抓包,-i 指定接口,-w 保存文件,host/port/proto 过滤
  • nc:网络瑞士军刀,-vz 端口扫描,-l 创建服务端,支持文件传输和聊天
  • 排查流程:DNS → ping → traceroute → nc 端口测试 → curl HTTP 测试 → tcpdump 抓包

动手实践

  1. traceroute 追踪:

    traceroute baidu.com
    traceroute -I baidu.com
    # 对比两种模式的输出差异
    
  2. tcpdump 抓包:

    # 终端 1:抓包
    sudo tcpdump -i any port 80 -w http.pcap
    
    # 终端 2:发起请求
    curl http://example.com
    
    # 终端 1:Ctrl+C 停止抓包
    # 用 Wireshark 打开 http.pcap 分析
    
  3. nc 端口扫描:

    nc -vz localhost 1-1000
    # 观察哪些端口开放
    
  4. nc 创建临时服务端:

    # 终端 1
    nc -l 8080
    
    # 终端 2
    nc localhost 8080
    # 在终端 2 输入文字,观察终端 1 是否收到
    
  5. 综合排查:

    # 选择一个无法访问的网站(如果都正常,用错误端口模拟)
    # 按排查流程逐步定位问题
    
  6. 思考:为什么 traceroute 的某些跳显示 * * *?这一定意味着网络故障吗?防火墙如何影响 traceroute 的结果?

上一页
网络诊断(下):netstat、ss、ip
下一页
DNS 与防火墙:nslookup、dig、iptables