系统内核相关参数调优(四)

简介: 【4月更文挑战第7天】SYN洪水攻击是一种利用TCP/IP协议的三次握手原理发起的DDoS攻击,攻击者发送大量伪造的SYN连接请求,导致服务器的连接队列被占满,无法处理正常用户的请求。

1  SYN洪水攻击

SYN攻击是利用TCP/IP协议3次握手的原理,发送大量的建立连接的网络包,但不实际建立连接,最终导致被攻击服务器的网络队列被占满,无法被正常用户访问。

原理图:

image.png

SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,常用假冒的IP或IP号段发来海量请求连接的第一个握手包(SYN包),被攻击服务器回应第二个握手包(SYN+ACK包),因为对方是假冒IP,对方永远收不到包且不会回应第三个握手包。导致被攻击服务器保持大量SYN_RECV状态的“半连接”,并且会重试默认5次回应第二个握手包,塞满TCP等待连接队列,资源耗尽(CPU满负荷或内存不足),让正常的业务请求连接不进来。

解决:

[root@xucccc ~]# vim /etc/sysctl.conf  #在文件最后添加以下内容

net.ipv4.tcp_synack_retries = 0

net.ipv4.tcp_syn_retries = 1

net.ipv4.tcp_max_syn_backlog = 20480

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_fin_timeout = 10

fs.file-max = 819200

net.core.somaxconn = 65535

net.core.rmem_max = 1024123000

net.core.wmem_max = 16777216

net.core.netdev_max_backlog = 165536

net.ipv4.ip_local_port_range = 10000 65535

注:每台服务器上线之前,都应该配置以上内核参数。

2  内核重要参数解说

 [root@xucccc ~]# cat /proc/sys/net/ipv4/tcp_synack_retries  #最关键参数,默认为5,修改为0 表示不要重发

net.ipv4.tcp_synack_retries = 0

#表示回应第二个握手包(SYN+ACK包)给客户端IP后,如果收不到第三次握手包(ACK包)后,不进行重试,加快回收“半连接”,不要耗光资源。

#作为服务端。回应时,如果连接失败,达到对应的失败数后,停止发送synack包

第一个参数tcp_synack_retries = 0是关键,表示回应第二个握手包(SYN+ACK包)给客户端IP后,如果收不到第三次握手包(ACK包)后,不进行重试,加快回收“半连接”,不要耗光资源。

不修改这个参数,模拟攻击,10秒后被攻击的80端口即无法服务,机器难以ssh登录; 用命令netstat -na |grep SYN_RECV检测“半连接”hold住180秒;

修改这个参数为0,再模拟攻击,持续10分钟后被攻击的80端口都可以服务,响应稍慢些而已,只是ssh有时也登录不上;检测“半连接”只hold住3秒即释放掉。

修改这个参数为0的副作用:网络状况很差时,如果对方没收到第二个握手包,可能连接服务器失败,但对于一般网站,用户刷新一次页面即可。这些可以在高峰期或网络状况不好时tcpdump抓包验证下。

根据以前的抓包经验,这种情况很少,但为了保险起见,可以只在被tcp洪水攻击时临时启用这个参数。

tcp_synack_retries默认为5,表示重发5次,每次等待30~40秒,即“半连接”默认hold住大约180秒。

我们之所以可以把tcp_synack_retries改为0,因为客户端还有tcp_syn_retries参数,默认是5,即使服务器端没有重发SYN+ACK包,客户端也会重发SYN握手包。

[root@xucccc ~]# cat /proc/sys/net/ipv4/tcp_syn_retries  

1

#tcp_syn_retries参数,默认是5,当没有收到服务器端SYN+ACK包,客户端重发SYN握手包的次数

 [root@xucccc ~]# cat /proc/sys/net/ipv4/tcp_max_syn_backlog

20480

##半连接队列长度,增加SYN队列长度到2048:加大SYN队列长度可以容纳更多等待连接的网络连接数具体多少数值受限于内存。

3  辅助参数

#系统允许的文件句柄的最大数目,因为连接需要占用文件句柄

fs.file-max = 819200

#用来应对突发的大并发connect 请求

net.core.somaxconn = 65535

#最大的TCP 数据接收缓冲(字节)

net.core.rmem_max = 1024123000

#最大的TCP 数据发送缓冲(字节)

net.core.wmem_max = 16777216

#网络设备接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目

net.core.netdev_max_backlog = 165536

#本机主动连接其他机器时的端口分配范围,比如说,在vsftpd主动模式会用到

net.ipv4.ip_local_port_range = 10000 65535

注:如果只是开启22端口,是不会使用到ip_local_port_range这个功能

[root@xucccc ~]# netstat -antup | grep :22

tcp        0      0 0.0.0.0:22         0.0.0.0:*          LISTEN      1993/sshd          

tcp        0      0 192.168.1.63:22   192.168.1.23:51855   ESTABLISHED 9316/sshd          

tcp        0      0 192.168.1.63:22   192.168.1.23:51861   ESTABLISHED 10878/sshd          

为了处理大量连接,还需改大另外两个参数:
限制用户资源配置文件:/etc/security/limits.conf

[root@xucccc ~]#vim /etc/security/limits.conf   #在最添加

*               soft   nofile            1024000

*               hard   nofile           1024000

例2:nproc  #用户可以打开的最大进程数

[root@xucccc ~]# vim /etc/security/limits.d/90-nproc.conf    #RHEL6 必须这个文件中配置

改:

*          soft    nproc     10240

为:

*          soft    nproc     66666

*          hard    nproc     66666 

[root@xucccc ~]# reboot    #最好重启一下

4  次要辅助参数

以上还无法解决syn洪水攻击,把以下内核参数关闭:

注意,以下参数面对外网时,不要打开。因为副作用很明显

#当出现 半连接 队列溢出时向对方发送syncookies,调大 半连接 队列后没必要

net.ipv4.tcp_syncookies = 0

#TIME_WAIT状态的连接重用功能

net.ipv4.tcp_tw_reuse = 0

#时间戳选项,与前面net.ipv4.tcp_tw_reuse参数配合

net.ipv4.tcp_timestamps = 0

#TIME_WAIT状态的连接回收功能

net.ipv4.tcp_tw_recycle = 0

[root@xucccc ~]# cat /proc/sys/net/ipv4/tcp_syncookies

1

#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

[root@xucccc ~]# cat /proc/sys/net/ipv4/tcp_tw_reuse

1

#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭,现在开启,改为1

[root@xucccc ~]# cat /proc/sys/net/ipv4/tcp_tw_recycle

1

#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。现在改为1,表示开启

[root@xucccc ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout

30

#默认值是 60,对于本端断开的socket连接,TCP保持在FIN_WAIT_2状态的时间。

 


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
6月前
|
缓存 运维 Linux
Linux系统调优详解(一)——系统调优概述与Top命令详解
Linux系统调优详解(一)——系统调优概述与Top命令详解
122 4
|
16天前
|
机器学习/深度学习 负载均衡 算法
深入探索Linux内核调度机制的优化策略###
本文旨在为读者揭开Linux操作系统中至关重要的一环——CPU调度机制的神秘面纱。通过深入浅出地解析其工作原理,并探讨一系列创新优化策略,本文不仅增强了技术爱好者的理论知识,更为系统管理员和软件开发者提供了实用的性能调优指南,旨在促进系统的高效运行与资源利用最大化。 ###
|
6月前
|
存储 缓存 运维
Linux系统调优详解(四)——内存状态查看命令
Linux系统调优详解(四)——内存状态查看命令
126 7
|
6月前
|
运维 监控 Linux
提升系统稳定性:Linux内核参数调优实战
【5月更文挑战第1天】 在运维领域,保障服务器的高效稳定运行是核心任务之一。Linux操作系统因其开源、可靠和灵活的特点被广泛应用于服务器中。本文将深入探讨通过调整Linux内核参数来优化系统性能,提升服务器的稳定性和响应能力。文章首先介绍了内核参数调优的必要性和基本原则,然后详细阐述了调优过程中的关键步骤,包括如何监控当前系统状态,确定性能瓶颈,选择合适的参数进行调优,以及调优后的测试与验证。最后,文中提供了一些常见问题的解决策略和调优的最佳实践。
490 5
|
6月前
|
弹性计算 网络协议 Linux
自动优化 Linux 内核参数
【4月更文挑战第28天】
101 0
|
6月前
|
缓存 运维 Linux
inux系统调优详解(八)——vmstat查看系统整体运行状态
inux系统调优详解(八)——vmstat查看系统整体运行状态
55 3
|
安全 Linux 芯片
很有用的速度优化:让系统启动速度更快
很有用的速度优化:让系统启动速度更快
|
网络安全
服务器初始化及内核调优脚本
服务器初始化及内核调优脚本
|
网络协议 Linux 应用服务中间件
Linux Linux内核参数调优
Linux Linux内核参数调优
277 0
|
安全 Java Linux
系统资源调优与内核参数配置| 学习笔记
快速学习系统资源调优与内核参数配置。
系统资源调优与内核参数配置| 学习笔记