安全防护

发布于 2022-06-08  16 次阅读


DDOS

名词解释
Syn_Ack Flood 攻击:
syn_ack报文出现在连接建立的第2个报文,用来确认第一次握手的syn包。

当服务器收到syn_ack报文后会在系统里查询是否属于3次握手的范畴。如果属于则回复ack,并将连接设为连接状态。若没有查到相关信息,则回复reset。(这里window协议实现与Linux有所不同,这里仅讨论Linux)。当攻击者发送大量的syn_ack进行攻击时,服务器将会为处理这些报文而消耗大量的资源。  也许你发现这里可能还有另一种潜在的危害,就是当服务器主动外联时,发送完syn,等待synack包时,收到了攻击者发送的synack报文而导致,连接建立失败。其实严格意义上说这种情况是存在的。可这种情形发送在攻击的报文五元组匹配并且seq-ack也正确匹配的情况。概率极低,忽略不计。 

Syn_Ack Flood 防御:
如果服务器没有主动发起连接的需求,直接将所以syn_ack包丢弃即可。
如果有对外连接的需求,则可利用源认证的方式防御,具体防护原理为: 向syn_ack的源IP,端口发送syn报文,能在固定时间内返回,并且序列号匹配则说明该IP,端口确实提高了服务,加入白名单。多次未防护的加入黑名单。 
Ack Flood 攻击:
ACK Flood攻击是在TCP连接建立之后,所有的数据传输TCP报文都是带有ACK标志位的,主机在接收到一个带有ACK标志位的数据包的时候,需要检查该数据包所表示的连接四元组是否存在,如果存在则检查该数据包所表示的状态是否合法,然后再向应用层传递该数据包。如果在检查中发现该数据包不合法,例如该数据包所指向的目的端口在本机并未开放,则主机操作系统协议栈会回应RST包告诉对方此端口不存在。

这里,服务器要做两个动作:查表、回应ACK/RST。这种攻击方式显然没有SYN Flood给服务器带来的冲击大,因此攻击者一定要用大流量ACK小包冲击才会对服务器造成影响。按照我们对TCP协议的理解,随机源IP的ACK小包应该会被Server很快丢弃,因为在服务器的TCP堆栈中没有这些ACK包的状态信息。

如果没有开放端口,服务器将直接丢弃,这将会耗费服务器的CPU资源。如果端口开放,服务器回应RST。

可以肯定的是,ACK Flood不但可以危害路由器等网络设备,而且对服务器上的应用有不小的影响。

Ack Flood 防御:
利用对称性判断来分析出是否有攻击存在。所谓对称型判断,就是收包异常大于发包,因为攻击者通常会采用大量ACK包,并且为了提高攻击速度,一般采用内容基本一致的小包发送,这可以作为判断是否发生ACK Flood的依据。

但是目前已知情况来看,很少有单纯使用ACK Flood攻击,都会和其他攻击方法混合使用,因此,很容易产生误判。

一些防火墙应对的方法是:建立一个hash表,用来存放TCP连接“状态”,相对于主机的TCP stack实现来说,状态检查的过程相对简化。例如,不作sequence number的检查,不作包乱序的处理,只是统计一定时间内是否有ACK包在该“连接”(即四元组)上通过,从而“大致”确定该“连接”是否是“活动的”。

其他 Flood 攻击与防御
主要的攻击原理都为利用大量的无效数据包,消耗服务器资源。由于攻击报文命中五元组和序列号的概率极低,所以对正常连接破坏有限(服务器资源充足的情况下)。  

针对这些类型的攻击的处理方式也正是利用上面的特点。在连接建立的时候,利用syn_reset ,syn_cookie认证,认证通过之后,为每个tcp连接建立一个会话,保存五元组和序列号信息,只有匹配的包才转发到服务器,不匹配的丢弃。
TCP

c(syn-send) > syn=2550 > s

c < syn=6500 ack=2551 < s

c > ack=6501 > s

# tcp三次握手
(1)第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 
SYN:同步序列编号(Synchronize Sequence Numbers)
(2)第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 
(3)第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手.
完成三次握手,客户端与服务器开始传送数据

# tcp四次挥手
        由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

什么是ddos攻击

全称Distributed Denial of Service,中文意思为“分布式拒绝服务”,利用大量合法的分布式服务器对目标发送请求,从而导致正常合法用户无法获得服务。通俗点讲就是利用网络节点资源如:IDC服务器、个人PC、手机、智能设备、打印机、摄像头等对目标发起大量攻击请求,从而导致服务器拥塞而无法对外提供正常服务

DDOS可怕之处

        黑客为什么选择ddos攻击,因为这种攻击方式与其他的渗透,数据篡改等不同,这种攻击方式简单粗暴,可以达到直接摧毁目标的目的,而且此种攻击方式成本极低,只需要购买部分服务器或使用肉鸡的方式即可快速的发动攻击,另一方面,DDoS具有攻击易防守难的特征,服务提供商为了保证正常客户的需求需要耗费大量的资源才能和攻击发起方进行对抗。
        DDoS虽然可以侵蚀带宽或资源,迫使服务中断,但这远远不是黑客的正真目的。所谓没有买卖就没有杀害,DDoS只是黑客手中的一枚核武器,他们的目的要么是敲诈勒索、要么是商业竞争、要么是要表达政治立场。在这种黑色利益的驱使下,越来越多的人参与到这个行业并对攻击手段进行改进升级,致使DDoS在互联网行业愈演愈烈,并成为全球范围内无法攻克的一个顽疾。

DDOS攻击方式

    利用TCP/IP协议握手缺陷消耗服务端的链接资源,可以利用UDP协议无状态的机制伪造大量的UDP数据包阻塞通信信道

#资源消耗型
    资源消耗类是比较典型的DDoS攻击,最具代表性的包括:Syn Flood、Ack Flood、UDP
Flood。这类攻击的目标很简单,就是通过大量请求消耗正常的带宽和协议栈处理资源的能力,从而达到服务端无法正常工作的目的。

#服务消耗型
    相比资源消耗类攻击,服务消耗类攻击不需要太大的流量,它主要是针对服务的特点进行精确定点打击,如web的CC,数据服务的检索,文件服务的下载等。这类攻击往往不是为了拥塞流量通道或协议处理通道,它们是让服务端始终处理高消耗型的业务的忙碌状态,进而无法对正常业务进行响应

img

反射攻击也叫放大攻击,该类攻击以UDP协议为主,一般请求回应的流量远远大于请求本身流量的大小。攻击者通过流量被放大的特点以较小的流量带宽就可以制造出大规模的流量源,从而对目标发起攻击。反射类攻击严格意义上来说不算是攻击的一种,它只是利用某些服务的业务特征来实现用更小的代价发动Flood攻击,

img

DDOS 防护手段

资源隔离
    资源隔离可以看作是用户服务的一堵防护盾,这套防护系统拥有无比强大的数据和流量处理能力,为用户过滤异常的流量和请求。如:针对Syn Flood,防护盾会响应Syn Cookie或Syn Reset认证,通过对数据源的认证,过滤伪造源数据包或发动的攻击,保护服务端不受恶意连接的侵蚀。资源隔离系统主要针对ISO模型的第三层和第四层进行防护。资源隔离示意图如下:

img

用户规则
    从服务的角度来说DDoS防护本质上是一场以用户为主体依赖抗D防护系统与黑客进行较量的战争,在整个数据对抗的过程中服务提供者往往具有绝对的主动权,用户可以基于抗D系统特定的规则,如:流量类型、请求频率、数据包特征、正常业务之间的延时间隔等。基于这些规则用户可以在满足正常服务本身的前提下更好地对抗七层类的DDoS,并减少服务端的资源开销。

img

大数据智能分析
    黑客为了构造大量的数据流,往往需要通过特定的工具来构造请求数据,这些数据包不具有正常用户的一些行为和特征。为了对抗这种攻击,可以基于对海量数据进行分析,进而对合法用户进行模型化,并利用这些指纹特征,如:Http模型特征、数据来源、请求源等,有效地对请求源进行白名单过滤,从而实现对DDoS流量的精确清洗。

img

资源对抗
资源对抗也叫“死扛”,即通过大量服务器和带宽资源的堆砌达到从容应对DDoS流量的效果

CC攻击和DDOS攻击的区别

CC攻击和ddos的区别是什么?DDoS全称:分布式拒绝服务(Distributed Denial of Service)。该攻击方式利用目标系统网络服务功能缺陷或者直接消耗其系统资源,使得该目标系统无法提供正常的服务。

攻击者进行拒绝服务攻击,实际上让服务器实现两种效果:一是迫使服务器的缓冲区满,不接收新的请求;二是使用IP欺骗,迫使服务器把合法用户的连接复位,影响合法用户的连接。

CC攻击全称 Challenge Collapsar,中文意思是挑战黑洞,因为以前的抵抗DDoS攻击的安全设备叫黑洞,顾名思义挑战黑洞就是说黑洞拿这种攻击没办法。CC攻击的原理是通过代理服务器或者大量肉鸡模拟多个用户访问目标网站的动态页面,制造大量的后台数据库查询动作,消耗目标CPU资源,造成拒绝服务。

CC攻击本身的请求就是正常的请求。我们都知道网站的页面有静态和动态之分,动态网页是需要与后台数据库进行交互的。

DDoS和CC攻击的区别

DDoS攻击打的是网站的服务器,而CC攻击是针对网站的页面攻击的,用术语来说就是,一个是WEB网络层拒绝服务攻击(DDoS),一个是WEB应用层拒绝服务攻击(CC)。

网络层就是利用肉鸡的流量去攻击目标网站的服务器,针对比较本源的东西去攻击,服务器瘫痪了,那么运行在服务器上的网站肯定也不能正常访问了。

而应用层就是我们用户看得到的东西,就比如说网页,CC攻击就是针对网页来攻击的,CC攻击本身是正常请求,网站动态页面的正常请求也会和数据库进行交互的,当这种”正常请求”达到一种程度的时候,服务器就会响应不过来,从而崩溃。

TCP三次握手、四次挥手

三次握手

序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。

确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。

确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效

同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。

终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接

PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。
第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

四次挥手

- step1. 主机A向主机B发起断开连接请求,之后主机A进入FIN-WAIT-1状态;
- step2. 主机B收到主机A的请求后,向主机A发回确认,然后进入CLOSE-WAIT状态;
- step3. 主机A收到B的确认之后,进入FIN-WAIT-2状态,此时便是半关闭状态,即主机A失去发送能力,但是主机B却还能向A发送数据,并且A可以接收数据。此时主机B占主导位置了,如果需要继续关闭则需要主机B来操作了;
- step4. 主机B向A发出断开连接请求,然后进入LAST-ACK状态;
- step5. 主机A接收到请求后发送确认,进入TIME-WAIT状态,等待2MSL之后进入CLOSED状态,而主机B则在接受到确认后进入CLOSED状态;

问题

1、为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

2、为什么不能用两次握手进行连接?

        3次握手完成两个重要的功能,既要双方做好发送数据的准备工作,也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
        现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

3、如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time

抓包分析

网络抓包分析

1,网络抓包介绍

1、Tcpdump简介

tcpdump 命令是基于unix系统的命令行的数据报嗅探工具,可以抓取流动在网卡上的数据包。它的原理大概如下:linux 抓包是通过注册一种虚拟的底层网络协议来完成对网络报文(准确的是网络设备)消息的处理权。当网卡接收到一个网络报文之后,它会遍历系统中所有已经注册的网络协议,如以太网协议、x25协议处理模块来尝试进行报文的解析处理。当抓包模块把自己伪装成一个网络协议的时候,系统在收到报文的时候就会给这个伪协议一次机会,让它对网卡收到的包进行一次处理,此时该模块就会趁机对报文进行窥探,也就是将报文完完整整的复制一份,假装是自己接收的报文,汇报给抓包模块。

2、Wireshark 简介

Wireshark 是一个网络协议检测工具,支持Windows平台、Unix平台、Mac平台,一般只在图形界面平台下使用Wireshark,如果是Linux的话,直接使用 tcpdump了,因为一般而言 Linux 都自带的 tcpdump,或者用 tcpdump 抓包以后用 Wireshark 打开分析。

在Mac平台下,Wireshark 通过 WinPcap 进行抓包,封装的很好,使用起来很方便,可以很容易的制定抓包过滤器或者显示过滤器,具体简单使用下面会介绍。Wireshark是一个免费的工具。

所以,tcpdump是用来抓取数据非常方便,Wireshark则是用于分析抓取到的数据比较方便。

2、Tcpdump 语法

1、查看本地网卡状态

[root@qfedu.com ~]# netstat -i
Kernel Interface table
Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
docker0   1500    40409      0      0 0         20376      0      0      0 BMU
eth0      1500 22999894941      0      0 0      25581016784      0      0      0 BMRU
lo        65536 850291094      0      0 0       850291094      0      0      0 LRU
  • Iface:存在的网卡。

  • MTU:最大传输单元。

  • RX-OK RX-ERR RX-DRP RX-OVR:正确接收数据报的数量以及发生错误、流式、碰撞的总数。

  • TX-OK TX-ERR TX-DRP TX-OVR:正确发送数据报的数量以及发生错误、流式、碰撞的总数。

    [root@qfedu.com ~]# tcpdump --help
    tcpdump version 4.9.0
    libpcap version 1.5.3
    OpenSSL 1.0.1e-fips 11 Feb 2013
    Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
    [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
    [ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
    [ -Q|-P in|out|inout ]
    [ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
    [ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
    [ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
    [ -Z user ] [ expression ]

2、 Tcpdump 抓包分类

1、类型的关键字
  • host:指明一台主机。如:host 192.168.152.110
  • net:指明一个网络地址,如:net 192.168.152.0
  • port:指明端口号:如:port 8090
2、确定方向的关键字
  • src:ip包的源地址,如:src 192.168.152.110
  • dst:ip包的目标地址。如:dst 192.168.152.110
3、协议的关键字(缺省是所有协议的信息包)
  • fddi、ip、arp、rarp、tcp、udp。
4、其它关键字
  • gateway、broadcast、less、greater。
5、常用表达式
  • ! or not
  • && or and
  • || or or

3、Tcpdump 参数详解

  • A:以ascii编码打印每个报文(不包括链路的头)。
  • a:将网络地址和广播地址转变成名字。
  • c:抓取指定数目的包。
  • C:用于判断用 -w 选项将报文写入的文件的大小是否超过这个值,如果超过了就新建文件(文件名后缀是1、2、3依次增加);
  • d:将匹配信息包的代码以人们能够理解的汇编格式给出;
  • dd:将匹配信息包的代码以c语言程序段的格式给出;
  • ddd:将匹配信息包的代码以十进制的形式给出;
  • D:列出当前主机的所有网卡编号和名称,可以用于选项 -i;
  • e:在输出行打印出数据链路层的头部信息;
  • f:将外部的Internet地址以数字的形式打印出来;
  • F<表达文件>:从指定的文件中读取表达式,忽略其它的表达式;
  • i<网络界面>:监听主机的该网卡上的数据流,如果没有指定,就会使用最小网卡编号的网卡(在选项-D可知道,但是不包括环路接口),linux 2.2 内核及之后的版本支持 any 网卡,用于指代任意网卡
  • l:如果没有使用 -w 选项,就可以将报文打印到 标准输出终端(此时这是默认);
  • n:显示ip,而不是主机名
  • nn:显示port,而不是服务名
  • N:不列出域名;
  • O:不将数据包编码最佳化;
  • p:不让网络界面进入混杂模式;
  • q:快速输出,仅列出少数的传输协议信息;
  • r<数据包文件>:从指定的文件中读取包(这些包一般通过-w选项产生);
  • s<数据包大小>:指定抓包显示一行的宽度,-s0表示可按包长显示完整的包,经常和-A一起用,默认截取长度为60个字节,但一般ethernet MTU都是1500字节。所以,要抓取大于60字节的包时,使用默认参数就会导致包数据丢失;
  • S:用绝对而非相对数值列出TCP关联数;
  • t:在输出的每一行不打印时间戳;
  • tt:在输出的每一行显示未经格式化的时间戳记;
  • T<数据包类型>:将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议);
  • v:输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息
  • vv:输出详细的报文信息
  • x/-xx/-X/-XX:以十六进制显示包内容,几个选项只有细微的差别,详见man手册;
  • w<数据包文件>:直接将包写入文件中,并不分析和打印出来;
  • expression:用于筛选的逻辑表达式;

4、Tcpdump 参数含义

[root@qfedu.com ~]# tcpdump host 192.168.152.110 -i eth0 -c 10 -l -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens5f0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:59:51.071567 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 1715331653:1715331865, ack 2259278754, win 65535, length 212
10:59:51.071699 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 212:408, ack 1, win 65535, length 196
10:59:51.071794 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 408:572, ack 1, win 65535, length 164
10:59:51.071861 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 572:736, ack 1, win 65535, length 164
10:59:51.071910 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 736:900, ack 1, win 65535, length 164
10:59:51.071958 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 900:1064, ack 1, win 65535, length 164
10:59:51.072006 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 1064:1228, ack 1, win 65535, length 164
10:59:51.072053 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 1228:1392, ack 1, win 65535, length 164
10:59:51.072141 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 1392:1556, ack 1, win 65535, length 164
10:59:51.077438 IP 192.168.152.110.7608 > 10.1.87.25.ssh: Flags [.], ack 212, win 63360, length 0
10 packets captured
13 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 ens5f0, link-type EN10MB (Ethernet), capture size 262144 bytes`,说明监听的是`ens5f0`这个NIC设备的网络包,且它的链路层是基于以太网的,要抓的包大小限制`262144`,装包大小限制可以用利用`-s`来控制。

3、第三行:`10:59:51.071567 IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 1715331653:1715331865, ack 2259278754, win 65535, length 212`。

- `10:59:51.071567`:抓包时间为时、分、秒、微妙。
- `IP 192.168.152.21.ssh > 192.168.152.110.7608: Flags [P.], seq 1715331653:1715331865, ack 2259278754, win 65535, length 212`,这里用`man dump`这个命令引用说明:

上面视图简单的解释就是该包`192.168.152.21`传到`192.168.152.110`,通过的端口是`22`(ssh的端口)向`7608`,前几个是使用的是`PUSH`的标识,最后一个是返回的`ACK`标识。

5、Tcpdump 命令实践

1、直接启动tcpdump,将抓取所有经过第一个网络接口上的数据包

[root@qfedu.com ~]# tcpdump

2、抓取所有经过指定网络接口上的数据包

[root@qfedu.com ~]# tcpdump -i eth0

3、抓取所有经过 eth0,目的或源地址是 192.168.152.255 的网络数据:

[root@qfedu.com ~]# tcpdump -i eth0 host 192.168.152.100

4、抓取主机192.168.152.255和主机192.168.152.61或192.168.152.95的通信:

[root@qfedu.com ~]# tcpdump host 192.168.152.100 and 192.168.152.101  (或者用 or) 

5、抓取主机192.168.1523.210除了和主机192.168.152.61之外所有主机通信的数据包:

[root@qfedu.com ~]# tcpdump -n host 192.168.152.100 and ! 192.168.152.101

6、抓取主机192.168.152.255除了和主机192.168.152.61之外所有主机通信的ip包

[root@qfedu.com ~]# tcpdump ip -n host 192.168.152.100 and ! 192.168.152.101

7、抓取主机192.168.152.3发送的所有数据:

[root@qfedu.com ~]# tcpdump -i eth0 src host 192.168.152.100 (注意数据流向)

8、抓取主机192.168.152.3接收的所有数据:

[root@qfedu.com ~]# tcpdump -i eth0 dst host 192.168.152.100 (注意数据流向)

9、抓取主机192.168.152.3所有在TCP 80端口的数据包:

[root@qfedu.com ~]# tcpdump -i eth0 host 192.168.152.3 and tcp port 80

10、抓取HTTP主机192.168.152.3在80端口接收到的数据包:

[root@qfedu.com ~]# tcpdump -i eth0 host 192.168.152.3 and dst port 80

11、抓取所有经过 eth0,目的或源端口是 25 的网络数据

[root@qfedu.com ~]# tcpdump -i eth0 port 25
#源端口
[root@qfedu.com ~]# tcpdump -i eth0 src port 25
#目的端口
[root@qfedu.com ~]# tcpdump -i eth0 dst port 25 # 网络过滤

12、抓取所有经过 eth0,网络是 192.168上的数据包

[root@qfedu.com ~]# tcpdump-i eth0 net 192.168
[root@qfedu.com ~]# tcpdump -i enh0 src net 192.168
[root@qfedu.com ~]# tcpdump -i eth0 dst net 192.168 
[root@qfedu.com ~]# tcpdump-i eth0 net 192.168.152
[root@qfedu.com ~]# tcpdump -i eth0 net 192.168.152.0/24

13、协议过滤

[root@qfedu.com ~]# tcpdump -i eth0 arp
[root@qfedu.com ~]# tcpdump-i eth0 ip
[root@qfedu.com ~]# tcpdump -i eth0 
[root@qfedu.com ~]# tcptcpdump -i eth0 udp
[root@qfedu.com ~]# tcpdump -i eth0 icmp

14、抓取所有经过 eth0,目的地址是 192.168.152.254 或 192.168.152.200 端口是 80 的 TCP 数据

[root@qfedu.com ~]# tcpdump -i eth0 '((tcp) and (port 80) and ((dst host 192.168.152.254) or (dst host 192.168.152.200)))

15、抓取所有经过 eth0,目标 MAC 地址是 00:01:02:03:04:05 的 ICMP 数据

[root@qfedu.com ~]# tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))

16、抓取所有经过 eth0,目的网络是 192.168,但目的主机不是 192.168.152.200 的 TCP 数据

[root@qfedu.com ~]# tcpdump -i eth0 '((tcp) and ((dst net 192.168) and (not dst host 192.168.152.200)))'

17、只抓 SYN 包

[root@qfedu.com ~]# tcpdump -i eth0 'tcp[tcpflags] =tcp-syn

18、抓 SYN, ACK

[root@qfedu.com ~]# tcpdump -i eth0 'tcp[tcpflags]'

19、抓 SMTP 数据,抓取数据区开始为”MAIL”的包,”MAIL”的十六进制为 0x4d41494c

[root@qfedu.com ~]# tcpdump -i eth0 '((port 25) and (tcp[(tcp[12]>>2):4] = 0x4d41494c))'

20、抓 HTTP GET 数据,”GET “的十六进制是 0x47455420

[root@qfedu.com ~]# tcpdump -i eth0 'tcp[(tcp[12]>x2):4] =0x47455429'
# 0x4745为"GET"前两个字母"GE",0x4854为"HTTP"前两个字母"HT"
[root@qfedu.com ~]# tcpdump -XvvennSs 0 -i eth0  tcp[20:2]=0x4745 or tcp[20:2]=0x4854

21、抓 SSH 返回,”SSH-“的十六进制是 0x5353482D

[root@qfedu.com ~]# tcpdump -i eth0 'tcp[(tcp[12]2):4]-0x5353482D'
# 抓老版本的SSH返回信息,如"SSH-1.99.."
[root@qfedu.com ~]# tcpdump -i eth0 (tcp (tcp[12]>>2):4] = 0x5353482D) and (tcp[((tcp[12]>2)+4):2] = 0x312E3)'

22、高级包头过滤如前两个的包头过滤,首先了解如何从包头过滤信息:

proto[x:y]  # :过滤从x字节开始的y字节数。比如ip[2:2]过滤出3、4字节(第二字专从研始排)
操作符: >, =,
抓取端口大于1024的TCP数据包
[root@qfedu.com ~]# tcpdump -i eth0 'tcp[0:2] > 1024‘

23、抓 DNS 请求数据

[root@qfedu.com ~]# tcpdump -i eth0 udp dst port 53

24、其他-c 参数对于运维人员来说也比较常用,因为流量比较大的服务器,靠人工 CTRL+C 还是抓的太多,于是可以用-c 参数指定抓多少个包。

[root@qfedu.com ~]# time tcpdump -nn -i eth0 'tcp[tcpflags] = tcp-syn' -C 10000 > /dev/null
上面的命令计算抓10000个SYN包花费多少时间,可以判断访问量大概是多少。实时抓取端口号8000的GET包,然后写入GET.log
[root@qfedu.com ~]# tcpdump -i eth0 '((port 8000) and (tcp[(tcp[12]>>2):4]=0x47455420))' -nnAL -w /tmp/GET.log

6、Tcpdump 抓包示例

想抓取访问某个网站时的网络数据。比如网站 http://www.baidu.com/ 怎么做?

1、通过tcpdump截获主机 www.baidu.com 发送与接收所有的数据包

[root@qfedu.com ~]# tcpdump -i eth0 host www.baidu.com

2、访问这个网站

[root@qfedu.com ~]# wget www.baidu.cn
查看控制台输出
确认序列号ack为何是1。这是相对值,如何显示绝对值
[root@qfedu.com ~]# tcpdump -S -i eth0 host www.baidu.com
[root@qfedu.com ~]# wget www.baidu.com
再次查看控制输出

3、想要看到详细的http报文。怎么做?

[root@qfedu.com ~]# tcpdump -A -i eth0 host www.baidu.com
将抓取的结果存到文件,比如文件file1
[root@qfedu.com ~]# tcpdump -A -i eth0 -w filel host www.baidu.com
如何读取这个文件的基本信息 
[root@qfedu.com ~]# tcpdump -r filel
想要了解更多,比如上面的http报文 
[root@qfedu.com ~]# tcpdump -A -r filel
也同时想要将确认序列号ack打印成绝对值 
[root@qfedu.com ~]# tcpdump -AS -r filel
注:无参数的选项比如-A,-S,-e,等。均可以共用一个减号 'src host www.baidu.cn' 属于expression ,如果太长,可以用单引号括起来:
[root@qfedu.com ~]# tcpdump -i eth0 'src host www. baidu.com'

4、分析抓取到的报文

16:50:11.916308 IP 192.168.152.3.52346 > 61.135.169.121.http: Flags [P.], seq 1888894293:1888894434, ack 2526934942, win 8192, Length 14 1: HTTP: GET/ HTTP/1.1

第一列是时间戳:时、分、秒、微秒
第二列是网际网路协议的名称
第三列是报文发送方的十进制的网际网路协议地址,以及紧跟其后的端口号(偶尔会是某个协议名如http,如果在此处仍然显示端口号加上-n选项
第四列是大于号
第五列是报文接收方的十进制的网际网路协议地址,以及紧跟其后的端口号(偶尔会是某个协议名如http,如果在此处仍然显示端口号加上-n选项)
第六列是冒号第七列是Flags标识,可能的取值是[S.] [] [P.] [F.]
第八、九、.…列是tcp协议报文头的一些变量值:
seq是请求同步的序列号
ack是已经同步的序列号
win是当前可用窗口大小
length是tcp协议报文体的长度
如果加入了-5选项,会看到的seg, ack是两个冒号分割的值,分别表示变更前后的值。