使用tcpdump
命令进行抓包
tcpdump命令是什么
- tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
- 可以将tcpdump理解为一个具有抓取数据包功能的命令。
怎么用
tcpdump命令跟其他的Linux命令的使用类似,需要与参数一起使用才能体现其强大的功能。
-
tcpdump
:默认启动,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。 -
tcpdump -i eth1
:-i
可以指定网络接口,any
表示监视所有的网口。 tcpdump host 210.27.48.1
: 抓取指定IP的数据包
tcpdump src host 210.27.48.1
tcpdump dst host 210.27.48.1
tcpdump tcp port 23 and host 210.27.48.1
: 抓取指定端口和指定IP的数据包
tcpdump udp port 123
tcpdump -i any tcp port 9080 -A -s 0
-
tcpdump -i any tcp port 9100 -w data.cap
抓取指定端口数据包到文件
tcpdump命令参数介绍
-
-A
: 以ASCII码方式显示每一个数据包(不会显示数据包中链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据 -
-c count
: tcpdump将在接受到count个数据包后退出 -
-d
: 以容易阅读的形式,在标准输出上打印出编排过的包匹配码, 随后tcpdump停止 -
-dd
: 以C语言的形式打印出包匹配码 -
-ddd
: 以十进制数的形式打印出包匹配码 -
-e
: 每行的打印输出中将包括数据包的数据链路层头部信息 -
-i interface
: 指定tcpdump 需要监听的接口 -
-s snaplen
: 设置tcpdump的数据包抓取长度为snaplen, 如果不设置默认将会是68字节(而支持网络接口分接头的SunOS系列操作系统中默认的也是最小值是96).68字节对于IP, ICMP, TCP 以及 UDP 协议的报文已足够, 但对于名称服务, NFS服务相关的数据包会产生包截短. 如果产生包截短这种情况, tcpdump的相应打印输出行中会出现’‘[|proto]’'的标志(proto 实际会显示为被截短的数据包的相关协议层次). 需要注意的是, 采用长的抓取长度(nt: snaplen比较大), 会增加包的处理时间, 并且会减少tcpdump 可缓存的数据包的数量, 从而会导致数据包的丢失. 所以, 在能抓取我们想要的包的前提下, 抓取长度越小越好.把snaplen 设置为0 意味着让tcpdump自动选择合适的长度来抓取数据包 -
-v
: 当分析和打印的时候, 产生详细的输出. 比如, 包的生存时间, 标识, 总长度以及IP包的一些选项. 这也会打开一些附加的包完整性检测, 比如对IP或ICMP包头部的校验和 -
-vv
: 产生比-v更详细的输出. 比如, NFS回应包中的附加域将会被打印, SMB数据包也会被完全解码 -
-vvv
: 产生比-vv更详细的输出. 比如, telent 时所使用的SB, SE 选项将会被打印, 如果telnet同时使用的是图形界面,其相应的图形选项将会以16进制的方式打印出来 -
-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分析