使用tcpdump命令进行抓包

tcpdump命令是什么

  1. tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
  2. 可以将tcpdump理解为一个具有抓取数据包功能的命令。

怎么用

tcpdump命令跟其他的Linux命令的使用类似,需要与参数一起使用才能体现其强大的功能。

  1. tcpdump :默认启动,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。
  2. tcpdump -i eth1-i可以指定网络接口,any表示监视所有的网口。
  3. tcpdump host 210.27.48.1 : 抓取指定IP的数据包
  1. tcpdump src host 210.27.48.1
  2. tcpdump dst host 210.27.48.1
  1. tcpdump tcp port 23 and host 210.27.48.1 : 抓取指定端口和指定IP的数据包
  1. tcpdump udp port 123
  1. tcpdump -i any tcp port 9080 -A -s 0
  2. tcpdump -i any tcp port 9100 -w data.cap 抓取指定端口数据包到文件

tcpdump命令参数介绍

  1. -A: 以ASCII码方式显示每一个数据包(不会显示数据包中链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据
  2. -c count: tcpdump将在接受到count个数据包后退出
  3. -d: 以容易阅读的形式,在标准输出上打印出编排过的包匹配码, 随后tcpdump停止
  4. -dd: 以C语言的形式打印出包匹配码
  5. -ddd: 以十进制数的形式打印出包匹配码
  6. -e: 每行的打印输出中将包括数据包的数据链路层头部信息
  7. -i interface: 指定tcpdump 需要监听的接口
  8. -s snaplen: 设置tcpdump的数据包抓取长度为snaplen, 如果不设置默认将会是68字节(而支持网络接口分接头的SunOS系列操作系统中默认的也是最小值是96).68字节对于IP, ICMP, TCP 以及 UDP 协议的报文已足够, 但对于名称服务, NFS服务相关的数据包会产生包截短. 如果产生包截短这种情况, tcpdump的相应打印输出行中会出现’‘[|proto]’'的标志(proto 实际会显示为被截短的数据包的相关协议层次). 需要注意的是, 采用长的抓取长度(nt: snaplen比较大), 会增加包的处理时间, 并且会减少tcpdump 可缓存的数据包的数量, 从而会导致数据包的丢失. 所以, 在能抓取我们想要的包的前提下, 抓取长度越小越好.把snaplen 设置为0 意味着让tcpdump自动选择合适的长度来抓取数据包
  9. -v: 当分析和打印的时候, 产生详细的输出. 比如, 包的生存时间, 标识, 总长度以及IP包的一些选项. 这也会打开一些附加的包完整性检测, 比如对IP或ICMP包头部的校验和
  10. -vv: 产生比-v更详细的输出. 比如, NFS回应包中的附加域将会被打印, SMB数据包也会被完全解码
  11. -vvv: 产生比-vv更详细的输出. 比如, telent 时所使用的SB, SE 选项将会被打印, 如果telnet同时使用的是图形界面,其相应的图形选项将会以16进制的方式打印出来
  12. -w fileName: 把包数据直接写入文件而不进行分析和打印输出

为什么

抓包在排查问题是一个非常重要的终极利器!

参考示例

抓包命令:

# 抓所有的网口的tcp 端口是8080的包
 tcpdump -i any tcp port 8080 -A -s 0
# 抓所有的网口 端口是514 的包
tcpdump -i any port 514 -nnnvvvv
#  抓包保存到本地文件 syslog.pcap,可放到wireshark分析
tcpdump -i any port 514 -s0 -w./syslog.pcap -nnnvvvv   
# 抓取ping包【ping包即ICMP的包】
tcpdump -i any icmp and  host 192.168.1.1 -nn -vvv
# 抓取ip是 192.168.1.1的包
tcpdump -i any host  192.168.1.1 -nn -vvv
# 抓取ip是 192.168.1.1 或者端口是2500的包
tcpdump -i any host 192.168.1.1 or udp port 2500 -nn -vvv
# 抓所有的网口udp 端口是4500 的包
 tcpdump -i any udp port 4500 -nn -vvv

any 抓所有的网口 包括localhost口
-A 字符
-s 0 不受限制
tcpdump -i any -w data.cap 抓所有包,并通过wireshark分析