tcpdump非常实用的抓包实例

转自 tcpdump非常实用的抓包实例_nanyun2010的专栏-CSDN博客_tcpdump 目标ip

再结合《Linux高性能服务器》中对tcpdump的介绍,常用的功能就没啥问题了!

详细的文档见tcpdump高级过滤技巧

tcpdump 很详细的-xlzheng-ChinaUnix博客

tcpdump与wireshark可以好好的研究一下!!一个抓包一个分析!!!!

#指定网卡、ip、端口的抓包并输出cap文件
tcpdump -i eth1 host 100.251.111.01 port 9092 -w 11.cap

#抓取所有网卡,但是指定端口的抓包并全量打印
tcpdump -i any host 100.251.111.01 port 9092 -X

#指定网卡和源ip进行抓包
tcpdump -i eth1 src host 192.168.1.1

#指定网卡和目标ip进行抓包
tcpdump -i eth1 dst host 192.168.1.1

#抓取经过任意网卡,源地址为10.100.71.207、目的地址为9.137.22.127、目的端口为20087的数据包且详细显示
tcpdump -i any '(src host 10.100.71.207) and (dst host 9.137.22.127) and (dst port 20087)' -X

#抓取所有经过 eth1,目的地址是 192.168.1.254 或 192.168.1.200 端口是 80 的 TCP 数据;
tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host
192.168.1.200)))'

#抓取所有经过 eth1,目的网络是 192.168,但目的主机不是 192.168.1.200 的 TCP 数据;
tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'

一、基本介绍

0、首先看下tcpdump的helper

[root@TENCENT64 /data/home/xxxx/myInner]#tcpdump --help
tcpdump: unrecognized option '--help'
tcpdump version 4.5.1
libpcap version 1.5.3
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqRStuUvxX] [ -B size ] [ -c count ]
                [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
                [ -i interface ] [ -j tstamptype ] [ -M secret ]
                [ -P in|out|inout ]
                [ -r file ] [ -s snaplen ] [ -T type ] [ -V file ] [ -w file ]
                [ -W filecount ] [ -y datalinktype ] [ -z command ]
                [ -Z user ] [ expression ]

这里面大概可以分成几类来看:

1、类型的关键字(默认即为host)

  • host:指明一台主机。如:host 10.1.110.110
  • net:指明一个网络地址,如:net 10.1.0.0
  • port:指明端口号:如:port 8090

2、确定方向的关键字

  • src:ip包的源地址,如:src 10.1.110.110
  • dst:ip包的目标地址。如:dst 10.1.110.110

3、协议的关键字(缺省是抓取所有协议的信息包)

  • fddi、ip、arp、rarp、tcp、udp。

4、其它关键字

  • gateway、broadcast、less、greater。

5、常用表达式

  • 非:! 或者 not
  • 且:&& 或者 and
  • 或:|| 或者 or

二、重要选项

(1)-i:interface的含义表示希望tcpdump监听哪个网卡;

(2)-X:告诉tcpdump把协议头和包内容都显示出来(tcpdump会以16进制和ASCII的形式显示),利器;

(3)-c:指定抓取几个包,之后tcpdump就是停止;

(4)-v:输出稍微详细一点的信息,例如ip数据包中的TTL和TOS信息;

(5)-vv:输出详细的报文信息;

(6)-w:将原始包写入文件中(如果使用重定向>只是保存显示的结果,而不是原始文件),即所谓的'流量保存',把抓到的网络报存储到磁盘。如 -w a.cap

(7)-s 0:抓取数据包时默认抓取长度为68字节,加上-s 0 后可以抓到完整的数据包
;将snaplen设置为0会将其默认值设置为65535。

二、基本使用

1、过滤主机(最好加上-X)
(1)抓取所有经过 eth1,目的或源地址是 192.168.1.1 的网络数据
tcpdump -i eth1 host 192.168.1.1 
(2)经过eth1指定源地址
tcpdump -i eth1 src host 192.168.1.1
(3)经过eth1指定目的地址
tcpdump -i eth1 dst host 192.168.1.1


2、过滤端口(最好加上-X)

(1)抓取所有经过 eth1,目的或源端口是 25 的网络数据
tcpdump -i eth1 port 25
(2)指定源端口
tcpdump -i eth1 src port 25
(3)指定目的端口
tcpdump -i eth1 dst port 25网络过滤

3、协议过滤

#分别指定仅抓取arp/ip/tcp/udp协议包

tcpdump -i eth1 arp
tcpdump -i eth1 ip
tcpdump -i eth1 tcp
tcpdump -i eth1 udp
tcpdump -i eth1 icmp

4、综合使用

(1)抓取经过eth1,源地址为10.100.71.207、目的地址为9.137.22.127、目的端口为20087的数据包且详细显示;

tcpdump -i eth1 '(src host 10.100.71.207) and (dst host 9.137.22.127) and (dst port 20087)' -X

(2)抓取所有经过 eth1,目的地址是 192.168.1.254 或 192.168.1.200 端口是 80 的 TCP 数据;

tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host
192.168.1.200)))'

(3)抓取所有经过 eth1,目标 MAC 地址是 00:01:02:03:04:05 的 ICMP 数据;

tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'

(4)抓取所有经过 eth1,目的网络是 192.168,但目的主机不是 192.168.1.200 的 TCP 数据;

tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'

5、其他使用

- 只抓 SYN 包
# tcpdump -i eth1 'tcp[tcpflags] = tcp-syn'
- 抓 SYN, ACK
# tcpdump -i eth1 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0'
抓 SMTP 数据
----------
# tcpdump -i eth1 '((port 25) and (tcp[(tcp[12]>>2):4] = 0x4d41494c))'
抓取数据区开始为"MAIL"的包,"MAIL"的十六进制为 0x4d41494c。
抓 HTTP GET 数据
--------------
# tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x47455420'
"GET "的十六进制是 47455420
抓 SSH 返回
---------
# tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x5353482D'
"SSH-"的十六进制是 0x5353482D


# tcpdump -i eth1 '(tcp[(tcp[12]>>2):4] = 0x5353482D) and (tcp[((tcp[12]>>2)+4):2]
= 0x312E)'抓老版本的 SSH 返回信息,如"SSH-1.99.."

- 抓 DNS 请求数据
# tcpdump -i eth1 udp dst port 53
其他
----
-c 参数对于运维人员来说也比较常用,因为流量比较大的服务器,靠人工 CTRL+C 还是
抓的太多,于是可以用-c 参数指定抓多少个包。
# time tcpdump -nn -i eth0 'tcp[tcpflags] = tcp-syn' -c 10000 > /dev/null
上面的命令计算抓 10000 个 SYN 包花费多少时间,可以判断访问量大概是多少。

实时抓取端口号8000的GET包,然后写入GET.log

tcpdump -i eth0 '((port 8000) and (tcp[(tcp[12]>>2):4]=0x47455420))' -nnAl -w /tmp/GET.log

6、tcpdump的TCP输出结果详解

1、粗略行含义

tcpdump -i eth1 '(dst host 9.137.22.127) and (dst port 20087)'

16:10:38.022785 IP 9.148.161.53.60296 > Tencent-SNG.20087: Flags [S], seq 2587278301, win 14600, options [mss 1424,nop,nop,sackOK,nop,wscale 10], length 0
16:10:38.022949 IP 9.148.161.53.60296 > Tencent-SNG.20087: Flags [.], ack 2339854309, win 15, length 0
16:10:38.022950 IP 9.148.161.53.60296 > Tencent-SNG.20087: Flags [P.], seq 0:273, ack 1, win 15, length 273
16:10:38.030960 IP 9.148.161.53.60232 > Tencent-SNG.20087: Flags [.], ack 8286, win 39, length 0
16:10:38.071978 IP 9.148.161.53.60296 > Tencent-SNG.20087: Flags [.], ack 825, win 16, length 0
16:10:38.940749 IP 9.148.161.53.60288 > Tencent-SNG.20087: Flags [P.], seq 198:396, ack 183, win 16, length 198
16:10:38.986887 IP 9.148.161.53.60288 > Tencent-SNG.20087: Flags [.], ack 365, win 17, length 0
16:10:38.989010 IP 9.148.161.53.60288 > Tencent-SNG.20087: Flags [P.], seq 396:669, ack 365, win 17, length 273
16:10:39.074155 IP 9.148.161.53.60288 > Tencent-SNG.20087: Flags [.], ack 1189, win 18, length 0
16:10:47.395448 IP 9.148.161.53.60296 > Tencent-SNG.20087: Flags [P.], seq 273:471, ack 825, win 16, length 198
16:10:47.441059 IP 9.148.161.53.60296 > Tencent-SNG.20087: Flags [.], ack 1007, win 18, length 0
16:10:47.497977 IP 9.148.161.53.60288 > Tencent-SNG.20087: Flags [P.], seq 669:942, ack 1189, win 18, length 273
16:10:47.540882 IP 9.148.161.53.60288 > Tencent-SNG.20087: Flags [.], ack 1715, win 20, length 0
16:10:47.754603 IP 9.148.161.53.60296 > Tencent-SNG.20087: Flags [P.], seq 471:669, ack 1007, win 18, length 198
16:10:47.799591 IP 9.148.161.53.60296 > Tencent-SNG.20087: Flags [.], ack 1189, win 20, length 0
16:10:47.863558 IP 9.148.161.53.60237 > Tencent-SNG.20087: Flags [P.], seq 475:748, ack 4297, win 21, length 273
16:10:47.914447 IP 9.148.161.53.60237 > Tencent-SNG.20087: Flags [.], ack 4823, win 23, length 0
16:11:20.958236 IP 9.148.161.53.60233 > Tencent-SNG.20087: Flags [F.], seq 1488431582, ack 2545596918, win 30, length 0

上述各列的含义是:

第一列:时、分、秒、毫秒的时间
第二列:网络协议
第三列:发送方的ip地址+端口号(或者协议)
第四列:方向符号 >
第五列:接收方的ip地址+端口号(或者协议)
第六列:冒号
第七列:Flag标识符:
    [S]:建立连接的标识SYN,表示这个一个SYNC请求;
    [.]:表示这是一个ACK确认包;
    [P]:发送数据的标识,可以是server→client也可能是client→server;
    [F]:结束连接的标识FIN,表示关闭连接的操作,server/client都有可能发起;
    [R]:RST包.与F包作用相同,但RST表示连接关闭时,仍然有数据未被处理;可以理解为强制切断连接。
第八列:ack及其值
第九列:win 20是指滑动窗口大小
第十列:length 12指数据包的大小

2、详情输出时每行的含义

[root@test ~]# tcpdump -i eth1 -nn -X 'port 22' -c 1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
14:31:53.579814 IP 192.168.146.6.62625 > 192.168.146.131.22: Flags [P.], seq 614429695:614429763, ack 3852162272, win 4101, length 68
	0x0000:  4500 006c 4cc9 4000 8006 07e8 c0a8 9206  E..lL.@.........
	0x0010:  c0a8 9283 f4a1 0016 249f 73ff e59b 54e0  ........$.s...T.
	0x0020:  5018 1005 b7e2 0000 0000 0020 8b78 77e3  P............xw.
	0x0030:  d830 0129 84fe 2b2e b27e cebb 8b81 ca8d  .0.)..+..~......
	0x0040:  1dde fb10 3e63 0694 e48e 773d 9fcd 072d  ....>c....w=...-
	0x0050:  6fd9 30a1 73be c6bb a8f3 64a2 f406 4acf  o.0.s.....d...J.
	0x0060:  6aec 95b2 656f 2d67 0344 f6de            j...eo-g.D..
1 packet captured
3 packets received by filter
0 packets dropped by kernel

(1)第一行:tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

提醒语句,告诉你如果想要看到更多内容可以使用-v或者-vv选项。

(2)第二行:listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes

表示我们监听的是流经eth1这个网卡的网络包;它的链路层是基于以太网的;抓的包大小显示是65535字节。

(3)第三行:解读参见前面的“粗略行含义”

(4)四~七行:

1)前20字节为ip协议头

    0x0000:  4500 006c 4ce2 4000 8006 07cf c0a8 9206  E..lL.@.........
    0x0010:  c0a8 9283 f4a1 0016 249f 7667 e59b 5668  ........$.vg..Vh
    0x0020:  5018 1009 8eae 0000 0000 0020 a29f 050f  P...............
    0x0030:  014f e8f7 9bea 266e aa78 43bc 89be 4b6e  .O....&n.xC...Kn 

这几行便是IP包的内容了,是除去以太网之后剩下的内容。左侧部分是十六进制内容,右侧部分是相应的ASCII码内容。

如上,最外层是IP数据包,最开始的一个字节(8位)中,前4位(bit)表示IP的版本,此处为4,表示这是一个IPv4版本的IP包。后4位(bit)表示此IP的首部长度此处的数字是5,由于单位是“4字节”,因此可以计算得出这个IP包的首部长度是固定的4*5字节。

    0x0000:  4500 006c 4ce2 4000 8006 07cf c0a8 9206  E..lL.@.........
    0x0010:  c0a8 9283 f4a1 0016 249f 7667 e59b 5668  ........$.vg..Vh
    0x0020:  5018 1009 8eae 0000 0000 0020 a29f 050f  P...............
    0x0030:  014f e8f7 9bea 266e aa78 43bc 89be 4b6e  .O....&n.xC...Kn 

如上所示,在IP版本和首部长度之后,接下来的一个字节(8位)是“00”,这是IP协议的服务类型域(TOS),由于很少使用,因此此处设置为00.

    0x0000:  4500 006c 4ce2 4000 8006 07cf c0a8 9206  E..lL.@.........
    0x0010:  c0a8 9283 f4a1 0016 249f 7667 e59b 5668  ........$.vg..Vh
    0x0020:  5018 1009 8eae 0000 0000 0020 a29f 050f  P...............
    0x0030:  014f e8f7 9bea 266e aa78 43bc 89be 4b6e  .O....&n.xC...Kn 

如上所示,后面的2字节(16位)是“006c”,表示整个IP包的总长度(首部长度+数据长度),单位是字节。因此可以知道这个IP包的总长度是108字节.

    0x0000:  4500 006c 4ce2 4000 8006 07cf c0a8 9206  E..lL.@.........
    0x0010:  c0a8 9283 f4a1 0016 249f 7667 e59b 5668  ........$.vg..Vh
    0x0020:  5018 1009 8eae 0000 0000 0020 a29f 050f  P...............
    0x0030:  014f e8f7 9bea 266e aa78 43bc 89be 4b6e  .O....&n.xC...Kn 

如上所示,这是2字节(16位)的“表示域”,如果IP包的大小超过了数据链路层的MTU限制,就需要对IP包进行分拆,此时就要用这个域来表示哪些在分拆前是同一组的。

    0x0000:  4500 006c 4ce2 4000 8006 07cf c0a8 9206  E..lL.@.........
    0x0010:  c0a8 9283 f4a1 0016 249f 7667 e59b 5668  ........$.vg..Vh
    0x0020:  5018 1009 8eae 0000 0000 0020 a29f 050f  P...............
    0x0030:  014f e8f7 9bea 266e aa78 43bc 89be 4b6e  .O....&n.xC...Kn 

如上所示,便是3位(bit)的标志位,最高位为保留位,中间一位为DF(don't fragment),最低位为MF(more fragment),这三位是用来控制IP拆包后的组装所用。

    0x0000:  4500 006c 4ce2 4000 8006 07cf c0a8 9206  E..lL.@.........
    0x0010:  c0a8 9283 f4a1 0016 249f 7667 e59b 5668  ........$.vg..Vh
    0x0020:  5018 1009 8eae 0000 0000 0020 a29f 050f  P...............
    0x0030:  014f e8f7 9bea 266e aa78 43bc 89be 4b6e  .O....&n.xC...K

如上所示,是8位(bit)的TTL(Time To Live,即生存周期),此包的值位0x80,换算成十进制是128,这表明这个网络包,如果经过超过128个中间路由节点,则认为目的地不可达,中间路由器会将此包抛掉。

    0x0000:  4500 006c 4ce2 4000 8006 07cf c0a8 9206  E..lL.@.........
    0x0010:  c0a8 9283 f4a1 0016 249f 7667 e59b 5668  ........$.vg..Vh
    0x0020:  5018 1009 8eae 0000 0000 0020 a29f 050f  P...............
    0x0030:  014f e8f7 9bea 266e aa78 43bc 89be 4b6e  .O....&n.xC...K

如上所示,8位(bit)为协议域,用于指代上一层协议类型,此处的值为0x06,对应 十进制是6,而6是TCP协议的代号,因此可以知道这个网络包所用的传输协议是TCP。(UDP的协议号是17,TCMP的协议号是1).

    0x0000:  4500 006c 4ce2 4000 8006 07cf c0a8 9206  E..lL.@.........
    0x0010:  c0a8 9283 f4a1 0016 249f 7667 e59b 5668  ........$.vg..Vh
    0x0020:  5018 1009 8eae 0000 0000 0020 a29f 050f  P...............
    0x0030:  014f e8f7 9bea 266e aa78 43bc 89be 4b6e  .O....&n.xC...K
如上所示,2个字节表示IP首部校验和,此处计算出来的结果是07cf。

    0x0000:  4500 006c 4ce2 4000 8006 07cf c0a8 9206  E..lL.@.........
    0x0010:  c0a8 9283 f4a1 0016 249f 7667 e59b 5668  ........$.vg..Vh
    0x0020:  5018 1009 8eae 0000 0000 0020 a29f 050f  P...............
    0x0030:  014f e8f7 9bea 266e aa78 43bc 89be 4b6e  .O....&n.xC...K

如上所示,这就是我们非常熟悉的4字节的IP源地址,即 “coa8 9206”,转换成IP地址为192.168.146.6 。

    0x0000:  4500 006c 4ce2 4000 8006 07cf c0a8 9206  E..lL.@.........
    0x0010:  c0a8 9283 f4a1 0016 249f 7667 e59b 5668  ........$.vg..Vh
    0x0020:  5018 1009 8eae 0000 0000 0020 a29f 050f  P...............
    0x0030:  014f e8f7 9bea 266e aa78 43bc 89be 4b6e  .O....&n.xC...K

如上所示,这个4字节为IP目的地址,即 “c0a8 9283”,转成IP地址为 192.168.146.131 .

以上是网络层IP协议的首部20字节;其后的20字节就是传输层TCP协议的包头了。

2)随后20字节为TCP协议头

 TCP协议头构成如下。此处尝试分析前几个字段。

   

①源端口号:源端口号占用2字节即"f4a1",即十进制的62625;这个就是发送方的端口。

    0x0000:  4500 006c 4ce2 4000 8006 07cf c0a8 9206  E..lL.@.........
    0x0010:  c0a8 9283 f4a1 0016 249f 7667 e59b 5668  ........$.vg..Vh
    0x0020:  5018 1009 8eae 0000 0000 0020 a29f 050f  P...............
    0x0030:  014f e8f7 9bea 266e aa78 43bc 89be 4b6e  .O....&n.xC...K

②目标端口号:目标端口号占用2字节即"0016",即十进制的22;这个就是接受方的端口。

    0x0000:  4500 006c 4ce2 4000 8006 07cf c0a8 9206  E..lL.@.........
    0x0010:  c0a8 9283 f4a1 0016 249f 7667 e59b 5668  ........$.vg..Vh
    0x0020:  5018 1009 8eae 0000 0000 0020 a29f 050f  P...............
    0x0030:  014f e8f7 9bea 266e aa78 43bc 89be 4b6e  .O....&n.xC...K

………………

………………

3)总的来说如下:

    0x0000:  4500 006c 4ce2 4000 8006 07cf c0a8 9206  E..lL.@.........
    0x0010:  c0a8 9283 f4a1 0016 249f 7667 e59b 5668  ........$.vg..Vh
    0x0020:  5018 1009 8eae 0000
0000 0020 a29f 050f  P...............
    0x0030:  014f e8f7 9bea 266e aa78 43bc 89be 4b6e
 .O....&n.xC...K

1)红色部分为IP数据包的首部,共20字节;

2)黄色部分为TCP数据包的首部,共20字节;

3)其余为TCP的DATA部分。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值