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