超详细的网络抓包神器 tcpdump 使用指南

tcpdump 是一款强大的网络抓包工具 , 它使用 libpcap 库来抓取网络数据包 , 这个库在几乎在所有的 linux/Unix 中都有 。熟悉 tcpdump 的使用能够帮助你分析调试网络数据 , 本文将通过一个个具体的示例来介绍它在不同场景下的使用方法 。不管你是系统管理员 , 程序员 , 云原生工程师还是 yaml 工程师 , 掌握 tcpdump 的使用都能让你如虎添翼 , 升职加薪 。
1. 基本语法和使用方法tcpdump 的常用参数如下:
$ tcpdump -i eth0 -nn -s0 -v port 80复制代码

  • -i : 选择要捕获的接口 , 通常是以太网卡或无线网卡 , 也可以是 vlan 或其他特殊接口 。如果该系统上只有一个网络接口 , 则无需指定 。
  • -nn : 单个 n 表示不解析域名 , 直接显示 IP;两个 n 表示不解析域名和端口 。这样不仅方便查看 IP 和端口号 , 而且在抓取大量数据时非常高效 , 因为域名解析会降低抓取速度 。
  • -s0 : tcpdump 默认只会截取前 96 字节的内容 , 要想截取所有的报文内容 , 可以使用 -s number ,  number 就是你要截取的报文字节数 , 如果是 0 的话 , 表示截取报文全部内容 。
  • -v : 使用 -v , -vv 和 -vvv 来显示更多的详细信息 , 通常会显示更多与特定协议相关的信息 。
  • port 80 : 这是一个常见的端口过滤器 , 表示仅抓取 80 端口上的流量 , 通常是 HTTP 。
额外再介绍几个常用参数:
  • -p : 不让网络接口进入混杂模式 。默认情况下使用 tcpdump 抓包时 , 会让网络接口进入混杂模式 。一般计算机网卡都工作在非混杂模式下 , 此时网卡只接受来自网络端口的目的地址指向自己的数据 。当网卡工作在混杂模式下时 , 网卡将来自接口的所有数据都捕获并交给相应的驱动程序 。如果设备接入的交换机开启了混杂模式 , 使用 -p 选项可以有效地过滤噪声 。
  • -e : 显示数据链路层信息 。默认情况下 tcpdump 不会显示数据链路层信息 , 使用 -e 选项可以显示源和目的 mac 地址 , 以及 VLAN tag 信息 。例如:
$ tcpdump -n -e -c 5 not ip6tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on br-lan, link-type EN10MB (Ethernet), capture size 262144 bytes18:27:53.619865 24:5e:be:0c:17:af > 00:e2:69:23:d3:3b, ethertype IPv4 (0x0800), length 1162: 192.168.100.20.51410 > 180.176.26.193.58695: Flags [.], seq 2045333376:2045334484, ack 3398690514, win 751, length 110818:27:53.626490 00:e2:69:23:d3:3b > 24:5e:be:0c:17:af, ethertype IPv4 (0x0800), length 68: 220.173.179.66.36017 > 192.168.100.20.51410: UDP, length 2618:27:53.626893 24:5e:be:0c:17:af > 00:e2:69:23:d3:3b, ethertype IPv4 (0x0800), length 1444: 192.168.100.20.51410 > 220.173.179.66.36017: UDP, length 140218:27:53.628837 00:e2:69:23:d3:3b > 24:5e:be:0c:17:af, ethertype IPv4 (0x0800), length 1324: 46.97.169.182.6881 > 192.168.100.20.59145: Flags [P.], seq 3058450381:3058451651, ack 14349180, win 502, length 127018:27:53.629096 24:5e:be:0c:17:af > 00:e2:69:23:d3:3b, ethertype IPv4 (0x0800), length 54: 192.168.100.20.59145 > 192.168.100.1.12345: Flags [.], ack 3058451651, win 6350, length 05 packets captured复制代码显示 ASCII 字符串-A 表示使用 ASCII 字符串打印报文的全部数据 , 这样可以使读取更加简单 , 方便使用 grep 等工具解析输出内容 。-X 表示同时使用十六进制和 ASCII 字符串打印报文的全部数据 。这两个参数不能一起使用 。例如:
$ tcpdump -A -s0 port 80复制代码抓取特定协议的数据后面可以跟上协议名称来过滤特定协议的流量 , 以 UDP 为例 , 可以加上参数 udp 或 protocol 17 , 这两个命令意思相同 。
$ tcpdump -i eth0 udp$ tcpdump -i eth0 proto 17复制代码同理 , tcp 与 protocol 6 意思相同 。
抓取特定主机的数据使用过滤器 host 可以抓取特定目的地和源 IP 地址的流量 。
$ tcpdump -i eth0 host 10.10.1.1复制代码也可以使用 src 或 dst 只抓取源或目的地:
$ tcpdump -i eth0 dst 10.10.1.20复制代码将抓取的数据写入文件使用 tcpdump 截取数据报文的时候 , 默认会打印到屏幕的默认输出 , 你会看到按照顺序和格式 , 很多的数据一行行快速闪过 , 根本来不及看清楚所有的内容 。不过 , tcpdump 提供了把截取的数据保存到文件的功能 , 以便后面使用其他图形工具(比如 wireshark , Snort)来分析 。


推荐阅读