zoukankan      html  css  js  c++  java
  • 【转】Linux下从TCP状态机,三次握手判断DDOS攻击

    从TCP状态机判断DDOS攻击

    一、TCP协议

    TCP 协议是传送层的核心协议,提供了可靠面向连接的协议,分为三次握手和四次断开,在这个过程中TCP有个状态机,记录不同阶段的状态。

    二、 TCP握手和断开

    这里不着重介绍三次握手和四次断开,只是附加一个图解,这部分详细内容大家自行脑补:参考链接:https://blog.csdn.net/qzcsu/article/details/72861891

    2.1 握手协议:

    从TCP状态机判断DDOS攻击

    2.2 断开过程

    从TCP状态机判断DDOS攻击

    三、TCP的状态机

    在协议建立和断开过程,tcp协议一直要维护一个状态,我们称为tcp的状态机。具体情况见下图:

    从TCP状态机判断DDOS攻击

    3.1 握手过程状态

    • CLOSED: 表示初始状态。
    • LISTEN: 侦听端口状态
    • SYN_RCVD: 表示接受到了SYN报文,时间短暂
    • SYN_SENT: 表示发送一个SYN的报文
    • ESTABLISHED:表示连接已经建立了,是一个稳定状态。

    为了方便理解,简单举个例子,某饭店8点之前是未开业,关门状态(closed 状态),八点之后开门营业,等待客人关顾(listen状态),客户进店点菜(SYS_SEND),老板收到并确认(SYS_RCVD), 客户说没错可以上菜,然后双方进入(Established)状态。

    3.2 断开过程状态

    • FIN WAIT 1:本地的 TCP 实体发送一个 FIN 报文段并等待响应的确认
    • CLOSE WAIT:服务器收到一个 FIN 报文段,它确认客户端的请求发回一个 ACK 报文段
    • FIN WAIT 2 :客户端收到确认 ACK 报文段,就转移到 FIN WAIT 2 状态
    • CLOSED:服务器收到最后一个确认 ACK 报文段,其 TCP 实体便释放该连接,并删除连接记录

    形象理解为:客人吃饭要离开,喊老板结账(fin wait1), 老板说你等一下我找你钱(closeing),客户收到检查是否正确(fin wait2),确认无误然后彼此断开(closed)

    四、半打开和半关闭

    DDOS网络攻击的方式很多,有应用层ddos也有网络层的,本文只讨论网络层形成的ddos攻击类型,上文我们讲述状态机,就非常好理解了,大量的半打开的链接,占用了大量的网络带宽,从而达到了DOS的目的。

    4.1 半打开

    发生在TCP3次握手中。

    如果A向B发起TCP请求,B也按照正常情况进行响应了,但是A不进行第3次握手,这就是半连接

    4.2半关闭

    当一方关闭发送通道后,仍可接受另一方发送过来的数据,这样的情况叫“半关闭”。(拆除TCP连接是:你关闭你的发送通道,我关闭我的发送通道)。

    五、Netstat DOS检测

    netstat -na

    显示所有连接到服务器的活跃的网络连接

    netstat -an | grep :80 | sort

    只显示连接到80段口的活跃的网络连接,80是http端口,这对于web服务器非常有用,并且对结果排序.对于你从许多的连接中找出单个发动洪水攻击IP非常有用

    netstat -n -p|grep SYN_REC | wc -l

    这个命令对于在服务器上找出活跃的SYNC_REC非常有用,数量应该很低,最好少于5.

    在dos攻击和邮件炸弹,这个数字可能非常高.然而值通常依赖于系统,所以高的值可能平分给另外的服务器.

    netstat -n -p | grep SYN_REC | sort -u

    列出所有包含的IP地址而不仅仅是计数.

    netstat -n -p | grep SYN_REC | awk '{print $5}' | awk -F: '{print $1}'

    列出所有不同的IP地址节点发送SYN_REC的连接状态

    netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

    使用netstat命令来计算每个IP地址对服务器的连接数量

    netstat -anp |grep 'tcp|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

    列出使用tcp和udp连接到服务器的数目

    netstat -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr

    检查ESTABLISHED连接而不是所有连接,这可以每个ip的连接数

    netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1

    显示并且列出连接到80端口IP地址和连接数.80被用来作为HTTP

  • 相关阅读:
    如何动态确定命名空间
    五种提高 SQL 性能的方法
    无意间发现收藏夹的秘密(^_^,也许大家早就知道了?)
    每个开发人员现在应该下载的十种必备工具,这个是中文的哦
    一个让我狂晕的异常及例行xiao总结
    几个开源项目实体层实现方式比较
    线程池在web上的简单应用
    不为"事务"而"事务"
    构造函数,静态构造函数与继承链
    小Tips两则
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9569111.html
Copyright © 2011-2022 走看看