haproxy 的ACL

acl:访问控制列表(ACL)的使用提供了一个灵活的解决方案来执行内容交换,并且通常基于从请求中提取的内容、响应或任何环境状态进行决策

ACL表达式

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

<aclname>: ACL名称,可使用字母 数字 : . - _ 区分字符大小写
<criterion>: 比较的标准和条件
<value>的类型:

(1) boolean
(2) integer or integer range
(3) IP address / network
(4) string (exact, substring, suffix, prefix, subdir,domain)
(5) regular expression
(6) hex block

<flags>

-i 不区分大小写
-m 使用指定的pattern匹配方法
-n 不做DNS解析
-u 强制每个ACL必须唯一ID,否则多个同名ACL或关系
– 强制flag结束. 当字符串和某个flag相似时使用

acl作为条件时的逻辑关系:
与:隐式(默认)使用
或:使用“or” 或 “||”表示
否定:使用“!“ 表示
示例:

if invalid_src invalid_port 与关系
if invalid_src || invalid_port 或
if ! invalid_src 非

<criterion> :各种条件

dst 目标IP
dst_port 目标PORT
src 源IP
src_port 源PORT

示例:

acl invalid_src src 172.16.100.200

<value>里string的类型

base : string
返回第一个主机头和请求的路径部分的连接,该请求从第一个斜杠开始,并在问号之前结束,对虚拟主机有用

<scheme>://<user>:<password>@<host>:<port>/<path>;<
params>?<query>#<frag>
base : exact string match
base_beg : prefix match
base_dir : subdir match
base_dom : domain match
base_end : suffix match
base_len : length match
base_reg : regex match
base_sub : substring match

path : string
提取请求的URL路径,该路径从第一个斜杠开始,并在问号之前结束(无主机部分)

<scheme>://<user>:<password>@<host>:<port>/<path>;<
params>?<query>#<frag>
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

url : string
提取请求中的URL。 一个典型的应用是具有预取能力的缓存,以及需要从数据库聚合多个信息并将它们保存在缓存中的网页门户入口

url : exact string match
url_beg : prefix match
url_dir : subdir match
url_dom : domain match
url_end : suffix match
url_len : length match
url_reg : regex match
url_sub : substring match

req.hdr([<name>[,<occ>]]) : string
提取在一个HTTP请求报文的首部

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

示例:

通过curl访问拒绝
acl bad_curl hdr_sub(User-Agent) -i curl
block if bad_curl

status : integer
返回在响应报文中的状态码

<value>里预定义ACL的类型

ACL名称等价于说明
TRUEalways_true总是匹配
FALSEalways_false从不匹配
HTTPreq_proto_http匹配HTTP协议
HTTP_1.0req_ver 1.0匹配HTTP协议1.0
HTTP_1.1req_ver 1.1匹配HTTP协议1.1
HTTP_CONTENThdr_val(content-length) gt 0匹配已存在内容长度
HTTP_URL_ABSurl_reg ^[^/:]*://匹配URL绝对路径
HTTP_URL_SLASH url_beg/匹配URL相对路径
HTTP_URL_STARurl *匹配 URL 等于 “*”
LOCALHOSTsrc 127.0.0.1/8匹配从localhost来的连接
METH_CONNECTmethod CONNECT匹配HTTP CONNECT方法
METH_GET methodGET HEADmatch HTTP GET or HEAD method
METH_HEADmethod HEADmatch HTTP HEAD method
METH_OPTIONSmethod OPTIONSmatch HTTP OPTIONS method
METH_POSTmethod POSTmatch HTTP POST method
METH_TRACEmethod TRACEmatch HTTP TRACE method
RDP_COOKIEreq_rdp_cookie_cnt gt 0match presence of an RDP cookie
REQ_CONTENTreq_len gt 0match data in the request buffer

使用

use_backend <backend> [{if | unless} <condition>]
当if/unless一个基于ACL的条件匹配时切换指定backend
block { if | unless } <condition>
阻止7层请求if/unless一个条件匹配

示例:

acl invalid_src src 172.16.200.2
block if invalid_src

禁止命令还可以使用

http-request { allow | deny |add-header <name> <fmt> |set-header <name> <fmt> } 
[ { if | unless }<condition> ]

如上例可以这样写

http-request deny invalid_src

下面是

frontend web *:80
    acl url_static path_beg -i /static /images /javascript /stylesheets
    acl url_static path_end -i .jpg .gif .png .css .js .html .txt .htm
    use_backend staticsrvs if url_static
    default_backend appsrvs

backend staticsrvs
    balance roundrobin
    server stcsrv1 172.16.100.6:80 check

backend appsrvs
    balance roundrobin
    server app1 172.16.100.7:80 check
    server app1 172.16.100.7:8080 check

listen stats
    bind :9091
    stats enable
    stats auth admin:admin
    stats admin if TRUE
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值