tcpdump命令总结

转自:http://www.cnblogs.com/kxdblog/p/4201311.html

安装:yum install tcpdump

截获某IP的主机的网络数据包:

tcpdump host 192.168.0.120

TCP协议要建立连接要经过3次“握手”,截取的数据包也是从3次握手开始,可以看到前三个包的状态(Flags)分别是:

 [S]、[S.]、[.]

 首先是客户端向服务端发送一个10位的序号给服务端;服务端收到后把它+1再返回回去;客户端检查返回来的序号是对的,就返回给服务端一个1。根据上面的描述,知道这三个包满足:第一个包的seq+1=第二个包的ack;第三个包的ack=1

注意:开始发送时,发送方是按三次握手完成时定下的序列号和ack来进行通信的,客户端一直在发,客户端的seq不断的按发送字节数在累加,而服务器是应答端,seq始终不变。同理若客户端作为应答端的话,它的seq也是不变的

TCP协议要断开连接要经过4次“挥手”,上面数据包的最后3条就是挥手的过程。细心的朋友会发现前面说的4次挥手,却只有3个包,这不是笔误。

最后三个包的状态分别是:

[F.]、[F.]、[.]    

ACK延迟发送机制,如果系统禁用了延迟发送,就会看到4个包了

 

cron可以定时执行抓包的时间

抓包命令:

tcpdump -c 100000 -w /home/kang/Desktop/test.txt -n

注释:抓10万个包,存在test.txt文件里,-n的意思是不对原地址和目的地址进行DNS查询

 

读文件命令:

tcpdump -r /home/kang/Desktop/test.txt -X -vv

注释:-r是读文件,-X是以ASCII码显示内容。-VV是以详细的报文信息显示

-x是以十六进制打印,-X是以十六进制和ASCII同时打印,都不包含数据链路头部,-xx -XX 包含数据链路层的头部,其余的一样。

总共打印的数据大小不会超过整个数据包的大小与snaplen中的最小值,如果高层协议数据没有snaplen那么长,则Ethernet层的填充数据也会被打

 详细参数参考这里 

 

查看txt编码::set fileencodin  

转编码:iconv -f GBK -t UTF-8 file1 -o file2
iconv -f gbk -t utf8 file1 .txt > file2.txt

打印结果:部分是解析的结果,部分是十六进制,显示的比较乱,转换格式也没有用

原因:tcpdump对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的,所以通常的解决办法是显示用带-w的tcpdump保存到i文件中,再使用wireshark进行解码分析,并且定义过滤规则,以避免捕获的数据包铺满整个硬盘。

 

tcpdump为了方便wireshark工具认识,保存的文件名最好是xx.pcap后缀。例如:

tcpdump -nn -s 0 host 192.168.0.120 and port -80 -w wireshark.pcap

-s 设置捕获数据包的长度,抓取数据包时原来默认长度是68字节,加上-S 0后可以抓到完整的数据包

 

使用tcpdump只抓取http包:

tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854

0x4745为“GET”前两个字母“GE”,0x4854为“HTTP”前两个字母“HT”

101.227.172.51.80
115.25.210.10.80
61.135.132.59.80
222.23.55.208.80
61.135.132.59
220.181.11.98
ip/dns解析:http://dns.aizhan.com/,查询到DNS解析的URL和地址

 

tcpdump抓取具体某个网页的数据包:

tcpdump -s 0 tcp port 80 -w sohu1.cap

在打开firefox之后,输入www.sohu.com。先别运行,先运行以上命令,再刷新页面(之前做过测试,firefox没有输入任何命令时,抓取的数据包为0)

再用wireshark——open打开,并用statistic来统计,参考一站式学习wireshark:http的统计

 

  如果单独是tcpdump,默认情况下,tcpdump会选择第一块网卡,也就是eth0,进行抓包 

  tcpdump是基于Unix系统的命令行式的数据包嗅探工具。如果要使用tcpdump抓取其他主机MAC地址的数据包,必须开启网卡混杂模式,所谓混杂模式,用最简单的语言就是让网卡抓取任何经过它的数据包,一般而言,Unix不会让普通用户设置混杂模式,因为这样可以看到别人的信息,比如telnet的用户名和密码,开启混杂模式的命令是:ifconfig eth0 promisc, eth0是你要打开混杂模式的网卡

 

过滤器(BPF语言)的使用

tcpdump tcp -i eth0  -t -s 0  and  port 8080 -w ./bb.cap  

tcpdump host 192.168.0.148 and tcp port 22

tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \) 截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信

tcpdump ip host 210.27.48.1 and ! 210.27.48.2 获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包

tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

详情可参考tcpdump详细参数



转自:http://www.server110.com/linux/201403/7915.html

参数:

-nn:直接以 IP 及 port number 显示,而非主机名与服务名称

-i :后面接要『监听』的网络接口,例如 eth0, lo, ppp0 等等的界面;

-w :如果你要将监听所得的封包数据储存下来,用这个参数就对了!后面接档名

-c :监听的封包数,如果没有这个参数, tcpdump 会持续不断的监听,

     直到使用者输入[ctrl]-c 为止。

-A :封包的内容以 ASCII 显示,通常用来捉取WWW 的网页封包资料。

-e :使用资料连接层 (OSI 第二层) 的 MAC 封包数据来显示;

-q :仅列出较为简短的封包信息,每一行的内容比较精简

-X :可以列出十六进制 (hex) 以及 ASCII 的封包内容,对于监听封包内容很有用

-r :从后面接的档案将封包数据读出来。那个『档案』是已经存在的档案,

     并且这个『档案』是由-w 所制作出来的。

所欲撷取的数据内容:我们可以专门针对某些通讯协议或者是 IP 来源进行封包撷取,

     那就可以简化输出的结果,并取得最有用的信息。常见的表示方法有:

     'host foo', 'host 127.0.0.1' :针对单部主机来进行封包撷取

     'net 192.168' :针对某个网域来进行封包的撷取;

     'src host 127.0.0.1' 'dst net 192.168':同时加上来源(src)或目标(dst)限制

     'tcp port 21':还可以针对通讯协议侦测,如 tcp, udp, arp, ether 等

     还可以利用 and 与 or 来进行封包数据的整合显示呢!

范例一:以 IP 与 portnumber 捉下 eth0 这个网络卡上的封包,持续3 秒

[root@linux ~]#tcpdump -i eth0 -nn

tcpdump: verboseoutput suppressed, use -v or -vv for full protocol decode

listening on eth0,link-type EN10MB (Ethernet), capture size 96 bytes

01:33:40.41 IP192.168.1.100.22 > 192.168.1.11.1190: P 116:232(116) ack 1 win 9648

01:33:40.41 IP192.168.1.100.22 > 192.168.1.11.1190: P 232:364(132) ack 1 win 9648

<==按下 [ctrl]-c 之后结束

6680 packetscaptured              <==捉下来的封包数量

14250 packetsreceived by filter   <==由过滤所得的总封包数量

7512 packetsdropped by kernel     <==被核心所丢弃的封包

如果你是第一次看 tcpdump 的 man page 时,肯定一个头两个大,因为 tcpdump 几乎都是分析封包的表头数据,用户如果没有简易的网络封包基础,要看懂粉难吶! 所以,至少您得要回到网络基础里面去将 TCP 封包的表头数据理解理解才好啊! ^_^!至于那个范例一所产生的输出范例中,我们可以约略区分为数个字段, 我们以范例一当中那个特殊字体行来说明一下:

01:33:40.41:这个是此封包被撷取的时间,『时:分:秒』的单位;

IP:透过的通讯协议是 IP ;

192.168.1.100.22> :传送端是 192.168.1.100 这个 IP,而传送的 port number 为 22,您必须要了解的是,那个大于 (>) 的符号指的是封包的传输方向喔!

192.168.1.11.1190:接收端的 IP 是 192.168.1.11, 且该主机开启 port 1190 来接收;

P 116:232(116):这个封包带有 PUSH 的数据传输标志, 且传输的数据为整体数据的 116~232 byte,所以这个封包带有116 bytes 的数据量;

ack 1 win 9648:ACK与 Window size 的相关资料。

最简单的说法,就是该封包是由 192.168.1.100 传到 192.168.1.11,透过的 port 是由 22 到 1190 , 且带有 116 bytes 的数据量,使用的是PUSH 的旗标,而不是 SYN 之类的主动联机标志。 呵呵!不容易看的懂吧!所以说,上头才讲请务必到 TCP 表头数据的部分去瞧一瞧的啊!

再来,一个网络状态很忙的主机上面,你想要取得某部主机对你联机的封包数据而已时, 使用 tcpdump 配合管线命令与正规表示法也可以,不过,毕竟不好捉取! 我们可以透过 tcpdump 的表示法功能,就能够轻易的将所需要的数据独立的取出来。 在上面的范例一当中,我们仅针对 eth0 做监听,所以整个eth0 接口上面的数据都会被显示到屏幕上, 不好分析啊!那么我们可以简化吗?例如只取出 port 21 的联机封包,可以这样做:

[root@linux ~]#tcpdump -i eth0 -nn port 21

tcpdump: verboseoutput suppressed, use -v or -vv for full protocol decode

listening on eth0,link-type EN10MB (Ethernet), capture size 96 bytes

01:54:37.96 IP192.168.1.11.1240 > 192.168.1.100.21: . ack 1 win 65535

01:54:37.96 IP192.168.1.100.21 > 192.168.1.11.1240: P 1:21(20) ack 1 win 5840

01:54:38.12 IP192.168.1.11.1240 > 192.168.1.100.21: . ack 21 win 65515

01:54:42.79 IP192.168.1.11.1240 > 192.168.1.100.21: P 1:17(16) ack 21 win 65515

01:54:42.79 IP192.168.1.100.21 > 192.168.1.11.1240: . ack 17 win 5840

01:54:42.79 IP192.168.1.100.21 > 192.168.1.11.1240: P 21:55(34) ack 17 win 5840

这样就仅提出 port 21 的信息而已,且仔细看的话,你会发现封包的传递都是双向的, client 端发出『要求』而server 端则予以『响应』,所以,当然是有去有回啊! 而我们也就可以经过这个封包的流向来了解到封包运作的过程。 举例来说:

我们先在一个终端机窗口输入『 tcpdump -i lo -nn 』的监听,

再另开一个终端机窗口来对本机 (127.0.0.1) 登入『sshlocalhost』

那么输出的结果会是如何?

[root@linux ~]#tcpdump -i lo -nn

 1 tcpdump: verbose output suppressed, use -vor -vv for full protocol decode

 2 listening on lo, link-type EN10MB (Ethernet),capture size 96 bytes

 3 11:02:54.253777 IP 127.0.0.1.32936 >127.0.0.1.22: S 933696132:933696132(0)

   win 32767 <mss 16396,sackOK,timestamp236681316 0,nop,wscale 2>

 4 11:02:54.253831 IP 127.0.0.1.22 >127.0.0.1.32936: S 920046702:920046702(0)

   ack 933696133 win 32767 <mss16396,sackOK,timestamp 236681316 236681316,nop,

   wscale 2>

 5 11:02:54.253871 IP 127.0.0.1.32936 >127.0.0.1.22: . ack 1 win 8192 <nop,

   nop,timestamp 236681316 236681316>

 6 11:02:54.272124 IP 127.0.0.1.22 >127.0.0.1.32936: P 1:23(22) ack 1 win 8192

   <nop,nop,timestamp 236681334236681316>

 7 11:02:54.272375 IP 127.0.0.1.32936 >127.0.0.1.22: . ack 23 win 8192 <nop,

   nop,timestamp 236681334 236681334>

上表显示的头两行是 tcpdump 的基本说明,然后:

第 3 行显示的是『来自client 端,带有 SYN 主动联机的封包』,

第 4 行显示的是『来自server 端,除了响应 client 端之外(ACK),还带有 SYN 主动联机的标志;

第 5 行则显示 client端响应 server 确定联机建立(ACK)

第 6 行以后则开始进入数据传输的步骤。

如果我们使用 tcpdump 在 router 上监听『明码』的传输数据, 例如 FTP 传输协议,我们先在主机端下达『 tcpdump -i lo port 21 -nn -X 』然后再以 ftp 登入本机,并输入账号与密码, 结果你就可以发现如下的状况:

[root@linux ~]#tcpdump -i lo -nn -X 'port 21'

    0x0030: 0e2e 0b61 3232 3020 2876 7346 5450 6420 ...a220.(vsFTPd.

   0x0030: 0e2e 0b67 5553 4552 2064 6d74 7361 690d ...gUSER.dmtsai.

   0x0030: 0e2e 1b38 5041 5353 206d 7970 6173 7377 ...8PASS.mypassw

上面的输出结果FTP 软件使用的是vsftpd ,并且使用者输入 dmtsai 这个账号名称,且密码是mypasswordisyou

为了让网络接口可以让 tcpdump 监听,所以执行tcpdump 时网络接口会启动在 『错乱模式 (promiscuous)』,所以你会在 /var/log/messages 里面看到很多的警告讯息, 通知你说你的网络卡被设定成为错乱模式!别担心,那是正常的。 至于更多的应用,请参考 man tcpdump

例题:如何使用 tcpdump 监听 (1)来自 eth0 适配卡且 (2)通讯协议为 port22 ,(3)目标来源为192.168.1.100 的封包资料?

答: tcpdump -i eth0 -nn 'port 22 and srchost 192.168.1.100' 

arp故障
故障现象:局域网中的一台采用solaris操作系统的服务器A-SERVER网络连接不正常,从任意主机上都无法ping通该服务器。
排查:首先检查系统,系统本身工作正常,无特殊进程运行,cpu,内存利用率正常,无挂接任何形式的防火墙,网线正常。
此时我们借助tcpdump来进行故障定位,首先我们将从B-CLIENT主机上执行ping命令,发送icmp数据包给A-SERVER,如下:
[root@redhat log]# ping A-SERVER
PING A-SERVER from B-CLIENT : 56(84) bytes of data.
此时在A-SERVER启动tcpdump,对来自主机B-CLIENT的数据包进行捕获。
A-SERVER# tcpdump host B-CLIENT
tcpdump: listening on hme0
16:32:32.611251 arp who-has A-SERVER tell B-CLIENT
16:32:33.611425 arp who-has A-SERVER tell B-CLIENT
16:32:34.611623 arp who-has A-SERVER tell B-CLIENT
我们看到,没有收到预料中的ICMP报文,反而捕获到了B-CLIENT发送的arp广播包,由于主机B-CLIENT无法利用arp得到服务器A-SERVER的地址,因此反复询问A-SERVER的MAC地址,由此看来,高层的出问题的可能性不大,很可能在链路层有些问题,先来查查主机A-SERVER的arp表:
A-SERVER# arp -a
Net to Media Table
Device IP Address Mask Flags Phys Addr
------ -------------------- --------------- ----- ---------------
hme0 netgate 255.255.255.255 00:90:6d:f2:24:00
hme0 A-SERVER 255.255.255.255 S 00:03:ba:08:b2:83
hme0 BASE-ADDRESS.MCAST.NET 240.0.0.0 SM 01:00:5e:00:00:00
请注意A-SERVER的Flags位置,我们看到了只有S标志。我们知道,solaris在arp实现中,arp的flags需要设置P标志,才能响应ARP requests。
手工增加p位
A-SERVER# arp -s A-SERVER 00:03:ba:08:b2:83 pub
此时再调用arp -a看看
A-SERVER# arp -a
Net to Media Table
Device IP Address Mask Flags Phys Addr
------ -------------------- --------------- ----- ---------------
hme0 netgate 255.255.255.255 00:90:6d:f2:24:00
hme0 A-SERVER 255.255.255.255 SP 00:03:ba:08:b2:83
hme0 BASE-ADDRESS.MCAST.NET 240.0.0.0 SM 01:00:5e:00:00:00
我们看到本机已经有了PS标志,此时再测试系统的网络连接恢复正常,问题解决!

例2:netflow软件问题
故障现象:在新装的网管工作站上安装cisco netflow软件对路由设备流量等进行分析,路由器按照要求配置完毕,本地工作上软件安装正常,无报错信息,但是启动netflow collector却收不到任何路由器上发出的流量信息,导致该软件失效。 排查:反复检查路由和软件,配置无误。采用逐步分析的方法,首先先要定位出有问题的设备,是路由器根本没有发送流量信息还是本地系统接收出现了问题?
突然想到在路由器上我们定义了接收的client端由udp端口9998接收数据,可以通过监视这个端口来看路由器是否确实发送了udp数据,如果系统能够接收到来自路由的数据包,那么路由方面的问题可能行不大,反之亦然。
在网管工作站上使用tcpdump来看看:
nms#tcpdump port 9995
tcpdump: listening on hme0
18:15:34.373435 routea > nms.9995: udp 1464
18:15:34.373829 routea.50111 > nms.9995: udp 1464
18:15:34.374100 routea.50111 > nms.9995: udp 1464
马上我们就看到数据包确实从路由器上发过来了,问题出在路由器的可能性基本排除,重新核查系统,果然,网管工作站上安装了防火墙,udp端口9998是被屏蔽的,调整工作站上的防火墙配置,netflow工作恢复正常,故障排除!
例3:邮件服务器排障

故障现象:局域网新安装了后台为qmail的邮件服务器server,邮件服务器收发邮件等基本功能正常,但在使用中发现一个普遍的怪现象:pc机器上发邮件时连接邮件服务器后要等待很久的时间才能开始实际的发送工作。

排查:网络连接没有问题,邮件服务器server和下面的pc性能都没有问题,问题可能出在哪里呢?为了进行准确的定位,我们在pc机client上发送邮件,同时在邮件服务器server上使用tcpdump对这个client的数据包进行捕获分析,如下:
server#tcpdump host client
tcpdump: listening on hme0
19:04:30.040578 client.1065 > server.smtp: S 1087965815:1087965815(0) win64240 <mss 1460,nop,wscale 0,nop,nop,timestamp[|tcp]> (DF)
19:04:30.040613 server.smtp > client.1065: S 99285900:99285900(0) ack1087965816 win 10136 <nop,nop,timestamp 20468779 0,nop,[|tcp]> (DF)
19:04:30.040960 client.1065 > server.smtp: . ack 1 win 64240 (DF)
顺利的完成三次握手,目前为止正常,往下看
19:04:30.048862 server.33152 > client.113: S 99370916:99370916(0) win 8760<mss 1460> (DF)
19:04:33.411006 server.33152 > client.113: S 99370916:99370916(0) win 8760<mss 1460> (DF)
19:04:40.161052 server.33152 > client.113: S 99370916:99370916(0) win 8760<mss 1460> (DF)
19:04:56.061130 server.33152 > client.113: R 99370917:99370917(0) win 8760(DF)
19:04:56.070108 server.smtp > client.1065: P 1:109(108) ack 1 win 10136<nop,nop,timestamp 20471382 167656> (DF)

这里有问题了,我们看到server端试图连接client的113 identd端口,要求认证,然而没有收到client端的回应,server端重复尝试了3次,费时26秒后,才放弃认证请求,主动发送了reset标志的数据包,开始push后面的数据,而正是在这个过程中所花费的26秒时间,造成了发送邮件时漫长的等待情况。
问题找到了,就可以对症下药了,通过修改服务器端的qmail配置,使它不再进行113端口的认证,再次抓包,看到邮件server不再进行113端口的认证尝试,而是在三次握手后直接push数据,问题解决!

我是北京铁通ADSL上网,通过一个四口的路由分给几个人用。我的IP是192.168.2.4。网关是192.168.2.11。以前有一段时间没改网关IP的时候路由里保存的ADSL账号经常消失、我设置的路由密码也改回了出厂设置,那时候是确定LAN里面有病毒。后来改成了现在的IP。该路由IP后能上qq,开网页有时候速度其慢无比。在凌晨时候就我一个人上网,开网页也是非常慢。
抓包
44 6.280504 222.133.100.166 192.168.2.4 HTTP Continuation or non-HTTP traffic
45 6.280757 192.168.2.4 222.133.100.166 HTTP Continuation or non-HTTP traffic
46 6.403861 192.168.2.4 222.133.100.166 HTTP Continuation or non-HTTP traffic
47 6.403903 192.168.2.4 222.133.100.166 HTTP Continuation or non-HTTP traffic
48 6.579872 192.168.2.4 222.133.100.166 HTTP Continuation or non-HTTP traffic
49 6.579911 192.168.2.4 222.133.100.166 HTTP Continuation or non-HTTP traffic
50 6.755121 192.168.2.4 222.133.100.166 HTTP Continuation or non-HTTP traffic
51 6.755165 192.168.2.4 222.133.100.166 HTTP Continuation or non-HTTP traffic
52 7.543836 222.133.100.166 192.168.2.4 TCP http > 2974 [ACK] Seq=168Ack=23283 Win=65535 Len=0
53 7.543949 192.168.2.4 222.133.100.166 HTTP Continuation or non-HTTP traffic
54 7.543958 192.168.2.4 222.133.100.166 HTTP Continuation or non-HTTP traffic
55 7.677383 222.133.100.166 192.168.2.4 TCP http > 2974 [ACK] Seq=168Ack=24880 Win=65535 Len=0
56 7.677488 192.168.2.4 222.133.100.166 HTTP Continuation or non-HTTP traffic
57 7.677497 192.168.2.4 222.133.100.166 HTTP Continuation or non-HTTP traffic
58 7.678653 222.133.100.166 192.168.2.4 HTTP Continuation or non-HTTP traffic
59 7.788499 222.133.100.166 192.168.2.4 TCP http > 2974 [ACK] Seq=224Ack=26960 Win=65535 Len=0
60 7.788609 192.168.2.4 222.133.100.166 HTTP Continuation or non-HTTP traffic
61 7.788615 192.168.2.4 222.133.100.166 HTTP Continuation or non-HTTP traffic
62 8.625733 222.133.100.166 192.168.2.4 TCP http > 2974 [ACK] Seq=224Ack=29840 Win=65535 Len=0
63 8.625848 192.168.2.4 222.133.100.166 HTTP Continuation or non-HTTP traffic
64 8.625856 192.168.2.4 222.133.100.166 HTTP Continuation or non-HTTP traffic
IP查询结果 222.133.100.166 中国  山东省  菏泽市
ping 超时
nslookup  can't find

TCP包的输出信息
src > dst: flags data-seqno ack window urgentoptions
src > dst:表明从源地址到目的地址,flags是TCP包中的标志信息,S 是SYN标志, F (FIN), P (PUSH) , R (RST) "."(没有标记); data-seqno是数据包中的数据的顺序号,ack是下次期望的顺序号, window是接收缓存的窗口大小,urgent表明数据包中是否有紧急指针. Options是选项.

我认为是我的电脑里面有病毒,如果宽带路由有病毒的话,我的qq就不会是一直能上的了。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值