CentOS下怎样运用tcpdump网络抓包
tcpdump是Linux下的截获剖析网络数据包的工具,对优化系统机能有很大参照 价值。
安置
tcpdump不是默许安置的,在CentOS下安置:
yum install tcpdump
在Ubuntu下安置:
apt-get install tcpdump
默许启动
tcpdump
一般状况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。
监视指定网络接口的数据包(必然要查看网卡)
tcpdump -i eth1
假如不指定网卡,默许tcpdump只会监视第一个网络接口,一样是eth0,下面的例子都没有指定网络接口。
监视指定主机的数据包
打印所有进入或分开sundown的数据包.
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, 要换算
成字节数需要乘以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 程序发生的数据包时可用到此表达式 .
(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.40.netbios-ns > 202.102.245.127.netbios-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 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 : 网卡准确发送数据包的数目乃至发生错误、流失、碰撞的总数
以上就是CentOS下怎样使用tcpdump网络抓包的具体内容,更多请关注百分百源码网其它相关文章!