haproxy 的ACL

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nange_nice/article/details/78444793

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名称 等价于 说明
TRUE always_true 总是匹配
FALSE always_false 从不匹配
HTTP req_proto_http 匹配HTTP协议
HTTP_1.0 req_ver 1.0 匹配HTTP协议1.0
HTTP_1.1 req_ver 1.1 匹配HTTP协议1.1
HTTP_CONTENT hdr_val(content-length) gt 0 匹配已存在内容长度
HTTP_URL_ABS url_reg ^[^/:]*:// 匹配URL绝对路径
HTTP_URL_SLASH url_beg / 匹配URL相对路径
HTTP_URL_STAR url * 匹配 URL 等于 “*”
LOCALHOST src 127.0.0.1/8 匹配从localhost来的连接
METH_CONNECT method CONNECT 匹配HTTP CONNECT方法
METH_GET method GET HEAD match HTTP GET or HEAD method
METH_HEAD method HEAD match HTTP HEAD method
METH_OPTIONS method OPTIONS match HTTP OPTIONS method
METH_POST method POST match HTTP POST method
METH_TRACE method TRACE match HTTP TRACE method
RDP_COOKIE req_rdp_cookie_cnt gt 0 match presence of an RDP cookie
REQ_CONTENT req_len gt 0 match 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

猜你喜欢

转载自blog.csdn.net/nange_nice/article/details/78444793
ACL
今日推荐