tcpdum详解

tcpdump的介绍

tcpdump  是一个运行在命令行下的抓包工具。它允许用户拦截和显示发送或收到过网络连接到该计算机的TCP / IP和其他数据包.tcpdump适用于

大多数的类Unix系统操作系统(如linux,BSD等)。类Unix系统的tcpdump需要使用libpcap这个捕捉数据的库就像windows下的WinPcap。

在学习的tcpdump前最好对基本网络的网络知识有一定的认识。

tcpdump的命令格式及常用参数

TCPDUMP的大概形式如下:

例:tcpdump -i eth0'port 1111'-X -c 3

-X告诉tcpdump的命令,需要把协议头和包内容都原原本本的显示出来(tcpdump的会以16进制和ASCII的形式显示),这在进行协议分析时是绝对的利器。

 

tcpdump的采用命令行方式,它的命令格式为:

  tcpdump [-adeflnNOpqStvx] [-c数量] [-F文件名]

          [-i网络接口] [-r文件名] [-s snaplen]

                                       [-T类型] [-w文件名] [表达式]

 tcpdump的的选项介绍

   -a将网络地址和广播地址转变成名字;

   -d将匹配信息包的代码以人们能够理解的汇编格式给出;

   -dd将匹配信息包的代码以c语言程序段的格式给出;

   -ddd将匹配信息包的代码以十进制的形式给出;

   -e在输出行打印出数据链路层的头部信息,包括源mac和目的mac,以及网络层的协议;

   -f将外部的Internet地址以数字的形式打印出来;

   -l使标准输出变为缓冲行形式;

   -n指定将每个监听到数据包中的域名转换成IP地址后显示,不把网络地址转换成名字;

           -nn:指定将每个监听到的数据包中的域名转换成IP,端口从应用名称转换成端口号后显示

   -t在输出的每一行不打印时间戳;

   -v输出一个稍微全细的信息,例如在ip包中可以包括ttl和服务类型的信息;

   -vv输出详细的报文信息;

   -c在收到指定的包的数目后,tcpdump就会停止;

   -F从指定的文件中读取表达式,忽略其它的表达式;

   -i指定监听的网络接口;

      -p:将网卡设置为非混杂模式,不能与主机或广播一起使用

   -r从指定的文件中读取包(这些包一般通过-w选项产生);

   -w直接将包写入文件中,并不分析和打印出来;

            -s snaplen snaplen表示从一个包中截取的字节数.0表示包不截断,抓完整的数据包。默认的话tcpdump只显示部分数据包,默认68字节。

   -T将监听到的包直接解释为指定的类型的报文,常见的类型有rpc(远程过程调用)和snmp(简单网络管理协议;)

          -X告诉tcpdump命令,需要把协议头和包内容都原原本本的显示出来(tcpdump会以16进制和ASCII的形式显示),这在进行协议分析时是绝对的利器。

 

 
 

1,抓取回环网口的包:tcpdump -i lo

2,防止包截断:tcpdump -s0

3,以数字显示主机及端口:tcpdump -n

 

 

 

         

-i是interface的含义,是指我们有义务告诉tcpdump希望他去监听哪一个网卡,

-X告诉tcpdump的命令,需要把协议头和包内容都原原本本的显示出来(tcpdump的会以16进制和ASCII的形式显示),这在进行协议分析时是绝对的利器。

1111我们只关心源端口或目的端口是1111的数据包。

-c是Count的含义,这设置了我们希望tcpdump帮我们抓几个包。

其中还有另外一个比较重要的参数 - l使得输出变为行缓冲

-l选项的作用就是将tcpdump的的输出变为“行缓冲”方式,这样可以确保的tcpdump遇到的内容一旦是换行符即将缓冲的内容输出到标准输出,以便于利用管道

或重定向方式来进行后续处理。

LINUX / UNIX的标准I / O提供了全缓冲,行缓冲和无缓冲三种缓冲方式。

标准错误是不带缓冲的,终端设备常为行缓冲,而其他情况默认都是全缓冲的。

 

例如我们只想提取包的每一行的第一个域(时间域),这种情况下我们就需要-l将默认的全缓冲变为行缓冲了。

tcpdump -i eth0 port 1111 -l | awk'{print $ 1}'

         

参数-w -r

-w直接将包写入文件中(即原始包,如果使用重定向>则只是保存显示的结果,而不是原始文件),即所谓的“流量保存”---就是把抓到的网络包能存储到磁盘上,

保存下来,为后续使用。参数-r达到“流量回放”---就是把历史上的某一时间段的流量,重新模拟回放出来,用于流量分析。

        

通过-w选项将流量都存储在cp.pcap(二进制格式)文件中了。可以通过-r读取原始数据包文件cp.pcap。 

如:sudo tcpdump i-eth0'port 1111'-c 3 -r cp.pcap即可进行流量回放。

问:流量回放又有啥子用?

 

tcpdump的的输出结果介绍

 键入命令:sudo tcpdump -i eth0 -e -nn -X -c 2'port1111'所截获包内容如下:

   -n不把网络地址转换成名字;

 

 sudo tcpdump -i eth0 -e -nn -X -c 2'port1111' 

        

 

第一行:“tcpdump:详细输出被抑制,使用-v或-vv进行全协议解码”

提示使用选项-v和-vv,可以看到更全的输出内容。

第二行“监听eth0,链接型EN10MB(以太网),捕获大小65535bytes”

我们监听的是通过eth0的这个NIC设备的网络包,且它的链路层是基于以太网的,要抓的包大小限制是65535字节。包大小限制值可以通过-s选项来设置。

第三行“12:40:33.569037 00:19:e0:b5:10:94> 00:1a:a0:31:39:d4,ethertypeIPv4(0x0800),”

12:40:33.569037分别对应着这个包被抓到的“时”,“分”,“秒”,“微妙”。

00:19:e0:b5:10:94> 00:1a:a0:31:39:d4表示MAC地址00:19:e0:b5:10:94发送到MAC地址为00:1a:a0:31: 39:d4的主机,ethertype IPv4(0x0800)表示

以太网帧的协议类型为IPv4的(即代码为0x0800的)。

第四行“长度66:210.45.123.249.27236> 172.16.0.11.1111:旗帜[S],序号1624463808,

长度66表示以太帧长度为66. 210.45.123.249.27236表示这个包的源IP为210.45.123.249,源端口为27236,'>'表示数据包的传输方向,172.16.0.11.1111,

表示这个数据包的目的端IP为172.16.0.11,目标端口为1111,1111端口是我的一个网络服务器监听端口.Flags是[S],表明是顺式建立连接包(即三次握手的第一次

握手),seq1624463808序号为1624463808,这个其实就是TCP三次握手的第一次握手:client(210.45.123.249)发送syn请求建立连接包。

第五行“win 8192,options [mss 1460,nop,wscale 2,nop,nop,sackOK],length 0”

win 8192表示窗口大小为8192字节.options [mss 1460,nop,wscale 2,nop,nop,sackOK]为tcp首部可选字段mss 1460表示mss是发送端(客户端)通告的最大

报文长度,发送端将不接收超过这个长度的TCP报文段(这个值和MTU有一定关系).nop是一个空操作选项,wscale指出发送端使用的窗口扩大因子为2,sackOK

表示发送端支持并同意使用SACK选。

下面几行分别是IP,TCP首部,这里不再敷述。

 

tcpdump的过滤语句介绍

可以给tcpdump的传送“过滤表达式”来起到网络包过滤的作用,而且可以支持传入单个或多个过滤表达式。

可以通过命令man pcap-filter来参考过滤表达式的帮助文档

过滤表达式大体可以分成三种过滤条件,“类型”,“方向”和“协议”,这三种条件的搭配组合就构成了我们的过滤表达式。

关于类型的关键字,主要包括主机,网络,端口,例如主机210.45.114.211,指定主机210.45.114.211,net 210.11.0.0指明210.11.0.0是一个网络地址,端口21指明

端口号是21,如果没有指定类型,缺省的类型是主机。

关于传输方向的关键字,主要包括src,dst,dst或src,dst和src,

这些关键字指明了传输的方向。举例说明,src 210.45.114.211,指明ip包中源地址是210.45.114.211,dst net 210.11.0.0指明目的网络地址是210.11.0.0。如果没有指明

方向关键字,则缺省是srcor dst关键字。

关于协议的关键字,主要包括ether,ip,ip6,arp,rarp,tcp,udp等类型。这几个的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的

信息包。

如我们只想抓tcp的包命令为:sudo tcpdump -i eth0 -nn -c1'tcp'

      

除了这三种类型的关键字之外,其他重要的关键字如下:

网关,广播,少,更大,还有三种逻辑运算,取非运算是'不''!',与运算是'和','&&';或运算是'或','||';

可以利用这些关键字进行组合,从而组合为比较强大的过滤条件。下面举例说明

(1)只想查目标机器端口是21或80的网络包,其他端口的我不关注:

  sudo tcpdump -i eth0 -c 10'dst port 21或dst port 80'

(2)想要截获主机172.16.0.11和主机210.45.123.249或210.45.123.248的通信,使用命令(注意括号的使用):

  sudo tcpdump -i eth0 -c 3'主机172.16.0.11和(210.45.123.249或210.45.123.248)'

(3)想获取使用FTP端口和FTP数据端口的网络包

   sudo tcpdump'port ftp或ftp-data'

   这里ftp,ftp-data到底对应哪个端口?linux系统下/ etc / services这个文件里面,就存储着所有知名服务和传输层端口的对应关系。如果你直接把/ etc / services里

   的FTP对应的端口值从21改为了3333,那么tcpdump的就会去抓端口含有3333的网络包了。

(4)如果想要获取主机172.16.0.11除了和主机210.45.123.249之外所有主机通信的ip包,使用命令:

 sudo tcpdump ip'主机172.16.0.11和!210.45.123.249'

(5)抓172.16.0.11的80端口和110和25以外的其他端口的包

sudo tcpdump -i eth0'主机172.16.0.11和!端口80和!25号港口!110号港口

 

下面介绍一些tcpdump的中过滤语句比较高级的用法

想获取172.16.10.11和google.com之间建立TCP三次握手中带有SYN标记位的网络包。

命令为:sudo tcpdump -i eth0'host 172.16.0.11 andhost google.com and tcp [tcpflags]&tcp-syn!= 0'-c 3 -nn

 

上面的命令是不是看着有点晕的感觉。是的。

下面详细介相关知识。

其实我们理解这种语法:proto [expr:size],就不难理解上面的语句了。

下面详细介绍proto [expr:size]

Proto即protocol的缩写,它表示这里要指定的是某种协议名称,如ip,tcp,udp等。总之可以指定的协议有十多种,如链路层协议ether,fddi,tr,wlan,ppp ,滑,链接,

网络层协议IP,IP6,ARP,RARP,ICMP传输层协议TCP,UDP等。

EXPR用来指定数据报字节单位的偏移量,该偏移量相对于指定的协议层,默认的起始位置是0;而大小表示从偏移量的位置开始提取多少个字节,可以设置为

1,2,4,默认为1字节如果只设置了EXPR,而没有设置大小,则默认提取1个字节比如IP。[2:2],就表示提取出第3,4个字节;而IP [0]则表示提取IP协议头的

第一个字节在我们提取了特定内容之后,我们就需要设置我们的过滤条件了,我们可用的“比较操作符”包括:!>,<,> =,<=,=,=,总共有6个。

举例:想截取每个TCP会话的起始和结束报文(SYN和FIN报文),而且会话方中有一个远程主机。

sudo tcpdump'tcp [13]&3!= 0而不是(src和dst net 172.16.0.0)' - nn

如果熟悉tcp首部报文格式可以比较容易理解这句话,因为tcp便宜13字节的位置为2位保留位和6位标志位(URG,ACK,PSH,RST,SYN,FIN),所以与3相与就可以得出

SYN,FIN其中是否一个置位1。 

从上面可以看到在写过滤表达式时,需要我们对协议格式比较理解才能把表达式写对。这个比较有难度的......为了让tcpdump的工具更人性化一些,有一些常用的偏移量,

可以通过一些名称来代替,比如icmptype表示ICMP协议的类型域,icmpcode表示ICMP的代码域,tcpflags则表示TCP协议的标志字段域。

更进一步的,对于ICMP的类型域,可以用这些名称具体指代:icmp-echoreply,icmp-unreach,icmp-sourcequench,icmp-redirect,icmp-echo,icmp-routeradvert,icmp-routersolicit,icmp-timxceed, icmp-paramprob,icmp-tstamp,icmp-tstampreply,icmp-ireq,icmp-ireqreply,icmp-maskreq,icmp-maskreply。

而对于TCP协议的标志字段域,则可以细分为tcp-fin,tcp-syn,tcp-rst,tcp-push,tcp-ack,tcp-urg。

对于tcpdump只能通过经常操作来熟练这些语句了。也可以把网络包用tcpdump截获保存到指定文件,然后用wireshark等可视化软件分析网络包。

 

https://blog.csdn.net/lgh1117/article/details/80213397

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值