首页 > 代码库 > haproxy ACL及动静分离

haproxy ACL及动静分离

一、haproxy ACL说明

二、haproxy 动静分离


一、haproxy ACL说明

1.1.ACL作用

使用访问控制列表(ACL)提供了灵活的解决方案来执行内容切换,并且通常基于从请求中提取的内容,响应或任何环境状态来做出决定。

也就是,ACL能分析请求的内容,并做相应的操作


1.2.ACL语法

acl <aclname> <criterion> [flags] [operator] [<value>]

<aclname>:acl 名称,自定义,建议做到见名只意。


<criterion>:测试的标准,测试的信息说明。

    

[flags]:

   -i:在所有后续模式匹配期间忽略大小写。

   -f:从文件加载模式。

   -m:使用特定的模式匹配方法

   -n:禁止DNS解析

   -M:像地图文件一样加载-f指向的文件。

   -u:强制ACL的唯一标识

    - :强制结束标志。当字符串看起来像一个标志时有用。


匹配条件:

  - AND (与)

  - OR  (或)

  - ! 非

  例如:

  acl missing_cl hdr_cnt(Content-length) eq 0
  block if HTTP_URL_STAR !METH_OPTIONS || METH_POST missing_cl
  block if METH_GET HTTP_CONTENT
  block unless METH_GET or METH_POST or METH_OPTIONS

1.3.好了,不废话了,看例子

acl valid_method method GET HEAD   #定义一个名为valid_method的检测请求方法的acl
http-request deny if ! valid_method #请求拒绝如果是非上面的方法

acl clear      dst_port  80   #定义名为clear目标端口为80的acl
acl secure     dst_port  8080  #定义名为secure目标为8080的acl
acl login_page url_beg   /login #定义名为login_page且url以/login开头的acl
acl logout     url_beg   /logout #定义名为logout且url以/logout开头的acl
acl uid_given  url_reg   /login?userid=[^&]+ #定义名为uid_given,url正则匹配
acl cookie_set hdr_sub(cookie) SEEN=1 #定义名为cookie_set,匹配cook的子串

redirect prefix   https://mysite.com set-cookie SEEN=1 if !cookie_set #跳转前半部分如,http://mysite.com/login/us? 跳转http://mysite.com/																		为https开头,后半部分不变,如果cookie没设置的话,设置为acl定义的cookie
redirect prefix   https://mysite.com           if login_page !secure  #如果请求的登录页,且目标端口不是8080,跳前半部分到https://mysite.com
redirect prefix   http://mysite.com drop-query if login_page !uid_given #如果登录业没有给定id,则丢弃请求
redirect location http://mysite.com/           if !login_page secure #如果不是登录页的请求目标端口为8080则,跳转至http://mysite.com/  
redirect location / clear-cookie USERID=       if logout #登录的域为"/"则清除cookie信息

acl being_scanned be_sess_rate gt 100 #定义名为being_scanned的acl,如果后端回话创建速率大于100
redirect location /denied.html if being_scanned #如果满足上面的条件,则将请求转发至/denied.html

1.4.防止大量请求的参数

be_sess_rate:返回与后端的会话创建速率相对应的整数值(每秒新的会话数)。当昂贵或易碎的会话速率过高或限制服务滥用(例如,阻止吸引在线字典)时,这与ACL一起使用以切换到备用后端。使用log-format伪指令将此元素添加到日志也很有用。


fe_sess_rate:返回与前端的会话创建速率对应的整数值(每秒新的会话数)。这与ACL一起使用以将进入的会话速率限制到可接受的范围,以便防止在最早的时刻滥用服务,例如当与其他第4层ACL组合以迫使客户端等待比特速率时下降到限制以下。使用log-format伪指令将此元素添加到日志也很有用。另请参阅前端使用的“rate-limit sessions”指令。

1.5.测试示例

修改配置文件:

# vim /etc/haproxy/haproxy.cfg
....
backend webserver
    balance    roundrobin
    cookie WEBSVR insert nocache
    acl login_page url_beg /login
    acl logout     url_beg /logout
    acl test_page  url_reg ^/test[0-9].html$

    redirect prefix https://zldckl.com if login_page
    redirect location / clear-cookie USERID=  if logout   
    http-request deny if test_page

    server  web1 192.168.199.126:80 weight 1 maxconn 500 maxqueue 300 cookie cklser1 check
    server  web2 192.168.199.194:80 weight 1 maxconn 500 maxqueue 300 cookie cklser2 check
    server  web3 192.168.199.180:80 weight 1 maxconn 500 maxqueue 300 cookie cklser3 check

重新加载服务:

systemctl restart haproxy.service

测试登录页调整到https

技术分享

跳转到https

技术分享

测试退出也到主页:

技术分享

跳转到主页:

技术分享

测试正则页面拒绝:

技术分享

拒绝:

技术分享



本文出自 “深呼吸再出击” 博客,请务必保留此出处http://ckl893.blog.51cto.com/8827818/1889756

haproxy ACL及动静分离