Tcpdump抓包参数
抓包选项
-A: 打印数据包的具体内容(非常常用,非常重要),如:抓取80端口查看http请求内容
显示结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 21:39:52.507728 IP 172.31.0.20.http > 100.67.93.33.fj-hdnet: Flags [P.], seq 1:389, ack 41, win 29, length 388 E...E*@.@.......dC]!.P...D.... .P...o6..HTTP/1.1 200 OK Server: Tengine Date: Wed, 11 Sep 2018 13:39:52 GMT Content-Type: text/html; charset=utf-8 Content-Length: 335 Last-Modified: Wed, 12 Sep 2018 12:24:38 GMT Connection: close ETag: "5b990586-14f" Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET,POST Access-Control-Allow-Credentials: true Access-Control-Max-Age: 1728000 Accept-Ranges: bytes 21:39:52.507783 IP 172.31.0.20.http > 100.67.93.33.fj-hdnet: Flags [F.], seq 389, ack 41, win 29, length 0
|
其中可以看到完整的Http请求信息,对于排查问题非常有帮助,博主曾用这个方法解决了非常多实际问题
-c:指定抓取满足条件数据包数量
-i interface:指定抓取包的网卡,若未指定该选项,将从系统网卡列表中查找编号最小且配置好的网卡(不包括loopback)作为抓包网卡(只会找一个),用any表示所有网卡
-n:不解析主机名,显示ip
-nn:除了-n的作用外,还把端口显示为数值,否则显示端口服务名。如:
1 2
| 使用 -nn 参数 100.64.23.22.57271 > 172.31.0.20.80 不使用 -nn 参数 100.64.23.22.57271 > 172.31.0.20.http
|
-N:不打印出host的域名部分。例如tcpdump将会打印’nic’而不是’nic.ddn.mil’
-P:指定要抓取的包是流入还是流出的包。in:流入的包,out:流出的包,inout:所有包,默认为inout
-s len:设置数据包的抓取长度,默认65535字节,对于要抓取的数据包较大时,长度设置不够可能会产生包截断
输出数据选项
-e:输出的每行中都将包括数据链路层头部信息,如:源MAC和目标MAC
-q:快速打印输出,打印很少的协议相关信息
-X:输出包的头部数据,以16进制和ASCII两种方式同时输出,可以看到数据包传输的内容
-XX:输出包的头部数据,会以16进制和ASCII两种方式同时输出,比-X更加详细
-v:当分析和打印的时候,产生详细的输出,主要是tcp协议相关的一些东西
-vv:产生比-v更详细的输出
-vvv:产生比-vv更详细的输出
其他功能性选项
-D:列出可用于抓包的接口。列出网卡的编号和名称,第一个网卡为默认抓取网卡
-F:从文件中读取数据包
-w:将抓包数据输出到文件中
-r:从指定的数据包文件中读取数据
数据包过滤
主机过滤
1、抓取所有经过eth0,目的或源地址是 192.168.0.1的数据包
tcpdump -i eth0 host 192.168.1.101
2、抓取所有经过eth0,源地址是192.168.0.1的数据包
tcpdump -i eth0 src host 192.168.1.101
3、抓取所有经过eth0,目的地址是192.168.0.1的数据包
tcpdump -i eth0 dst host 192.168.1.101
4、抓取所有经过eth0,目的或源地址不是192.168.0.1的数据包(可以用!表示取反)
tcpdump -i eth0 host !192.168.1.101
端口过滤(常用)
1、抓取所有经过eth0,源端口或目的端口为80的包
2、抓取所有经过eth0,源端口是为80的包
1
| tcpdump -i eth0 src port 80
|
3、抓取所有经过eth0,目的端口为80的包
1
| tcpdump -i eth0 dst port 80
|
#协议过滤
1、抓取所有经过eth0,tcp协议数据包
2、抓取所有经过eth0,udp协议数据包
3、其他协议
1 2 3
| tcpdump -i eth0 arp tcpdump -i eth0 ip tcpdump -i eth0 icmp
|
多个过滤条件之间可以用and或者or连接
1、抓取所有经过eth0,tcp协议并且端口为80的数据包
抓包实战
抓取mysql 3306端口数据包,看看mysql传输了那些数据包
抓包部分数据如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| .,P....b..'....SELECT @@session.transaction_read_only 21:49:34.891958 IP 120.78.162.155.mysql > 172.31.0.20.12558: Flags [P.], seq 6582:6634, ack 3636, win 65010, length 52 E..\.D@./.y;xN........1.M.<=v.M.P.......0..........(Rows matched: 1 Changed: 0 Warnings: 0 21:49:34.892100 IP 172.31.0.20.12558 > 120.78.162.155.mysql: Flags [P.], seq 3636:3647, ack 6634, win 65535, length 11 E..3..@.@.. ....xN..1...v.M.M.<qP....B.......commit 21:49:34.914180 IP 120.78.162.155.mysql > 172.31.0.20.12228: Flags [P.], seq 7096:7175, ack 3892, win 65535, length 79 .,....P...r........5....def....@@session.transaction_read_only..?................0........... 21:49:34.914343 IP 172.31.0.20.12228 > 120.78.162.155.mysql: Flags [P.], seq 3892:4288, ack 7175, win 65535, length 396 .{P............update cc_server SET server_id = '2df43a93-689c-8ca0-4cf0-a1f82ff99a92', device_id = '90878db0-b62a-9dab-8949-47ea698513f8', server_brand = 'GDC ', server_type = '', server_no = 'A63203' `status` = 1, where id = 1 21:49:34.931906 IP 120.78.162.155.mysql > 172.31.0.20.12226: Flags [P.], seq 2957:3158, ack 2210, win 65010, length 201 E...Z0@./.).xN......../....r.A..P....`.......J....def.china_cinema QRTZ_LOCKS qrtz_locks SCHED_NAME SCHED_NAME.-.......P...H....def.china_cinema QRTZ_LOCKS qrtz_locks LOCK_NAME LOCK_NAME.-.......P........MyScheduler.TRIGGER_ACCESS........... 21:49:34.932229 IP 172.31.0.20.12226 > 120.78.162.155.mysql: Flags [P.], seq 2210:2378, ack 3158, win 65535, length 168 E...J.@.@.(.....xN../....A.....;P............UPDATE QRTZ_TRIGGERS SET TRIGGER_STATE = 'WAITING' WHERE SCHED_NAME = 'MyScheduler' AND JOB_NAME = 'JOB_18' AND JOB_GROUP = 'DEFAULT' AND TRIGGER_STATE = 'BLOCKED' 21:49:34.933501 IP 120.78.162.155.mysql > 172.31.0.20.12558: Flags [P.], seq 6634:6645, ack 3647, win 65010, length 11 E..3.E@./.ycxN........1.M.<qv.M.P...WJ............. 21:49:34.933635 IP 172.31.0.20.12558 > 120.78.162.155.mysql: Flags [P.], seq 3647:3668, ack 6645, win 65535, length 21 E..=..@.@.......xN..1...v.M.M.<|P....L.......SET autocommit=1
|
从中可以看到客户端发送到mysql的sql及mysql返回的数据,读者可以自己试一试,可以看到很多数据(注意网卡不要弄错了,否则抓取不到数据)
抓取redis端口6000数据包并分析redis协议
抓包部分数据如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| 22:02:21.236360 IP 172.31.0.20.37090 > 172.31.0.15.x11: Flags [P.], seq 396:429, ack 61, win 14600, length 33 E..I..@.@..............pX..n..LJP.9.X...*2 $4 RPOP $12 xinhua_push2
22:02:21.236639 IP 172.31.0.15.x11 > 172.31.0.20.37090: Flags [P.], seq 61:66, ack 429, win 14600, length 5 E..-s)@.@.o@.........p....LJX...P.9.....$-1
22:02:21.236650 IP 172.31.0.20.37090 > 172.31.0.15.x11: Flags [.], ack 66, win 14600, length 0 E..(..@.@..............pX.....LOP.9. ... 22:02:21.236758 IP 172.31.0.20.23648 > 172.31.0.9.x11: Flags [P.], seq 396:429, ack 61, win 14600, length 33 E..IoW@.@.r........ \`.p...r7...P.9.X...*2 $4 RPOP $12 xinhua_push3
22:02:21.236927 IP 172.31.0.9.x11 > 172.31.0.20.23648: Flags [P.], seq 61:66, ack 429, win 14600, length 5 E..-.;@.@..3... .....p\`7.......P.9.....$-1
22:02:21.236936 IP 172.31.0.20.23648 > 172.31.0.9.x11: Flags [.], ack 66, win 14600, length 0 E..(oX@.@.s........ \`.p....7...P.9.a... 22:02:21.237765 IP 172.31.0.20.37090 > 172.31.0.15.x11: Flags [P.], seq 429:462, ack 66, win 14600, length 33 E..I..@.@..............pX.....LOP.9.X...*2 $4 RPOP $12 xinhua_push6
22:02:21.237981 IP 172.31.0.15.x11 > 172.31.0.20.37090: Flags [P.], seq 66:71, ack 462, win 14600, length 5 E..-s*@.@.o?.........p....LOX...P.9..l..$-1
22:02:21.238084 IP 172.31.0.20.23648 > 172.31.0.9.x11: Flags [P.], seq 429:462, ack 66, win 14600, length 33 E..IoY@.@.r........ \`.p....7...P.9.X...*2 $4 RPOP $12 xinhua_push7
22:02:21.238222 IP 172.31.0.9.x11 > 172.31.0.20.23648: Flags [P.], seq 66:71, ack 462, win 14600, length 5 E..-.<@.@..2... .....p\`7.......P.9.....$-1
|
从中可以看到 redis的请求数据(返回数据也可以看,只是本次抓包没有返回数据),从中也可以看出redis的传输协议:
对其中一个请求分析(客户端执行的命令是:RPOP xinhua_push7):
1 2 3 4 5
| *2 $4 RPOP $12 xinhua_push7
|
*2 表示这个命令有3个参数
$4 表示第一个参数的长度是4
RPOP 表示定义长度为$4的参数
$12 表示第二个参数的长度是12
xinhua_push7 表示定义长度为$12的参数
redis协议resp其实非常简单,这里只做简单说明,读者有兴趣可以自行深入了解,也可以尝试写一个redis客户端。简单的协议也是redis高效的原因之一
简单的总结下
同理,可以用相同的方法分析http、kafka、zk等服务数据包的格式及了解其传输协议。学会抓包对学习TCP协议、tcp协议,排查网络异常问题有非常大的帮助
从数据包中可以看到tcp三次握手、四次挥手的全过程,有兴趣的读者可以去尝试一下