Haproxy中的acl的详解

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

  • 从数据流,表,环境中提取数据样本
  • 对提取的样本可选地应用格式转换
  • 对一个样本应用一个或多个模式匹配
  • 当模式匹配样本时才执行动作

执行的动作通常是阻断请求,选择一个后端服务器或者添加一个HTTP首部
需要提醒的是,获取的样本数据不光可以使用在acl中,也可以使用别处,例如记录log中
定义ACL的语法为:

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

这样一条语句建立了一个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 <action> [{if | unless} <condition>]

对tcp请求控制指令
< condition > 即为ACL定义的访问控制列表
< action > 常用值有 “accept”, “reject”

layer 7 应用层控制指令

#阻断符合ACL的访问请求
block { if | unless } <condition> 

#http请求的控制指令
http-request { allow | deny}  [ { if | unless } <condition> ]

后端主机调用

#根据条件来调用指定后端
use_backend <backend> [{if | unless} <condition>]

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

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

二、获取内部状态样本

# 与后端建立会话速率,每秒钟建立的新会话
be_sess_rate([<backend>]) : integer

Example :

# 某后端被请求过于繁忙,则重定向至错误页
    mode http
    acl being_scanned be_sess_rate gt 100
    redirect location /denied.html if being_scanned

三、获取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.200
acl myport dst_port 8080
tcp-request connection reject if !myhost myport

四、 获取layer 7 样本

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

url : string

提取URL的全部内容,包含host和参数ACL 衍生类似,不再列举

req.hdr([<name>[,<occ>]]) : string

提取http请求的指定首部字段值,< occ >可指定出现的位置ACL 衍生 :

  • hdr([<name>[,<occ>]])     : exact string match
  • hdr_beg([<name>[,<occ>]]) : prefix match
  • hdr_dir([<name>[,<occ>]]) : subdir match
  • hdr_dom([<name>[,<occ>]]) : domain match
  • hdr_end([<name>[,<occ>]]) : suffix match
  • hdr_len([<name>[,<occ>]]) : length match
  • hdr_reg([<name>[,<occ>]]) : regex match
  • hdr_sub([<name>[,<occ>]]) : substring match

Example:

#阻断火狐浏览器发送的请求
acl firefox hdr_reg(User-Agent)     -i      .*firefox.*
block if firefox

method : integer + string

提取请求报文中的请求方法Example:

#拒绝GET HEAD 方式之外的HTTP请求
acl valid_method method GET HEAD
http-request deny if ! valid_method

五、内建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

Haproxy中的acl的详解》上有1条评论

  1. Pingback引用通告: haproxy中的Proxies段的配置 | 精彩每一天

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>