zoukankan      html  css  js  c++  java
  • 配置 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

  • 相关阅读:
    java 运算符优先级(sum operator priority level)
    how to improve your programming ablity?
    window.returnValue = 00000000; window.close();
    list
    select card 双层
    double color ball
    Linq 左连接 内连接
    DDD 详细 介绍 摘自网络
    没有老板的公司,你适应吗?摘自网络
    Using Java Classes in your .NET Application 摘自网络
  • 原文地址:https://www.cnblogs.com/wjoyxt/p/6094659.html
Copyright © 2011-2022 走看看