Tcpdump配置手册

snow chuai汇总、整理、撰写---2020/11/26


1. Tcpdump使用说明
1. Tcpdump工具的语法说明
1) 使用说明
[root@srv1 ~]# tcpdump 选项 协议 数据流方向 类型
选项: tcpdump的各项参数
协议: tcp, udp, icmp, ip, ip6, arp, rarp,ether,wlan, fddi, tr, decnet等
数据流方向: src, dst。支持逻辑运算符进行组合,比如 src or dst
类型: host, net, port, portrange
2. Tcpdump参数说明
1) 设置不解析域名提升速度
-n: 不把ip转化成域名,直接显示 ip,避免执行 DNS lookups 的过程,速度会快很多
-nn:不把协议和端口号转化成名字,速度也会快很多。
-N: 不打印出host的域名部分.。如设置了此选现,tcpdump 将会打印'srv1' 而不是 'srv1.1000y.cloud'.

2) 控制详细内容的输出 -v:产生详细的输出. 比如包的TTL,id标识,数据包长度,以及IP包的一些选项。同时它还会打开一些附加的包完整性检测,比如对IP或ICMP包头部的校验和。
-vv:产生比-v更详细的输出. 比如NFS回应包中的附加域将会被打印, SMB数据包也会被完全解码。
-vvv:产生比-vv更详细的输出。比如 telent 时所使用的SB, SE 选项将会被打印, 如果telnet同时使用的是图形界面,其相应的图形选项将会以16进制的方式打印出来

3) 控制时间的显示 -t :在每行的输出中不输出时间 -tt:在每行的输出中会输出时间戳 -ttt:输出每两行打印的时间间隔(以毫秒为单位) -tttt:在每行打印的时间戳之前添加日期的打印(此种选项,输出的时间最直观)

4) 显示数据包的头部 -x:以16进制的形式打印每个包的头部数据(但不包括数据链路层的头部) -xx:以16进制的形式打印每个包的头部数据(包括数据链路层的头部) -X:以16进制和 ASCII码形式打印出每个包的数据(但不包括连接层的头部),这在分析一些新协议的数据包很方便。 -XX:以16进制和 ASCII码形式打印出每个包的数据(包括连接层的头部),这在分析一些新协议的数据包很方便。

5) 过滤指定网卡的数据包 -i:指定要过滤的网卡接口,如果要查看所有网卡,可以 -i any

6) 过滤特定流向的数据包 -Q: 选择是入方向还是出方向的数据包,可选项有:in, out, inout,也可以使用 --direction=[direction] 这种写法

7) 其他常用的一些参数 -A:以ASCII码方式显示每一个数据包(不显示链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据
-l : 基于行的输出,便于你保存查看,或者交给其它工具分析
-q : 简洁地打印输出。即打印很少的协议相关信息, 从而输出行都比较简短.
-c : 捕获 count 个包 tcpdump 就退出
-s : tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用 -s number, number 就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。
-S : 使用绝对序列号,而不是相对序列号
-C:file-size,tcpdump 在把原始数据包直接保存到文件中之前, 检查此文件大小是否超过file-size. 如果超过了, 将关闭此文件,另创一个文件继续用于原始数据包的记录. 新创建的文件名与-w 选项指定的文件名一致, 但文件名后多了一个数字.该数字会从1开始随着新创建文件的增多而增加. file-size的单位是百万字节(nt: 这里指1,000,000个字节,并非1,048,576个字节, 后者是以1024字节为1k, 1024k字节为1M计算所得, 即1M=1024 * 1024 = 1,048,576)
-F:使用file 文件作为过滤条件表达式的输入, 此时命令行上的输入将被忽略.

8) 对输出内容进行控制的参数 -D : 显示所有可用网络接口的列表
-e : 每行的打印输出中将包括数据包的数据链路层头部信息
-E : 揭秘IPSEC数据
-L :列出指定网络接口所支持的数据链路层的类型后退出
-Z:后接用户名,在抓包时会受到权限的限制。如果以root用户启动tcpdump,tcpdump将会有超级用户权限。
-d:打印出易读的包匹配码
-dd:以C语言的形式打印出包匹配码.
-ddd:以十进制数的形式打印出包匹配码

9) 过滤规则组合 and:所有的条件都需要满足,也可以表示为 && or:只要有一个条件满足就可以,也可以表示为 || not:取反,也可以使用 !

=:判断二者相等 ==:判断二者相等 !=:判断二者不相等
3. 安装Tcpdump
[root@srv1 ~]# yum install tcpdump -y
2. Tcpdump的使用
1. Tcpdump的举例说明
1) 本地使用
(1) 抓取本地主机eth0网卡的所有网络流量
[root@srv1 ~]# tcpdump -i eth0 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
19:16:26.101491 IP 192.168.1.11.22 > 192.168.1.109.59664: Flags [P.], seq 1527702326:1527702566,
 ack 185584007, win 258, options [nop,nop,TS val 17518210 ecr 4032537264], length 240
......
......
按^c结束抓取
454 packets captured
457 packets received by filter
0 packets dropped by kernel
(2) 抓取本地主机eth0网卡的80端口的网络流量 [root@srv1 ~]# tcpdump -i eth0 -nn port 80 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes ...... ...... 按^c结束抓取 0 packets captured 0 packets received by filter 0 packets dropped by kernel
(3) 抓取本地主机eth0网卡的80端口的网络流量,并列出16进制数据及ASCII数据包的内容 [root@srv1 ~]# tcpdump -i eth0 -nn -X 'port 80' tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes ...... ...... 按^c结束抓取 0 packets captured 0 packets received by filter 0 packets dropped by kernel
2) 抓取远程数据 (1) 抓取远程主机192.168.1.1的数据流量 [root@srv1 ~]# tcpdump host 192.168.1.1 tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 19:20:44.095165 ARP, Request who-has 192.168.1.105 tell gateway, length 46 19:20:45.095228 ARP, Request who-has 192.168.1.7 tell gateway, length 46 19:20:46.095142 ARP, Request who-has 192.168.1.70 tell gateway, length 46 按^c结束抓取 3 packets captured 3 packets received by filter 0 packets dropped by kernel
(2) 抓取远程主机192.168.1.1及192.168.1.5的数据流量 [root@srv1 ~]# tcpdump host 192.168.1.1 and 192.168.1.5 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes ...... ...... 按^c结束抓取 3 packets captured 3 packets received by filter 0 packets dropped by kernel
(3) 抓取除了远程主机192.168.1.5的数据流量 [root@srv1 ~]# tcpdump host ! 192.168.1.5 ...... ...... 按^c结束抓取 2154 packets captured 2154 packets received by filter0 packets dropped by kernel
(4) 获取发送到主机192.168.1.1的www数据包 [root@srv1 ~]# tcpdump dst 192.168.1.1 and port 80
(5) 获取从源主机192.168.1.1及接收的www数据包 [root@srv1 ~]# tcpdump src 192.168.1.1 and dst 80
(6) 获取主机192.168.1.1发送及接收的ntp数据包 [root@srv1 ~]# tcpdump udp port 123 and host 192.168.1.1
(7) 监视www.1000y.cloud发出的数据 [root@srv1 ~]# tcpdump -i eth1 src host www.1000y.cloud
(8) 监视www.1000y.cloud接收的数据 [root@srv1 ~]# tcpdump -i eth1 dst host www.1000y.cloud
(9) 监视ping/pong的数据 [root@srv1 ~]# tcpdump -i any -n -v \ 'icmp[icmptype] = icmp-echoreply or icmp[icmptype] = icmp -echo'
2. Tcpdump的分类列举
1) 对主机的截取
(1) 获取源主机192.168.1.1的所有信息
[root@srv1 ~]# tcpdump src host 192.168.1.1
(2) 获取目的主机为192.168.1.1的所有信息 [root@srv1 ~]# tcpdump dst host 192.168.1.1

2) 对指定网络段的截取 (1) 对指定的网络段进行获取数据 [root@srv1 ~]# tcpdump net 192.168.10.0/24
(2) 对源网络段进行获取数据 [root@srv1 ~]# tcpdump src net 192.168
(3) 对目的网络段进行获取数据 [root@srv1 ~]# tcpdump dst net 192.168

3) 对指定端口的截取 (1) 对8080端口进行获取数据 [root@srv1 ~]# tcpdump port 8080
(2) 根据源端口进行过滤 [root@srv1 ~]# tcpdump src port 8080
(3) 根据目的端口进行过滤 [root@srv1 ~]# tcpdump dst port 8080
(4) 对多个端口进行过滤 [root@srv1 ~]# tcpdump port 80 or port 8080 [root@srv1 ~]# tcpdump port 80 or 8080
(5) 对指定的端口范围进行过滤 [root@srv1 ~]# tcpdump portrange 8000-8080 [root@srv1 ~]# tcpdump src portrange 8000-8080 [root@srv1 ~]# tcpdump dst portrange 8000-8080

4) 对指定ip的相关协议数据进行截取 (1) 对ipv4的tcp协议进行过滤 数字6代表tcp协议,详细协议编号可查看/etc/protocols文件 [root@srv1 ~]# tcpdump ip proto 6 或 # 跟在 proto 和 protochain 后面的如果是 tcp, udp, icmp ,那么过滤器需要用引号包含,这是因为 tcp,udp, icmp 是 tcpdump 的关键字。 [root@srv1 ~]# tcpdump 'ip && tcp'
(2) 对ipv6的tcp协议进行过滤 [root@srv1 ~]# tcpdump ip6 proto 6
3. 保存或从指定文件中读取数据
1) 保存数据到指定文件
# 使用 tcpdump 工具抓到包后,往往需要再借助其他的工具进行分析,比如常见的 wireshark 。
而要使用wireshark ,我们得将 tcpdump 抓到的包数据生成到文件中,最后再使用 wireshark 打开它即可。
[root@srv1 ~]# tcpdump icmp -w icmp.pcap
2) 保存数据到指定文件 [root@srv1 ~]# tcpdump icmp -r icmp.pcap
4. 基于包大小进行过滤
[root@srv1 ~]# tcpdump less 32
[root@srv1 ~]# tcpdump greater 64
[root@srv1 ~]# tcpdump <= 128
5. 根据MAC地址过滤
# ehost 是记录在 /etc/ethers 里的 name
[root@srv1 ~]# tcpdump ether host [ehost]
[root@srv1 ~]# tcpdump ether dst  [ehost]
[root@srv1 ~]# tcpdump ether src  [ehost]
6. 过滤通过指定网关的数据包
[root@srv1 ~]# tcpdump gateway [host]
7. 据数据包的标志位进行过滤
# 格式:
proto [ expr:size ]
proto:可以是熟知的协议之一(如ip,arp,tcp,udp,icmp,ipv6)
expr:可以是数值,也可以是一个表达式,表示与指定的协议头开始处的字节偏移量。
size:是可选的,表示从字节偏移量开始取的字节数量。
1) 捕获多种类型的包[syn+ack]
[root@srv1 ~]# tcpdump -i eth0 'tcp[13] == 2 or tcp[13] == 16'
3. Tcpdump的应用
1) 从HTTP请求头中提取HTTP的User-Agent
[root@srv1 ~]# tcpdump -nn -A -s1500 -l | grep "User-Agent:"
2) 从HTTP请求头中同时提取User-Agent和主机名 [root@srv1 ~]# tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'
3) 抓取 HTTP GET 请求包 [root@srv1 ~]# tcpdump -vvAls0 | grep 'GET'
4) 抓取 HTTP POST 请求包 [root@srv1 ~]# tcpdump -vvAls0 | grep 'POST'
5) 找出发包数最多的 IP [root@srv1 ~]# tcpdump -nnn -t -c 200 | cut -f 1,2,3,4 -d '.' | sort | uniq -c | sort -nr | head -n 20
6) 抓取 DNS 请求和响应 [root@srv1 ~]# tcpdump -i any -s0 port 53
7) 切割 pcap 文件 # 3600 秒创建一个新文件 capture-(hour).pcap,每个文件大小不超过 200*1000000 字节 [root@srv1 ~]# tcpdump -w /tmp/capture-%H.pcap -G 3600 -C 200
8) 提取 HTTP POST 请求中的密码 [root@srv1 ~]# tcpdump -s 0 -A -n -l | egrep -i "POST /|pwd=|passwd=|password=|Host:"
9) 提取 HTTP 请求的 URL [root@srv1 ~]# tcpdump -s 0 -v -n -l | egrep -i "POST /|GET /|Host:"
10) 抓取 HTTP 有效数据包,排除 TCP 连接建立过程的数据包(SYN / FIN / ACK) [root@srv1 ~]# tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

 

如对您有帮助,请随缘打个赏。^-^

gold