CentOS下使⽤tcpdump⽹络抓包
tcpdump是Linux下的截获分析⽹络数据包的⼯具,对优化系统性能有很⼤参考价值。
安装
tcpdump不是默认安装的,在CentOS下安装:
yum install tcpdump
在Ubuntu下安装:
apt-get install tcpdump
默认启动
tcpdump
普通情况下,直接启动tcpdump将监视第⼀个⽹络接⼝上所有流过的数据包。
监视指定⽹络接⼝的数据包(⼀定要查看⽹卡)
tcpdump -i eth1centos和ubuntu
如果不指定⽹卡,默认tcpdump只会监视第⼀个⽹络接⼝,⼀般是eth0,下⾯的例⼦都没有指定⽹络接⼝。
监视指定主机的数据包
打印所有进⼊或离开sundown的数据包.div是什么意思流体力学
tcpdump host sundown
也可以指定ip,例如截获所有210.27.48.1 的主机收到的和发出的所有的数据包
tcpdump host 210.27.48.1
打印helios 与 hot 或者与 ace 之间通信的数据包
tcpdump host helios and \( hot or ace \)
截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信
tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
打印ace与任何其他主机之间通信的IP 数据包, 但不包括与helios之间的数据包.
tcpdump ip host ace and not helios
如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使⽤命令:
tcpdump ip host 210.27.48.1 and ! 210.27.48.2
截获主机hostname发送的所有数据
tcpdump -i eth0 src host hostname
监视所有送到主机hostname的数据包
tcpdump -i eth0 dst host hostname
监视指定主机和端⼝的数据包
如果想要获取主机210.27.48.1接收或发出的telnet包,使⽤如下命令
tcpdump tcp port 23 and host 210.27.48.1
对本机的udp 123 端⼝进⾏监视 123 为ntp的服务端⼝
tcpdump udp port 123
监视指定⽹络的数据包
打印本地主机与Berkeley⽹络上的主机之间的所有通信数据包(nt: ucb-ether, 此处可理解为'Berkeley⽹络'的⽹络地址,此表达式最原始的含义可表达为: 打印⽹络地址为ucb-ether的所有数据包)
tcpdump net ucb-ether
打印所有通过⽹关snup的ftp数据包(注意, 表达式被单引号括起来了, 这可以防⽌shell对其中的括号进⾏错误解析)
tcpdump 'gateway snup and (port ftp or ftp-data)'
打印所有源地址或⽬标地址是本地主机的IP数据包
(如果本地⽹络通过⽹关连到了另⼀⽹络, 则另⼀⽹络并不能算作本地⽹络.(nt: 此句翻译曲折,需补充).localnet 实际使⽤时要真正替换成本地⽹络的名字)
tcpdump ip and not net localnet
监视指定协议的数据包
打印TCP会话中的的开始和结束数据包, 并且数据包的源或⽬的不是本地⽹络上的主机.(nt: localnet, 实际使⽤时要真正替换成本地⽹络的名字))
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'
打印所有源或⽬的端⼝是80, ⽹络层协议为IPv4, 并且含有数据,⽽不是SYN,FIN以及ACK-only等不含数据的数据包.(ipv6的版本的表达式可做练习)
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
(nt: 可理解为, ip[2:2]表⽰整个ip数据包的长度, (ip[0]&0xf)<<2)表⽰ip数据包包头的长度(ip[0]&0xf代表包中的IHL域, ⽽此域的单位为32bit, 要换算
tcpip协议包含4层成字节数需要乘以4, 即左移2. (tcp[12]&0xf0)>>4 表⽰tcp头的长度, 此域的单位也是32bit, 换算成⽐特数为 ((tcp[12]&0xf0) >> 4) << 2,
即 ((tcp[12]&0xf0)>>2). ((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0 表⽰: 整个ip数据包的长度减去ip头的长度,再减去
tcp头的长度不为0, 这就意味着, ip数据包中确实是有数据.对于ipv6版本只需考虑ipv6头中的'Payload Length' 与 'tcp头的长度'的差值, 并且其中表达⽅式'ip[]'需换成'ip6[]'.)
打印长度超过576字节, 并且⽹关地址是snup的IP数据包
tcpdump 'gateway snup and ip[2:2] > 576'
打印所有IP层⼴播或多播的数据包,但不是物理以太⽹层的⼴播或多播数据报
tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'
打印除'echo request'或者'echo reply'类型以外的ICMP数据包( ⽐如,需要打印所有⾮ping 程序产⽣的数据包时可⽤到此表达式 .
tcp ip协议属于(nt: 'echo reuqest' 与 'echo reply' 这两种类型的ICMP数据包通常由ping程序产⽣))
tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'
tcpdump 与wireshark
Wireshark(以前是ethereal)是Windows下⾮常简单易⽤的抓包⼯具。但在Linux下很难到⼀个好⽤的图形化抓包⼯具。
还好有Tcpdump。我们可以⽤Tcpdump + Wireshark 的完美组合实现:在 Linux ⾥抓包,然后在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
(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第⼀个参数的位置,⽤来过滤数据报的类型
(2)-i eth1 : 只抓经过接⼝eth1的包
(3)-t : 不显⽰时间戳
(4)-s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
(5)-c 100 : 只抓取100个数据包
(6)dst port ! 22 : 不抓取⽬标端⼝是22的数据包
(7)src net 192.168.1.0/24 : 数据包的源⽹络地址为192.168.1.0/24
(8)-w ./target.cap : 保存成cap⽂件,⽅便⽤ethereal(即wireshark)分析
使⽤tcpdump抓取HTTP包
tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
0x4745 为"GET"前两个字母"GE",0x4854 为"HTTP"前两个字母"HT"。
tcpdump 对截获的数据并没有进⾏彻底解码,数据包内的⼤部分内容是使⽤⼗六进制的形式直接打印输出的。显然这不利于分析⽹络故障,通常的解决办法是先使⽤带-w参数的tcpdump 截获数据并保存到⽂件中,然后再使⽤其他程序(如Wireshark)进⾏解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。
1、抓取回环⽹⼝的包:tcpdump -i lo
2、防⽌包截断:tcpdump -s0
3、以数字显⽰主机及端⼝:tcpdump -n
第⼀种是关于类型的关键字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是⼀台主机,net 202.0.0.0 指明 202.0.0.0是⼀个⽹络地址,port 23 指明端⼝号是23。如果没有指定类型,缺省的类型是host.
第⼆种是确定传输⽅向的关键字,主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的⽅向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明⽬的⽹络地址是202.0.0.0 。如果没有指明⽅向关键字,则缺省是src or dst关键字。
第三种是协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI(分布式光纤数据接⼝⽹络)上的特定的⽹络协议,实际上它是"ether"的别名,fddi和ether具有类似的源地址和⽬的地址,所以可以将fddi协议包当作ether的包进⾏处理和分析。其他的⼏个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。
除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,greater,还有三种逻辑运算,取⾮运算是 'not ' '! ', 与运算是'and','&&;或运算是'or' ,'||';这些关键字可以组合起来构成强⼤的组合条件来满⾜⼈们的需要,下⾯举⼏个例⼦来说明。
普通情况下,直接启动tcpdump将监视第⼀个⽹络界⾯上所有流过的数据包。
# tcpdump
tcpdump: listening on fxp0
11:58:47.873028 202.102.245.40bios-ns > 202.102.245.127bios-ns: udp 50
11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43
0000 0000 0080 0000 1007 cf08 0900 0000
0e80 0000 902b 4695 0980 8701 0014 0002
000f 0000 902b 4695 0008 00
11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
ffff 0060 0004 ffff ffff ffff ffff ffff
0452 ffff ffff 0000 e85b 6d85 4008 0002
asp大马下载0640 4d41 5354 4552 5f57 4542 0000 0000
0000 00
使⽤-i参数指定tcpdump监听的⽹络界⾯,这在计算机具有多个⽹络界⾯时⾮常有⽤,
使⽤-c参数指定要监听的数据包数量,
使⽤-w参数指定将监听到的数据包写⼊⽂件中保存
A想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:
#tcpdump host 210.27.48.1
B想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使⽤命令:(在命令⾏中适⽤ 括号时,⼀定要
#tcpdump host 210.27.48.1 and / (210.27.48.2 or 210.27.48.3 /)
C如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使⽤命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
D如果想要获取主机210.27.48.1接收或发出的telnet包,使⽤如下命令:
#tcpdump tcp port 23 host 210.27.48.1
E 对本机的udp 123 端⼝进⾏监视 123 为ntp的服务端⼝
# tcpdump udp port 123
F 系统将只对名为hostname的主机的通信数据包进⾏监视。主机名可以是本地主机,也可以是⽹络上的任何⼀台计算机。下⾯的命令可以读取主机hostname发送的所有数据:
#tcpdump -i eth0 src host hostname
G 下⾯的命令可以监视所有送到主机hostname的数据包:
#tcpdump -i eth0 dst host hostname
H 我们还可以监视通过指定⽹关的数据包:
#tcpdump -i eth0 gateway Gatewayname
I 如果你还想监视编址到指定端⼝的TCP或UDP数据包,那么执⾏以下命令:
#tcpdump -i eth0 host hostname and port 80
J 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包
,使⽤命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
K 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使⽤命令
:(在命令⾏中适⽤ 括号时,⼀定要
#tcpdump host 210.27.48.1 and / (210.27.48.2 or 210.27.48.3 /)
L 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使⽤命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
M 如果想要获取主机210.27.48.1接收或发出的telnet包,使⽤如下命令:
#tcpdump tcp port 23 host 210.27.48.1
第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型
除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,
greater,还有三种逻辑运算,取⾮运算是 'not ' '! ', 与运算是'and','&&';或运算是'o
r' ,'||';
第⼆种是确定传输⽅向的关键字,主要包括src , dst ,dst or src, dst and src ,
如果我们只需要列出送到80端⼝的数据包,⽤dst port;如果我们只希望看到返回80端⼝的数据包,⽤src port。
#tcpdump –i eth0 host hostname and dst port 80 ⽬的端⼝是80
或者
#tcpdump –i eth0 host hostname and src port 80 源端⼝是80 ⼀般是提供http的服务的主机
如果条件很多的话要在条件之前加and 或 or 或 not
#tcpdump -i eth0 host ! 211.161.223.70 and ! 211.161.223.71 and dst port 80
如果在ethernet 使⽤混杂模式系统的⽇志将会记录
May 7 20:03:46 localhost kernel: eth0: Promiscuous mode enabled.
May 7 20:03:46 localhost kernel: device eth0 entered promiscuous mode
May 7 20:03:57 localhost kernel: device eth0 left promiscuous mode
tcpdump对截获的数据并没有进⾏彻底解码,数据包内的⼤部分内容是使⽤⼗六进制的形式直接打印输出的。显然这不利于分析⽹络故障,通常的解决办法是先使⽤带-w参数的tcpdump 截获数据并保存到⽂件中,然后再使⽤其他程序进⾏解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。
# tcpdump -i eth1 src host 211.167.237.199
00:02:03.096713 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010208:2010352(144) ack 33377 win 8576
00:02:03.096951 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010352:2010496(144) ack 33377 win 8576
00:02:03.100928 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010496:2010640(144) ack 33377 win 8576
00:02:03.101165 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010640:2010784(144) ack 33377 win 8576
00:02:03.102554 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010784:2010928(144) ack 33425 win 8576
表明在00:02:03点的时候,211.167.237.199通过ssh源端⼝连接到221.216.165.189的1467端⼝
#tcpdump -i eth1 src host 211.167.237.199 and dst port 1467
00:09:27.603075 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 180400:180544(144) ack 2833 win 8576
00:09:27.605631 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 180544:180688(144) ack 2881 win 8576
截获所有由eth0进⼊、源地址(src)为192.168.0.5的主机(host),并且(and)⽬标(dst)端⼝(port)为80的数据包
观看⽹卡传送、接收数据包的状态
$ netstat -i
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 0 14639 0 0 0 5705 119 0 0 BMRU
Iface: ⽹卡
RX-OK RX-ERR RX-DRP RX-OVR : ⽹卡正确接收数据包的数量以及发⽣错误、流失、碰撞的总数
TX-OK TX-ERR TX-DRP TX-OVR : ⽹卡正确发送数据包的数量以及发⽣错误、流失、碰撞的总数
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论