**HAProxy ACL详解**

HAProxy ACL详解
官方文档:
http://cbonte.github.io/haproxy-dconv/1.7/configuration.html

使用 ACLs,可以基于请求和响应的任何部分,进行服务内容的切换。总的原则如下:
定义测试准则
根据测试结果执行一定的动作,包括对请求进行拒绝,或者选择一个 backend
acl 关键字用于定义一条新的测试准则,或者对一条已经存在的测试准则进行重新定义:
acl [flags] [operator] …

指定对请求或者响应的某个部分进行测试
[flags]:
对测试进行调整
-i: 此 flag 后续的 patterns 进行模式匹配时忽略大小写,之前的 patterns 不受影响
例如:
acl valid-ua hdr(user-agent) -f exact-ua.lst -i -f generic-ua.lst test
exact-ua.lst 中的 pattern 对大小写敏感
generic-ua.lst 中的 pattern 忽略大小写
test 字符串忽略大小写
-f: 从文件中加载 pattern

可使用多个 -f 选项指定多个文件。
如果一个 pattern 的解析错误,1.4 版无法准确定位到错误的 pattern,只能大概知道 ACL
有一个解析错误。
文件中的 patterns 可能被加载到二叉树中,因此查找速度很快。

–: 强制终止 flags。当有字符串看起来与 flags 类似时可以使用 – 显式地终止 flags。
[operator]:
某些准则支持使用操作符

指定测试准则所支持的类型,多个 以空格分隔

支持的 类型包括:

  • 整数、整数范围
  • 字符串
  • 正则表达式
  • IP地址、网络地址
    注,ACL名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和:(冒号)。此外,ACL名称会区分字母大小写。my_acl 和 My_Acl 是两个不同的 ACLs。
    对 ACLs 的数量没有限制,它们只占用少量内存。
    1 整数匹配

整数匹配的规则:

  1. 允许范围匹配
    例如:
    1024:65535
    1024:
    0:1023
    :1023

  2. 支持对版本号进行检测:1.2

  3. 允许使用比较运算符,与 bash 类似:
    eq: 等于
    ge: 大于等于
    gt: 大于
    le: 小于等于
    小于: 小于
    示例:
    acl negative-length hdr_val(content-length) lt 0 (内容长度小于0)

     acl sslv3 req_ssl_ver 3:3.1 (SSL 版本为 3.0~3.1 之间)
    
  4. 只对正数进行匹配
    2 字符串匹配


这是指准确的字符串匹配,有一些规则如下:
\ 可对空格等特殊字符进行转义,转为普通字符
-i string,表示忽略大小写
匹配特殊字符串如 -i, --,
方法一:字符串前面加上 --,这时 flag 终止标志
– -i


方法二:把特殊字符串放第二个位置
str1 -i
str1 –
3 正则匹配

基本规则同上
4 IPv4地址匹配

匹配某个IP地址:
192.168.0.110
www.guli.com(支持使用主机名,但不推荐这样做,因为对配置来讲,会造成阅读和调试上的困难)
如果使用主机名,需确保 /etc/hosts 中有对应的解析条目,不要依赖 DNS 解析。
匹配某个网络:
192.168.0.0/24
5 可用的测试区域

5.1 四层及以下的匹配

这是第一部分的测试区域,不需要对请求或响应的内容进行分析。其中包含 TCP/IP 地址和端口,以及一些与流量无关的内部信息。
always_false
这个永远不会匹配。所有的 values 和 flags 被忽略。可在调整配置时使用。
always_true
这个永远匹配。所有的 values 和 flags 被忽略。可在调整配置时使用。
avg_queue
avg_queue(backend)
某个指定 backend 的等待队列长度的平均数,如果在指定范围内,返回 ture。
返回值为:某个 backend 的等待连接总数 / 该 backend 活动的后端服务器总数。
根据该值,可大致判断一个新的连接需要等待多久才会被处理。
其主要使用场景是,当某个新的用户确定只能得到降级的服务,返回一个 sorry page 给该用户。
应注意的是,当 backend 中没有活动的服务器了,我们会把等待队列的连接数x2,作为测量值。这是一个公平的预测,因为我们期望有一台服务器能快速归位。但这种情况下,更好的方法是将流量转发给另一个后端。
be_conn
be_conn(backend)
返回指定 backend 中当前已建立的连接数(possibly including the connection being evaluated),如果在指定范围内,返回 ture。
如果没有特别指定是那个 backend,则表示使用当前的 backend。
可用于这样的场景,如果被测试的 backend 中连接数已经满负荷,将其流量转发给另一个 backend。
be_id
返回 backend 的 id。可在 frontend 中使用,用于检测是被哪一个 backend 所调用。
be_sess_rate
be_sess_rate(backend)
返回“会话创建速率”:new sessions/s,如果在指定范围内,返回 true。
使用场景:

  1. 当此值过高时,可将其流量转发给其他 backend。
  2. 限制“abuse of service”,比如:prevent sucking of an online dictionary;
    示例:

Redirect to an error page if the dictionary is requested too often

backend dynamic
mode http
acl being_scanned be_sess_rate gt 100
redirect location /denied.html if being_scanned

当“会话创建速率” 高于 100 session/s,将请求重定向至一个 denied 页面。
connslots
connslots(backend)
connslots = backend 服务器剩余的可容纳的连接数 + backend 的等待队列中剩余的可容纳的连接数,在指定范围内时返回 true。
简单来说,就是衡量一个 backend 当前还能接收多少新建连接。基于这个值,可以做更好的负载均衡。一般配合 fe_conn(frontend 当前已经接收的连接数) 一起做判断。
dst <ip_address>
返回当前客户端所连接的本地的 IPv4 地址。It can be used to
switch to a different backend for some alternative addresses.
dst_conn
返回一个socket 上已经建立的连接数(including the one being evaluated)。如果当前接收的连接数已经到达满负荷,可用于在 hard-blocking 之前返回 sorry 页面;或者,使用某个指定的 backend 接收新的请求。
我们可以使用它对不同的监听地址设置不同的限制。
dst_port
返回当前客户端所连接的本地的端口地址。It can be used to switch
to a different backend for some alternative ports.
fe_conn
fe_conn(frontend)
返回某个 frontend 中已经建立的连接数(possibly including the connection being evaluated),如果在指定范围内,返回 true。
如果未指定是哪个 frontend,使用当前的 frontend。
如果所关联的 backend 接收的连接数被认为已经到达满负荷,可用于在 hard-blocking 之前返回 sorry 页面;或者,使用某个指定的 backend 接收新的请求。
fe_id
返回 frontend 的 id。在 backend 中可使用它判断自己是被哪个 frontend 所调用。
fe_sess_rate
fe_sess_rate(frontend)
返回 frontend 的 “新建会话速率”。单位为:新建会话数/秒。如果在指定范围内,返回 true。
一般使用场景:限制新建连接的速率为一个可接受的范围内。在第一时间防止服务滥用。防止 ddos 攻击等。
结合 4层 ACLs,可强制让一个客户端等待少许时间,等待新建会话率降至合理范围内。
示例:

This frontend limits incoming mails to 10/s with a max of 100

concurrent connections. We accept any connection below 10/s, and

force excess clients to

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值