配置 Haproxy 防范 DDOS 攻击

作为 load balancer, Happroxy 常常作为服务器的前端,向外界用户提供服务的入口,如果能在入口处处理安全相关问题,将极大简化后端的设计。事实上,Haproxy 不仅仅是一款开源出色的 load balancer(四层和七层),而且在安全上也相当出色。它配合内核 IP/TCP 协议栈,能够较好的抵抗 DOS, DDOS 攻击,还能通过限制单个 IP 的连接数和请求速率等,防止用户的恶意行为。

TCP syn flood attacks

通过向服务器发送大量的 TCP syn 分组,恶意用户实现了了 TCP syn flood 攻击,幸运的是,简单的配置内核网络参数即可防止这种攻击。

#vim /etc/sysctl.conf    然后 sysctl -p

# Protection SYN flood
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_max_syn_backlog = 1024 

Slowloris like attacks

一个 Http 请求通常包括头部、url、methods 等,服务器需要接收整个 Http 请求后会做出响应。恶意用户发送缓慢的 Http 请求,比如一个字节一个字节的发送头部,服务器将一直处于 wating 状态,从而耗费服务器的资源。Haproxy 通过配置 timeout http-request 参数,当一个用户的请求时间超过设定值时,Haproxy 断开与该用户的连接。

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:8880
  stats enable
  stats hide-version
  stats uri     /
  stats realm   HAProxy\ Statistics
  stats auth    admin:admin

frontend ft_web
  bind 0.0.0.0:8080
  default_backend bk_web

backend bk_web
  balance roundrobin
  cookie MYSRV insert indirect nocache
  server srv1 192.168.1.2:80 check cookie srv1 maxconn 100
  server srv2 192.168.1.3:80 check cookie srv2 maxconn 100
通过 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:8880
  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 10 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:80 check cookie srv1 maxconn 100
  server srv2 192.168.1.3:80 check cookie srv2 maxconn 100

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:8880
  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,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 10 opened or rate more than 20
  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:80 check cookie srv1 maxconn 100
  server srv2 192.168.1.3:80 check cookie srv2 maxconn 100
注:若某些用户在同一个私有网段通过 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

时间: 2024-08-05 14:45:22

配置 Haproxy 防范 DDOS 攻击的相关文章

配置 Haproxy 防止 DDOS 攻击

作为 load balancer, Happroxy 常常作为服务器的前端,向外界用户提供服务的入口,如果能在入口处处理安全相关问题,将极大简化后端的设计.事实上,Haproxy 不仅仅是一款开源出色的 load balancer(四层和七层),而且在安全上也相当出色.它配合内核 IP/TCP 协议栈,能够较好的抵抗 DOS, DDOS 攻击,还能通过限制单个 IP 的连接数和请求速率等,防止用户的恶意行为. Haproxy 配置参数多的一塌糊涂,因而功能丰富,灵活多样,本文抛砖引玉,更多的安全

如何防范ddos攻击

现如今网络安全是企业发展的一大重要问题,目前最让企业头疼也是最无力的就是网络安全攻击中的DDOS攻击,这种攻击通过僵尸网络无脑的进行恶意攻击,对企业造成了极大的损失,基本上每个企业都会因为恶意竞争或者勒索而受过ddos攻击,那么如何防范ddos攻击呢? 一.理解ddos攻击原理     ddos攻击也就是所说的分布式拒绝服务攻击,攻击者通过手中控制的僵尸网络对目标机器进行快速大批量的网络访问, 1.最基本的DoS攻击就是利用合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应.这

防范 DDoS 攻击的 15 个方法

为了对抗 DDoS(分布式拒绝服务)攻击,你需要对攻击时发生了什么有一个清楚的理解. 简单来讲,DDoS 攻击可以通过利用服务器上的漏洞,或者消耗服务器上的资源(例如 内存.硬盘等等)来达到目的.DDoS 攻击主要要两大类: 带宽耗尽攻击和资源耗尽攻击. 为了有效遏制这两种类型的攻击,你可以按照下面列出的步骤来做: 1. 如果只有几台计算机是攻击的来源,并且你已经确定了这些来源的 IP 地址, 你就在防火墙服务器上放置一份 ACL(访问控制列表) 来阻断这些来自这些 IP 的访问.如果可能的话

Spring3.x通过配置来防范csrf攻击

1. [代码]CsrfTokenManager 用于管理csrfToken相关 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 packagecom.uncle5.pubrub.web.common; importjava.util.UUID; importjavax.servlet.http.HttpServletRequest;

工作中的一次linux防范ddos攻击

在上班路上,看到手机短信里面发送报警信息,一台服务器凌晨4点下线了.匆忙到工位,检查机器果然下线了,报告老板,然后联系机房.大概十分钟后机房回复,机器受到攻击,机房切断了Ip. 机器用电信联通双网络,既然电信ip被封,那就用联通的ip进入机器. 要素一:机器的硬件信息以及Ip信息平时一定要保管好.免得有问题了还要去问机房,白白浪费很多时间. 进入机器后top等发现机器硬件性能ok,再用iptraf,流量也不高(当然不高,主ip都被切了). 机器跑的是网站业务,所以要找问题,去日志文件里面找访问量

如何防止DDos攻击?

---恢复内容开始--- 一.拒绝服务攻击的发展 从拒绝服务攻击诞生到现在已经有了很多的发展,从最初的简单Dos到现在的DDOS.那么什么是Dos和DDOS呢?DoS是一种利用单台计算机的攻击方式.而DDOS(Distributed Denial of Service,分布式拒绝服务)是一种基于DoS的特殊形式的拒绝服务攻击,是一种分布.协作的大规模攻击方式,主要瞄准比较大的站点,比如一些商业公司.搜索引擎和政府部门的站点.DDOS攻击是利用一批受控制的机器向一台机器发起攻击,这样来势迅猛的攻击

iptables防DDOS攻击和CC攻击设置

防范DDOS攻击脚本 #防止SYN攻击 轻量级预防 iptables -N syn-flood iptables -A INPUT -p tcp --syn -j syn-flood iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN iptables -A syn-flood -j REJECT #防止DOS太多连接进来,可以允许外网网卡每个IP最多15个初始连接,超过的丢弃 iptables

实战分享:如何成功防护1.2T国内已知最大流量DDoS攻击

作者:腾讯云宙斯盾安全团队&腾讯安全平台部 引言: DDoS攻击势头愈演愈烈,除了攻击手法的多样化发展之外,最直接的还是攻击流量的成倍增长.3月份国内的最大规模DDoS攻击纪录还停留在数百G规模,4月,这个数据已经突破T级,未来不可期,我们唯有保持警惕之心,技术上稳打稳扎,以应对DDoS攻击卷起的血雨腥风.4月8日,腾讯云宙斯盾成功防御了1.2Tbps的超大流量攻击,也是目前国内已知的最大攻击流量,这篇文章就此次攻防事件简单地为大家做一个梳理和分析. 国内已知最大攻击流量来袭 4月8日,清明节后

Linux下防御DDOS攻击的操作梳理

DDOS的全称是Distributed Denial of Service,即"分布式拒绝服务攻击",是指击者利用大量"肉鸡"对攻击目标发动大量的正常或非正常请求.耗尽目标主机资源或网络资源,从而使被攻击的主机不能为合法用户提供服务. DDOS攻击的本质是:利用木桶原理,寻找利用系统应用的瓶颈:阻塞和耗尽:当前问题:用户的带宽小于攻击的规模,噪声访问带宽成为木桶的短板. 可以参考下面的例子理解下DDOS攻击.1)某饭店可以容纳100人同时就餐,某日有个商家恶意竞争,