tcpdump抓包分析详解

tcpdump抓包分析详解

[root@linux ~]# tcpdump [-nn] [-i 接口] [-w 储存档名] [-c 次数] [-Ae][-qX] [-r 档案] [所欲撷取的数据内容] 参数:

-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 与 port number 捉下 eth0 这个网络卡上的封包,持续 3 秒 [root@linux ~]# 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 96 bytes

01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 116:232(116) ack 1 win 9648

01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 232:364(132) ack 1 win 9648

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

6680 packets captured <==捉下来的封包数量 14250 packets received by filter <==由过滤所得的总封包数量 7512 packets dropped 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: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 01:54:37.96 IP 192.168.1.11.1240 > 192.168.1.100.21: . ack 1 win 65535

01:54:37.96 IP 192.168.1.100.21 > 192.168.1.11.1240: P 1:21(20) ack 1 win 5840 01:54:38.12 IP 192.168.1.11.1240 > 192.168.1.100.21: . ack 21 win 65515

01:54:42.79 IP 192.168.1.11.1240 > 192.168.1.100.21: P 1:17(16) ack 21 win 65515 01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: . ack 17 win 5840

01:54:42.79 IP 192.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) 登入『ssh localhost』 那么输出的结果会是如何? [root@linux ~]# tcpdump -i lo -nn

1 tcpdump: verbose output suppressed, use -v or -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

4 11:02:54.253831 IP 127.0.0.1.22 > 127.0.0.1.32936: S 920046702:920046702(0) ack 933696133 win 32767

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

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

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

上表显示的头两行是 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)通讯协议为 port 22 ,(3)目标来源为 192.168.1.100 的封包资料?

答: tcpdump -i eth0 -nn 'port 22 and src host 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的地址,因

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4