配置 Haproxy 防范 DDOS 攻击
作为 load balancer, Happroxy 常常作为服务器的前端,向外界用户提供服务的入口,如果能在入口处处理安全相关问题,将极大简化后端的设计。事实上,Haproxy 不仅仅是一款开源出色的 load balancer(四层和七层),而且在安全上也相当出色。它配合内核 IP/TCP 协议栈,能够较好的抵抗 DOS, DDOS 攻击,还能通过限制单个 IP 的连接数和请求速率等,防止用户的恶意行为。
TCP syn flood attacks
# Protection SYN flood
net.ipv4.tcp_syncookies =
net.ipv4.conf.all.rp_filter =
net.ipv4.tcp_max_syn_backlog =
Slowloris like attacks
defaults
option http-server-close
mode http
timeout http-request 5s # 防止 Slowloris like attacks
timeout connect 5s
timeout server 10s
timeout client 30s listen stats
bind 0.0.0.0:
stats enable
stats hide-version
stats uri /
stats realm HAProxy\ Statistics
stats auth admin:admin frontend ft_web
bind 0.0.0.0:
default_backend bk_web backend bk_web
balance roundrobin
cookie MYSRV insert indirect nocache
server srv1 192.168.1.2: check cookie srv1 maxconn
server srv2 192.168.1.3: check cookie srv2 maxconn
通过 telnet 登录验证结果,登陆连接后超过5秒就会自动被拒绝断掉。
Limiting the number of connections per users
以网站为例,普通用户访问网站,或者从网站下载东西时,浏览器一般会建立 5-7 个 TCP 链接。当一个恶意打开了大量 TCP 链接时,耗费服务器大量资源,影响其它用户的访问,因此我们需要根据实际情况,限制同一个用户的链接数。
defaults
option http-server-close
mode http
timeout http-request 5s
timeout connect 5s
timeout server 10s
timeout client 30s listen stats
bind 0.0.0.0:
stats enable
stats hide-version
stats uri /
stats realm HAProxy\ Statistics
stats auth admin:admin frontend ft_web
bind 0.0.0.0:8080 # Table definition
stick-table type ip size 100k expire 30s store conn_cur
# Allow clean known IPs to bypass the filter
tcp-request connection accept if { src -f /etc/haproxy/whitelist.lst }
# Shut the new connection as long as the client has already opened
tcp-request connection reject if { src_conn_cur ge 10 }
tcp-request connection track-sc1 src default_backend bk_web backend bk_web
balance roundrobin
cookie MYSRV insert indirect nocache
server srv1 192.168.1.2: check cookie srv1 maxconn
server srv2 192.168.1.3: check cookie srv2 maxconn
size 定义了这个table可以存储的entry最大数量
expire 定义entry在stick-table中的过期时间,默认大概24天.如果不指定expire这个参数,千万不要指定nopurge!
store 用于存储其他额外信息,这些信息可以用于ACL.用于控制各种与客户端活动相关的标准。多种data type可以用逗号分隔,写在store后边
注:若某些用户在同一个私有网段通过 NAT 访问网站,这样的配置存在不合理之处,最好把 NAT 处的公网地址添加到 whitelist.lst 文件中。
利用 apache ab测试工具做验证,和服务器一直保持建立 10 个链接。
# ab -n 50000000 -c 10 http://127.0.0.1:8080/
用 telnet 打开第 11 个链接,服务器拒绝该链接。
Limiting the connection rate per user
仅仅限制单个用户的并发链接数并意味着万事大吉,如果用户在短时间内向服务器不断的发送建立和关闭链接请求,也会耗费服务器资源,影响服务器端的性能,因此需要控制单个用户建立连接的访问速率/频率。
通常情况下,考虑到用户通过浏览器一般会建立 5-7 条 TCP 链接,我们可以认为普通用户在 3 秒内不应该建立超过 20 条链接。
defaults
option http-server-close
mode http
timeout http-request 5s
timeout connect 5s
timeout server 10s
timeout client 30s listen stats
bind 0.0.0.0:
stats enable
stats hide-version
stats uri /
stats realm HAProxy\ Statistics
stats auth admin:admin frontend ft_web
bind 0.0.0.0: # Table definition
stick-table type ip size 100k expire 30s store conn_cur,conn_rate(3s) # 3秒内的连接次数限制到20次
# Allow clean known IPs to bypass the filter
tcp-request connection accept if { src -f /etc/haproxy/whitelist.lst }
# Shut the new connection as long as the client has already opened or rate more than
tcp-request connection reject if { src_conn_cur ge 10 } || { src_conn_rate ge 20}
tcp-request connection track-sc1 src default_backend bk_web backend bk_web
balance roundrobin
cookie MYSRV insert indirect nocache
server srv1 192.168.1.2: check cookie srv1 maxconn
server srv2 192.168.1.3: check cookie srv2 maxconn
注:若某些用户在同一个私有网段通过 NAT 访问网站,这样的配置存在不合理之处,最好把 NAT 处的公网地址添加到 whitelist.lst 文件中。
测试,采用 ab 打开 20 个链接。(测试时记得把 “限制单个用户并发数功能” 去掉)
ab -n 20 -c 1 -r http://127.0.0.1:8080/
再用 telnet 打开第 21 个链接,服务器拒绝该请求。
-------------------------------------------------------------------------------------------------------------
如何直观的查看stick-table里的内容
1、安装socat
# yum install socat -y
2、在haproxy.cfg的global项中开启stats
stats socket /var/run/haproxy.stats level admin
3、执行查看命令
echo "show table ft-web" | socat unix:/var/run/haproxy.stats - 其中table名字同frontend的名称
可以进行实时查看:
# watch -n 1 -d 'echo "show table ft-web" | socat unix:/var/run/haproxy.stats -'
参考资料:http://blog.haproxy.com/2012/02/27/use-a-load-balancer-as-a-first-row-of-defense-against-ddos/
http://blog.sina.com.cn/s/blog_704836f40102w243.html
配置 Haproxy 防范 DDOS 攻击的更多相关文章
- 防范DDOS攻击脚本
防范DDOS攻击脚本 #防止SYN攻击 轻量级预防 iptables -N syn-flood iptables -A INPUT -p tcp --syn -j syn-flood iptables ...
- 安全性测试之防范 DDoS 攻击
安全性测试之防范 DDoS 攻击 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:90882 ...
- 防范DDoS攻击的几种方式
一.拒绝服务攻击的发展: 从拒绝服务攻击诞生到现在已经有了很多的发展,从最初的简单Dos到现在的DdoS.那么什么是Dos和DdoS呢?DoS是一种利用单台计算机的攻击 方式.而DdoS(Distri ...
- nginx限流模块(防范DDOS攻击)
Nginx限流模式(防范DDOS攻击) nginx中俩个限流模块: 1.ngx_http_limit_req_module(按请求速率限流) 2.ngx_http_limit_conn_module( ...
- 小型网站如何防范DDoS攻击
ddos(Distributed Denial of Service,分布式拒绝服务攻击),俗称洪水攻击.是在传统的DoS攻击基础之上产生的新的破坏力更强的攻击方式.分布式拒绝服务攻击是指借助于客户/ ...
- 防范 DDoS 攻击的 15 个方法
为了对抗 DDoS(分布式拒绝服务)攻击,你需要对攻击时发生了什么有一个清楚的理解. 简单来讲,DDoS 攻击可以通过利用服务器上的漏洞,或者消耗服务器上的资源(例如 内存.硬盘等等)来达到目的.DD ...
- 防范DDoS攻击的15个方法
0x01 背景 为了对抗 DDoS(分布式拒绝服务)攻击,你需要对攻击时发生了什么有一个清楚的理解..简单来讲,DDoS 攻击可以通过利用服务器上的漏洞,或者消耗服务器上的资源(例如 内存.硬盘等等) ...
- Nginx限制访问速率和最大并发连接数模块--limit (防范DDOS攻击)
Tengine版本采用http_limit_req_module进行限制 具体连接请参考 http://tengine.taobao.org/document_cn/http_limit_req_cn ...
- iptable防范ddos攻击
Basic DoS Protection https://github.com/MPOS/php-mpos/wiki/Basic-DoS-Protection # Rule 1: Limit New ...
随机推荐
- 如何区分Babel中的stage-0,stage-1,stage-2以及stage-3(二)
上一篇文章我们介绍了法力无边的stage-0 和 包罗万象的stage-1, 现在我们来介绍下 stage-2 和 stage-3 深藏不露的stage-2 为什么说 stage-2深藏不露呢,因为它 ...
- [zz] Principal Components Analysis (PCA) 主成分分析
我理解PCA应该分为2个过程:1.求出降维矩阵:2.利用得到的降维矩阵,对数据/特征做降维. 这里分成了两篇博客,来做总结. http://matlabdatamining.blogspot.com/ ...
- C#程序以管理员身份运行
选中"Security",在界面中勾选"Enable ClickOnce Security Settings"后,在Properties下就有自动生成app.m ...
- (C++)窗口置前SetForegroundWindow(pThis->hwndWindow);
一段代码主要是创建一个Window,然后将其置顶显示.奇怪的是这个功能有时候无效. pThis->bWindowDisplayed = SetForegroundWindow(pThis-> ...
- C#.Net Mvc运营监控,计算方法/接口/action/页面执行时间
1.建立一个TimingActionFilter过滤器 public class TimingActionFilter : ActionFilterAttribute { public overrid ...
- JS常用工具函数
/** * Created by gaojun-pd on 2016/10/27. */ var Util = { /** * 1.判断非空 * 2.获取字符串真实长度 汉字算两位 * 3.判断参数类 ...
- bug--service--Caused by java.lang.SecurityException: Unable to start service Intent { }:user 0 is restricted
http://bbs.coloros.com/thread-174655-1-1.html 急!!Service在OPPO系列手机下无法启动,寻求帮助 你好,我是网易邮件事业部1元夺宝开发工程师,最近 ...
- innodb的锁
观察innodb的锁时间,需要关注: mysqladmin extended-status -r -i 1 -uroot | grep "Innodb_row_lock_time" ...
- 通过单元测试理解spring容器以及dubbo+zookeeper单元测试异常处理
一.先说一个结论:单元测试与主项目的spring容器是隔离的,也就是说,单元测试无法访问主项目spring容器,需要自己加载spring容器. 接下来是代码实例,WEB主项目出于运行状态,单元测试中可 ...
- Java三大主流框架概述
Struts.Hibernate和Spring是我们Java开发中的常用关键,他们分别针对不同的应用场景给出最合适的解决方案.但你是否知道,这些知名框架最初是怎样产生的? 我们知道,传统的Java W ...