**HAProxy ACL详解**

本文详细介绍了HAProxy的访问控制列表(ACL)使用,包括整数匹配、字符串匹配、正则匹配、IPv4地址匹配以及四层和七层匹配规则。通过ACL,可以根据请求和响应的不同部分实现服务内容的切换。例如,可以基于IP地址、HTTP头信息、内容长度等条件来选择后端服务器或执行特定操作。文章还提供了动静分离的示例,展示了如何利用ACL实现静态资源和动态请求的分离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 wait for 100 ms. Since clients are limited to

100 max, there cannot be more than 10 incoming mails per second.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值