设为首页 收藏本站
查看: 1485|回复: 0

[经验分享] Haproxy的ACL规则和获取样本

[复制链接]

尚未签到

发表于 2019-1-2 07:51:50 | 显示全部楼层 |阅读模式
使用ACLs和获取样本
  Haproxy 能够从请求报文,响应报文,从客户端或者服务端信息,从表,环境信息等等中提取数据。提取这样的数据的动作我们称之为获取样本。进行检索时,这些样本可以用来实现各种目的,比如作为粘滞表的键,最常用的用途是,根据预定义的模式来进行匹配。访问控制列表(ACL)提供一个灵活方案进行内容切换,或者在从请求,响应,任何环境状态中提取的数据基础之上做出决策。控制列表的原则很简单:

  •   从数据流,表,环境中提取数据样本
  •   对提取的样本可选地应用格式转换
  •   对一个样本应用一个或多个模式匹配
  •   当模式匹配样本时才执行动作
  执行的动作通常是阻断请求,选择一个后端服务器或者添加一个HTTP首部
  需要提醒的是,获取的样本数据不光可以使用在acl中,也可以使用别处,例如记录log中
  定义ACL的语法为:
acl   [flags] [operator] [] ...  这样一条语句建立了一个acl 测试;
  这些测试应用在请求或响应中被"标准"< criterion > 部分所指定的内容,而且可以指定[ flags] 进行特性调整,有些< criterion > 支持操作符[operator] 进行运算,同时一些转换格式的关键字可以跟在< criterion >后面,使用" , "隔开。而值[< value >] 要求被
  < criterion > 所支持的数据形式,多个值使用空格分隔。
  < criterion > 通常是指获取样本方法的名称。使用一个获取样本方法,暗含着其输出样本的类型,类型是以下列出的一种:

  •   boolean
  •   integer (signed or unsigned)
  •   IPv4 or IPv6 address
  •   string
  •   data block
  ACL引擎匹配数据使用的模式类型如下:

  •   boolean
  •   integer or integer range
  •   IP address / network
  •   string (exact, substring, suffix, prefix, subdir, domain)
  •   regular expression
  •   hex block
  ACL flags 可用列表如下:

  •   -i : 忽略大小写
  •   -f filename : 从文件中载入模式
  •   -m method : 指定模式匹配方法
  •   -n : 禁止DNS解析
  •   -M : -f 载入的文件作为映射文件使用
  •   -u : 强制ACL的名称唯一
  •   -- : 强制结束flag结束,避免了字符串中含有的- 引起混淆
  其中flag中的 -m 选项可使用的模式匹配方法如下,需要说明的是有些方法已被默认指定无需声明,例如int,ip

  •   "found" : 只是用来探测数据流中是否存在指定数据,不进行任何比较
  •   "bool" : 检查结果返回布尔值。匹配没有模式,可以匹配布尔值或整数,不匹配0和false,其他值可以匹配
  •   "int" : 匹配整数类型数据;可以处理整数和布尔值类型样本,0代表false,1代表true
  •   "ip" : 匹配IPv4,IPv6地址类型数据。该模式仅被IP地址兼容,不需要特别指定
  •   "bin" : 匹配二进制数据
  •   "len" : 匹配样本的长度的整数值
  •   "str" : 精确匹配,根据字符串匹配文本
  •   "sub" : 子串匹配,匹配文本是否包含子串
  •   "reg" : 正则匹配,根据正则表达式列表匹配文本
  •   "beg" : 前缀匹配,检查文本是否以指定字符串开头
  •   "end" : 后缀匹配,检查文本是否以指定字符串结尾
  •   "dir" : 子目录匹配,检查部分文本中以" / "作为分隔符的内容是否含有指定字符串
  •   "dom" : 域匹配。检查部分文本中以" . "作为分隔符的内容是否含有指定字符串
  如果获取样本值为整数,数值比较符可使用,:
  eq : true if the tested value equals at least one value
  ge : true if the tested value is greater than or equal to at least one value
  gt : true if the tested value is greater than at least one value
  le : true if the tested value is less than or equal to at least one value
  lt : true if the tested value is less than at least one value
  想必前面一堆理论性的论述已经把大家搞的晕头转向,下面结合获取样本方法和访问控制动作指令具体阐述ACL使用方法
  先介绍控制动作指令

  •   layer 4 传输层控制指令
tcp-request connection  [{if | unless} ]  对tcp请求控制指令
  < condition > 即为ACL定义的访问控制列表
  < action > 常用值有 "accept", "reject"

  •   layer 7 应用层控制指令
#阻断符合ACL的访问请求block { if | unless }   
#http请求的控制指令http-request { allow | deny}  [ { if | unless }  ]

  •   后端主机调用
#根据条件来调用指定后端use_backend  [{if | unless} ]

  •   由ACL定义的多个< condition > 组成联合条件,逻辑符为

    •   and (默认操作符,可省略)
    •   or (或者使用 "||")
    •   ! (取反)

1 获取内部状态样本
# 与后端建立会话速率,每秒钟建立的新会话be_sess_rate([]) : integer  Example :
# 某后端被请求过于繁忙,则重定向至错误页  
    mode http
  
    acl being_scanned be_sess_rate gt 100
  
    redirect location /denied.html if being_scanned
2 获取layer 4 样本
  在传输层获取样本,通常是TCP/IP 协议的IP和端口,以及建立连接速率等等。而且此部分样本通常用于"tcp-request connection"指令中的规则之中。
        dst : ip             #目标地址  
        dst_port : integer
  
        src : ip             #源地址
  
        src_port : integer
  Example:
#阻断来自非指定IP的访问8080端口的请求acl myhost src 10.1.0.200acl myport dst_port 8080tcp-request connection reject if !myhost myport3 获取layer 7 样本
  /1
path : string  提取请求url的地址信息,从第一个"/"开始,不包含host,不包含参数
  ACL 衍生,即包含了-m 选项中匹配模式方法 :
  path : exact string match
  path_beg : prefix match
  path_dir : subdir match
  path_dom : domain match
  path_end : suffix match
  path_len : length match
  path_reg : regex match
  path_sub : substring match
  Example:
#请求资源为图片,则调用图片服务器后端  
acl picture path_end -i .jpg .png .gif
  
use_backend server_pic if picture
  /2
url : string  提取URL的全部内容,包含host和参数ACL 衍生类似,不再列举
  /3
req.hdr([[,]]) : string  提取http请求的指定首部字段值,< occ >可指定出现的位置ACL 衍生 :
  hdr([[,]])     : exact string match  
  hdr_beg([[,]]) : prefix match
  
  hdr_dir([[,]]) : subdir match
  
  hdr_dom([[,]]) : domain match
  
  hdr_end([[,]]) : suffix match
  
  hdr_len([[,]]) : length match
  
  hdr_reg([[,]]) : regex match
  
  hdr_sub([[,]]) : substring match
  Example:
#阻断火狐浏览器发送的请求acl firefox hdr_reg(User-Agent)     -i      .*firefox.*block if firefox  /4
method : integer + string  提取请求报文中的请求方法Example:
#拒绝GET HEAD 方式之外的HTTP请求acl valid_method method GET HEAD  
http-request deny if ! valid_method
4 内建ACL
  HAProxy有众多内建的ACLs,这些ACLs可直接调用,例如

  •   LOCALHOST 匹配来自本地IP的连接,127.0.0.1/8
  •   HTTP_1.1 匹配http版本1.1
  •   METH_GET 匹配http请求GET或HEAD方法
  •   TRUE
  •   FALSE
  Example:
#拒绝GET HEAD 方式之外的HTTP请求http-request deny if ! METH_GET


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-658458-1-1.html 上篇帖子: nginx lvs haproxy的原理和区别 下篇帖子: 使用 HAProxy 完成 網站分流, 平衡負載
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表