防DDoS攻击

1.ddos 是什么

通俗的例子:

我开了一家餐厅,正常情况下,最多可以容纳100个人同时进餐。你直接走进餐厅,找一张桌子坐下点餐,马上就可以吃到东西。
很不幸,我得罪了一个流氓。他派出1000个人同时涌进餐厅。这些人看上去跟正常的顾客一样,每个都说”赶快上餐”。但是,餐厅的容量只有100个人,根本不可能同时满足这么多的点餐需求,加上他们把门口都堵死了,里三层外三层,正常用餐的客人根本进不来,实际上就把餐厅瘫痪了。
这就是 DDoS 攻击,它在短时间内发起大量请求,耗尽服务器的资源,无法响应正常的访问,造成网站实质下线。
DDoS 里面的 DoS 是 denial of service(停止服务)的缩写,表示这种攻击的目的,就是使得服务中断。最前面的那个 D 是 distributed (分布式),表示攻击不是来自一个地方,而是来自四面八方,因此更难防。你关了前门,他从后门进来;你关了后门,他从窗口跳起来

2.攻击手段汇总,DDOS属于哪一层?

一、针对物理层的攻击:

例:切断网线

二、针对数据链路层的攻击:

例:伪造mac

三、针对网络层的攻击:

例:伪造ip

四、针对传输层的攻击

例:TCP/UDP协议进行攻击

五、针对会话层的攻击

例:cookie

六、针对表示层的攻击

例:多见于windows特殊字符攻击

七、针对应用层的攻击

例:如框架代码漏洞,又如大量http请求访问

DDOS可以利用第三层,第四层,第七层来展开攻击

3. DDoS攻击如何工作?

DDoS攻击需要攻击者控制在线计算机网络才能进行攻击。计算机和其他计算机(如物联网设备)感染了恶意软件,将每个计算机转变为机器人(或僵尸)。然后,攻击者可以远程控制僵尸程序组,这称为僵尸网络。
一旦僵尸网络建立,攻击者就可以通过远程控制方法向每个机器人发送更新的指令来指导机器。当受害者的IP地址被僵尸网络作为目标时,每个僵尸程序将通过向目标发送请求来响应,可能导致目标服务器或网络溢出容量,从而导致对正常流量的拒绝服务。由于每个机器人都是合法的Internet设备,因此将攻击流量与正常流量分开可能很困难。
单个HTTP请求在客户端执行起来很便宜,并且目标服务器响应起来可能很昂贵,因为服务器通常必须加载多个文件并运行数据库查询才能创建网页。

4. DDOS攻击的特征

  • 攻击经常来源于一些相对固定的IP或IP段,每个IP都有远大于真实用户的连接数和请求数。
    备注:这并不表明这种请求都是代表着DDOS攻击。在很多使用NAT的网络架构中,很多的客户端使用网关的IP地址访问公网资源。但是,即便如此,这样的请求数和连接数也会远少于DDOS攻击。
  • 因为攻击是由木马发出且目的是使服务器超负荷,请求的频率会远远超过正常人的请求。
  • User-Agent通常是一个非标准的值

伪造的ip是骗不过tcp的,能骗过udp

5. DDoS防御的方法

硬件防火墙,充足的网络,升级主机服务器硬件,安装专业抗DDOS防火墙(安全狗,360卫士),备份网站,部署CDN(一旦上了 CDN,千万不要泄露源服务器的 IP 地址,否则攻击者可以绕过 CDN 直接攻击源服务器),购买高防 IP(网站域名指向高防 IP,它提供一个缓冲层,清洗流量,并对源服务器的内容进行缓存),企业级 DDoS 清洗系统架构,启用基于 sysctl 的保护,分层解决方案。

以上就是传说中的技术不够,用钱凑。

其它方法及注意事项:
使用 CSF,iptables,UFW,APF 等软件防火墙
服务器上没用的端口一定要关掉,只对外网开放80等端口,有些重要端口,比如mysql的3306,只对指定ip白名单(公司内部服务器的ip地址)提供访问权限。
防止伪造IP:伪造是修改数据包。使用tcp而不是udp,TCP无法伪造IP,因为需要三次握手,比较安全;UDP可以伪造。tcp必须使用代理ip,攻击者攻击成本高。

5.1 nginx防御DDOS

抗击ddos,用nginx防御DDOS

限制每个IP的请求速度
设置Nginx、Nginx Plus的连接请求在一个真实用户请求的合理范围内。比如,如果你觉得一个正常用户每两秒可以请求一次登录页面,你就可以设置Nginx每两秒钟接收一个客户端IP的请求(大约等同于每分钟30个请求)。

limit_req_zone $binary_remote_addr zone=one:10m rate=60r/m;
server {
	...
	location /login.html {
		limit_req zone=one;
		...
	}
}

limit_req_zone命令设置了一个叫one的共享内存区来存储请求状态的特定键值,在上面的例子中是客户端IP($binary_remote_addr)。location块中的 limit_req 通过引用one共享内存区来实现限制访问/login.html的目的

限制连接数量
设置Nginx、Nginx Plus的连接数在一个真实用户请求的合理范围内。比如,你可以设置每个客户端IP连接/store不可以超过10个。

limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
	...
	location /store/ {
		limit_conn addr 10;
		...
	}
}

limit_conn_zone 命令设置了一个叫addr的共享内存区来存储特定键值的状态,在上面的例子中是客户端IP($binary_remote_addr)。location块中 limit_conn 通过引用addr共享内存区来限制到/store/的最大连接数为10。

关闭慢连接
有一些DDOS攻击,比如Slowlris,是通过建立大量的连接并周期性的发送一些数据包保持会话来达到攻击目的,这种周期通常会低于正常的请求。这种情况我们可以通过关闭慢连接来抵御攻击。
client_body_timeout 命令用来定义读取客户端请求的超时时间, client_header_timeout 命令用来定于读取客户端请求头的超时时间。这两个参数的默认值都是60s,我们可以通过下面的命令将他们设置为5s:

server {
	client_body_timeout 5s;
	client_header_timeout 5s;
	...
}

设置IP黑名单
你确定攻击来源于123.123.123.3、123.123.123.5、123.123.123.7几个IP,可以这样设置:

location / {
	deny 123.123.123.3;
	deny 123.123.123.5;
	deny 123.123.123.7;
	...
}

设置IP白名单
如果你的网站仅允许特定的IP或IP段访问,你可以结合使用allow和deny命令来限制仅允许你指定的IP地址访问你的网站。如下,你可以设置仅允许192.168.1.0段的内网用户访问:

location / {
	allow 192.168.1.0/24;
	deny all;
	...
}

deny命令会拒绝除了allow指定的IP段之外的所有其他IP的访问请求。

使用缓存进行流量削峰
通过打开Nginx的缓存功能并设置特定的缓存参数,可以削减来自攻击的流量,同时也可以减轻对后端服务器的请求压力。以下是一些有用的设置

  • proxy_cache_use_stale 的updating参数告诉Nginx什么时候该更新所缓存的对象。只需要到后端的一个更新请求,在缓存有效期间客户端对该对象的请求都无需访问后端服务器。当通过对一个文件的频繁请求来实施攻击时,缓存功能可极大的降低到后端服务器的请求。
  • proxy_cache_key 命令定义的键值通常包含一些内嵌的变量(默认的键值$scheme$proxy_host$request_uri包含了三个变量)。如果键值包含 $query_string 变量,当攻击的请求字符串是随机的时候就会给Nginx代理过重的缓存负担,因此我们建议一般情况下不要包含 $query_string 变量。

屏蔽特定的请求
可以设置Nginx、Nginx Plus屏蔽一些类型的请求:

  • 针对特定URL的请求
  • 针对不是常见的User-Agent的请求
  • 针对其他请求头中包含可以联想到攻击的值的请求
    比如,如果你判定攻击是针对一个特定的URL:/foo.php,我们就可以屏蔽到这个页面的请求:
location /foo.php {
deny all;
}

或者你判定攻击请求的User-Agent中包含foo或bar,我们也可以屏蔽这些请求:

location / {
	if ($http_user_agent ~* foo|bar) {
		return 403;
	}
	...
}

http_name变量引用一个请求头,上述例子中是User-Agent头。可以针对其他的http头使用类似的方法来识别攻击。

限制到后端服务器的连接数

一个Nginx、Nginx Plus实例可以处理比后端服务器多的多的并发请求。在Nginx Plus中,你可以限制到每一个后端服务器的连接数,比如可以设置Nginx Plus与website upstream中的每个后端服务器建立的连接数不得超过200个:

upstream website {
	server 192.168.100.1:80 max_conns=200;
	server 192.168.100.2:80 max_conns=200;
	queue 10 timeout=30s;
}

max_conns 参数可以针对每一个后端服务器设置Nginx Plus可以与之建立的最大连接数。queue命令设置了当每个后端服务器都达到最大连接数后的队列大小,timeout参数指定了请求在队列中的保留时间。

posted @ 2021-08-06 11:57  bogiang  阅读(242)  评论(0编辑  收藏  举报