tcpdump抓包通过Wireshark分析抓包⽂件
1. tcpdump的基本原理
1.1  tcpdump starce 的区别
在本机中的进程的系统⾏为调⽤跟踪,starce  是⼀个很好的⼯具;但是在⽹络问题的调试中,tcpdump 应该是⼀个必不可少的⼯具;能清晰分析⽹络通信的信息。
默认情况下,tcpdump 不会抓取本机内部通讯的报⽂;根据⽹络协议栈的规定,对于报⽂,即使是⽬的地是本机(⾃⼰和⾃⼰通信),也需要经过本机的⽹络协议层,所以本机通
讯肯定是通过API进⼊内核,并且完成路由选择。【⽐如本机的TCP通信,也必须要socket通信的基本要素:src ip port    dst port】
1.2 linux下tcpdump 抓包的基本原理
Linux 的抓包是通过注册⼀种虚拟的底层⽹络协议来完成⽹络报⽂(准确的说是:⽹络设备)消息的处理权,当⽹卡接收到⼀个⽹络报⽂后,它会遍历系统中所有已经注册的⽹络协
议,例如:以太⽹协议、x25协议处理模块来尝试进⾏报⽂的解析处理。这⼀点和⽂件系统的挂载相似,就是让系统中所有已经注册的⽂件系统来进⾏尝试挂载,如果哪⼀个认
为⾃⼰可以处理,那么就完成挂载。
当抓包模块把⾃⼰伪装成⼀个⽹络协议的时候,系统在收到报⽂的时候就会这个伪协议⼀次机会,让它来对⽹卡收到的报⽂进⾏⼀次处理,此时该抓包模块就会趁机把报⽂完整
的copy⼀份,然后把这个copy的数据给抓包模块(tcpdump)
tcpdump 具体的⼯作原理:协议的注册、⽹络层对接收报⽂的处理:
2.  tcpdump 命令详解
2.1 tcpdump 命令的基本简介
tcpdump :dump the traffic on a network 根据使⽤者的定义对⽹络上的数据包进⾏截获的分析⼯作;tcpdump 可以讲⽹络中传送的数据包的header完全截获下来进⾏分
析;它⽀持对⽹络层(net  IP 段)、协议(TCP/UDP)、主机(src/dst host)、⽹络或端⼝(prot)的过滤,并提供and、or、not 等逻辑语句来帮助你去掉⽆⽤的信息。
tcpdump:默认情况下,sudo /usr/sbin/tcpdump 会监视第⼀个⽹络接⼝⼀般是eth0 的所有port 所有协议的数据包
2.2 tcpdump 的主要选项
协议TCP,UDP,IP,ARP,RARP,ETHER,FDDI
⽹络(net)192.168.0.0/16 IP⽹段
⽅向(host)src,dst,src or dst,src and dst
端⼝(prot)80 22 !22  9999
逻辑and,or,not  &&,||,!
协议:tcp udp ip arp rarp ether fddi  协议这选项要放在前⾯,因为要过滤数据包
⽹络:net  ip⽹段    tcpdump net 192.168.1.0/24  监听这个⽹段
⽅向:host  就是主机  src 是源主机、dst 是⽬的主机 or  and 是逻辑 tcpdump host test.hostname
端⼝:port  指定tcpdump 监听的端⼝  tcpdump src 192.168.1.11 and port 80  监听源IP是192.168.1.11 的80端⼝
逻辑:是表⽰与或即:同时满⾜或满⾜之⼀
前⾯的四个选项:协议、net 、host、port 如果同时在 tcpdump ⾥⾯时必须⽤逻辑 and 连接起来;⽽且如⽤() ⼀定要转义,否则会包语法错误。
[html]
1. sudo /usr/sbin/tcpdump tcp and srchosttest1.hostnameortest
2.hostname and port 3333 and net 172.21.121.0/24  -c 10 -vvv
3. tcpdump 的选项
3.1 主要选项
-i :指定⽹卡默认是 eth0
-n :线上ip,⽽不是hostname
-c :指定抓到多个包后推出
-A:以ASCII⽅式线上包的内容,这个选项对⽂本格式的协议包很有⽤
-x:以16进制显⽰包的内容
-vvv:显⽰详细信息
-s :按包长截取数据;默认是60个字节;如果包⼤于60个字节,则抓包会出现丢数据;所以我们⼀般会设置 -s 0 ;这样会按照包的⼤⼩截取数据;抓到的是完整的包数据
-r:从⽂件中读取【与 -w 对应,/usr/sbin/tcpdump -r test.out  读取 tcpdump -w  test.out】
-w:到处指向⽂件【⼀定要⽤,-w t.out ,然后⽤ -r t.out 来看抓包信息,否则可读性很差】
3.2 tcpdump 抓包的具体含义
tcpmdump 抓包出来分析包的具体含义
1. 包携带的标志:
S:S=SYC  :发起连接标志
P:P=PUSH:传送数据标志
F:F=FIN:关闭连接标志
ack:表⽰确认包
RST=RESET:异常关闭连接
. 表⽰没有任何标志
1. 抓取包的具体含义:
[html]
1. server.hostname: sudo /usr/sbin/tcpdump tcp port 80 and host clinet.hostname -c 30 -vvv -w t.out
2. sudo /usr/sbin/tcpdump -r t.out
[html]
1. 13:59:29.012370 IP client.hostname.tbsite.50741 > server.hostname.http: S 562843056:562843
056(0) win 14480 <mss 1460,sackOK,timestamp 230871413 4035264472,nop,wscale 7socket通信报文格式
2. 13:59:29.012374 IP server.hostname.http > client.hostname.tbsite.50741: S 2306923370:2306923370(0) ack 562843057 win 5792 <mss 1460,sackOK,timestamp 4035271299 230871413,nop
3. 13:59:29.012547 IP client.hostname.tbsite.50741 > server.hostname.http: . ack 1 win 114 <nop,nop,timestamp 230871413 4035271299>
4. 13:59:29.012582 IP client.hostname.tbsite.50741 > server.hostname.http: P 1:1006(1005) ack 1 win 114 <nop,nop,timestamp 230871413 4035271299>
5. 13:59:29.012593 IP server.hostname.http > client.hostname.tbsite.50741: . ack 1006 win 16 <nop,nop,timestamp 4035271299 230871413>
6. 13:59:29.025011 IP client.hostname.tbsite.50777 > server.hostname.http: S 2359624339:2359624339(0) win 14480 <mss 1460,sackOK,timestamp 230871425 4035264472,nop,wscale 7
7. 13:59:29.025022 IP server.hostname.http > client.hostname.tbsite.50777: S 2305562654:23055
62654(0) ack 2359624340 win 5792 <mss 1460,sackOK,timestamp 4035271312 230871425,no
8. 13:59:29.025197 IP client.hostname.tbsite.50777 > server.hostname.http: . ack 1 win 114 <nop,nop,timestamp 230871425 4035271312>
9. 13:59:29.025228 IP client.hostname.tbsite.50777 > server.hostname.http: P 1:837(836) ack 1 win 114 <nop,nop,timestamp 230871425 4035271312>
10. 13:59:29.025240 IP server.hostname.http > client.hostname.tbsite.50777: . ack 837 win 15 <nop,nop,timestamp 4035271312 230871425>
第⼀⾏: S:表⽰ clinet.hostname 的临时端⼝50741向 server.hostname 80 端⼝发起连接,client 的初始包序号是: 562843056  ;滑动窗⼝(win 14480)的⼤⼩是:14480 [14k]  滑动窗⼝即tcp 接收缓冲区的⼤⼩,⽤于tcp 拥塞控制;mss 1460:可以接收的最⼤包长度,通常是MTU - 40 byte;IP头和TCP头各20byte
第⼆⾏: S:表⽰SYN状态;是server.hostname 对第⼀⾏ clinet.hostname 发起连接的请求的回应;同时带上client 端初始包序号 + 1:ack 562843057 ,即server.hostname 下次等待接收这个包序号的包,⽤于tcp 字节流的顺序控制(?). server.hostname 初始包序列号:2306923370
第三⾏:client.hostname 再次确认,tcp连接完成三次握⼿
第四⾏:P:推送数据    client.hostname  通过 50741 端⼝向 server.hostname 发送数据包;数据包⼤⼩是 1005byte ;第五⾏是 server.hostname 响应这个数据包发送,接收这个数据包。----> 当完成后会出现⼀个 server.hostname    F  关闭连接的数据包,这⾥没有抓取
第6⾏  ---->10⾏是对 1-5⾏的重复;因为机器是web服务是并发的。
4. tcpdump的实例:
起步1:抓取指定端⼝的包
tcpdump -i eth0 -c 100
起步2:抓取指定协议的包
tcpdump -i eth0 -c 100 tcp
起步3:抓取指定协议,指定port的包【tcp ip port src dst host net】
tcpdump -i eth0 -c 100 tcp port 5440
起步4:组合过滤条件【and or not】
tcpdump -i eth0 -c 100 tcp port 5440  and src host 192.1.1.2
起步5:抓取指定⽹段的包
tcpdump -i eth0 -c 100 tcp port 5440 and src net 192.1.1.0/24
⾼级1:写⼊⽂件并⽤wireshark在windows下分析
tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
然后⽤ftp传输到windows下⾯,在⽤wireshark打开cap⽂件即可
⾼级2:提取http包
tcpdump  -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854 -c 20 -w ./target.cap
其中-s 0表⽰不限制包的⼤⼩;tcp[20:2]从表⽰tcp包头第20个字节开始的2个字节等于0x4745(对应字符GE)或者等于0x4854(对应HT);
这种⽅法适⽤于tcp头中OPTION为空的情况,如果不为空,需要从第24个字节开始。
注意:在linux抓取包后⽤tcpdump -r 只能看到包的简单信息;如果需要查询抓取包的详细信息需要把抓取的包target.cap 通过 ftp服务器传输到windows机器上;借助wireshark ⼯具来分析数据;wireshark是⼀款开源的分析⽹络抓包的⼯具;灰常的好⽤。
5. tcpdump 抓包看rt
[html]
1. sudo tcpdump -s 0 -w /tmp/a.cap host 10.246.38.44
2.
3. tcpdump -A -r /tmp/a.cap
[html]
1. <<<<<<<<<<<<;上⾯ client、server的三次握⼿省略;下⾯是三次握⼿成功后直接push 数据>>>>>>>>>>>>>>
2. 17:46:30.138829 IP client.hostname.55445 >server.dns: P 1:741(740)
3. ack 1 win 46 <nop,nop,timestamp 221364282 177661952>
4. E.....@.@...
5. ..%
6. .&,...P......uH....mG.....
7. 1.:
8. ...POST /ecpmdsp_bid HTTP/1.1    <<<<<<POST 说明;client 发送query 数据;在上⾯的的⾏中到时间点:【17:46:30.138829】
9. User-Agent: Mozilla/5.0 (compatible; Tanx/1.0; Linux)
10. Host: server.dns                        <<<<<<<<<<HTTP服务、web (apache、nginx)>>>>>>>>>>
11. Accept: */*
12. Content-Type:application/octet-stream
13. Connection:Keep-Alive
14. Content-Length: 524
15.
16. ...
17. 0af62e25315451c420f6000000000001..BpNFCj5dkAgCAQYTS24VMRxz".10.246.157.167*..Mozilla/4.0
18. (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR
19. 2.0.50727; .NET CLR 3.5.30729; .NET CLR
20. 3.donalds:Iuku/Youku2013/201304/0424/22371/600-90-
under.html@...ad_pid_pid_pid..600x90(.8.@.H.X.`.h...................................................................................................................................................................
21. 17:46:30.138927 IP server.dns.http >
22. client.hostname.55445: . ack 741 win 125 <nop,nop,timestamp
23. 177661952 221364282>
24. E..4.H@.?.4?
25. .&,
26. ..%.P....uH.......}.^.....
27.
28. 1.:
29. 17:46:30.219197 IP client.hostname.55445 >
30. server.dns.http: F 741:741(0) ack 1 win 46
31. <nop,nop,timestamp 221364362 177661952>
32. E..4..@.@...
33. ..%
34. .&,...P......uH.....\.....
35. 1..
36. ...
37. 17:46:30.223900 IP server.dns.http >  client.hostname.55445: P 1:154(153) ack 742 win 125    <nop,nop,timestamp 177662037 221364362>
38. E....I@.?.3.
39. .&,
40. ..%.P....uH.......}Y......
41.
42. 1..HTTP/1.1 200 OK              <<<<<<<<<<<<server.dns 的respose 包  200 OK;所以返回数据了;这时到下⾯⾏的时间点【17:46:30.223910】
43. Server: Tengine
44. Date: Fri, 21 Jun 2013 09:46:30 GMT
45. Content-Length: 36
46. Connection: keep-alive
47.
48. ... 0af62e25315451c420f6000000000001
49. 17:46:30.223910 IP client.hostname.55445 > server.dns.http: R 2868451528:2868451528(0) win 0
50. E..(..@.@...
51. ..%
52. .&,...P........P.......
53. 17:46:30.223947 IP server.dns.http >client.hostname.55445: F 154:154(0) ack 742 win 125<nop,nop,timestamp 177662037 221364362>  <<<<<<<<<<<<;此次通信结
束;F = final >>>>>>>>>>
54. E..4.J@.?.4=
55.
56. 所以,我们可以计算出从发出query;到收到respose的时间是:【17:46:30.223910】  -  【17:46:30.138829】 = 0.085081us  == 85.08ms

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。