1、ACL基本概述
1.1、什么是ACL
ACL主要对请求报文和响应报文进行匹配和过滤,其配置法则通常分为两步
首先定义ACL规则,即定义一个测试条件,条件可以是请求报文的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等
然后在条件得到满足时执行相应的动作,比如阻止请求、又或者转发请求至某特定的后端
1.2、ACL定义方法
#ACL语法
acl [flags] [operator] [] ...
#acl 名称 条件 条件标记位 具体操作符 操作对象类型
#ACL示例:如果请求的User-Agent中包含Chrome且忽略大小写,规则则成立
acl my_chrome hdr(User-Agent) -m sub -i Chrom
:ACL名称,可使用字母数字:.-_区分字符大小写
:比较的标准和条件
基于源地址、源端口、目标地址、目标端口:src、src_port、dst、dst_port
基于Header信息比对:hdr、hdr_beg、hdr_end、hdr_dom
基于路径或后缀比对:path_beg、path_end
基于请求的方法比对:method
:条件标记
-i 不区分大小写
-m 使用pattern匹配方法
-n 不做DNS解析
-u 禁止acl重名,否则多个同名的ACL为或的关系
[operator]:条件筛选
-eq、-ne、-ge、-le、-gt、-lt
(-m str):字符串必须完全匹配模式
(-m sub):在提取的字符串中查找,如果其中任何一个被发现,ACl将匹配
(-m beg):在提取的字符串首部中进行查找,如果其中任何一个被发现,ACl将匹配
(-m end):在提取的字符串尾部中进行查找,如果其中任何一个匹配,则ACl进行匹配
(-m dir):提取用斜线/分隔的字符串,如果其中任何一个匹配,则ACl进行匹配
(-m dom):提取用点的.分隔字符串,如果其中任何一个匹配,则ACl进行匹配
:条件目标
布尔值:不如false、true
整数或整数范围,比如用于匹配端口范围:1023~32768
IP地址或IP范围:192.168.0.1~192.168.0.1/24
字符串:比如匹配URL路径,/static、/images
1.3、ACL匹配示例
1.3.1、src
src : 用于测试请求的源地址是否与中定义的源地址一直
#示例:匹配请求源地址是10.0.0.1、或192.168.1.0/24网段
acl deny_src_ip src 10.0.0.1 192.168.1.0/24
1.3.2、dest
dest : 用于测试请求的目标地址是否与中定义的地址一致
dest_port : 用于测试请求的目标端口是否与中定义的端口一致
1.3.3、path_beg
path_beg :用于测试请求的URL是否以指定的模式开头
# 示例:测试URL是否以/static、/images、/javascript
acl url_static path_beg -i /static /images /javascript
1.3.4、path_end
path_end :用于测试请求的URL是否以指定的模式结尾
# 示例:下面的例子用户测试URL是否以jpg、gif、png、css或js结尾
acl url_static path_end -i .jpg .gif .png .css .js
1.3.5、hdr_beg
hdr_beg :用于测试请求报文的指定首部的开头部分是否符合指定的模式
# 示例:测试请求的host开头是否为 img、video、static
acl host_static hdr_beg(host) -i img. video. static.
1.3.6、hdr_end
hdr_end : 用于测试请求报文的指定首部的结尾部分是否符合指定的模式
# 示例: 测试请求的host的结尾是否为 .com .net .cn
acl host_static hdr_end(host) -i .com .net .cn
1.3.7、hdr_dom
hdr_dom(host): 用于测试请求的host名称
# 示例: 测试请求的host是否为 www.qingchen.cn
acl my_www_host hdr_dom(host) -i www.qingchen.cn
acl my_blog_host hdr_dom(host) -i blog.qingchen.cn
use_backend www_cluster if my_www_host
use_backend blog_cluster if my_blog_host
1.3.8、hdr
hdr : 用于测试请求头部首部指定内容
# 示例: 测试请求的User-Agent是否为Chrome
acl my_chrome hdr(User-Agent) -m sub -i Chrome
1.4、ACL逻辑关系
多个acl作为条件时的逻辑关系:
与:默认,如if acl1 acl2 表示同时满足第一个acl的同时要满足第二acl此条件为真
或:使用or或者||表示,如if acl1 || acl2表示满足acl1或acl2中的任意一个此条件就为真
非:使用!表示,如if ! acl2表示对该ACl取相反的操作,意思就是非该ACL此条件为真
1.5、ACL访问控制
1.5.1、基于HTTP访问控制
配置七层的请求访问控制,只能用在mode http中
http-request { allow | deny } [ { if | unless } ]
示例:仅允许10.0.0.1访问haproxy的stats
listen haproxy-stats
mode http
bind *:7777
stats enable # 启用stats功能
stats refresh 2s # 设定自动刷新时间间隔
stats hide-version # 隐藏haproxy版本
stats uri /haproxy?stats # stats页面的访问路径
stats realm "HAProxy stats" # 认证提示信息
stats auth admin:123456 # 认证的账号和密码
stats admin if TRUE # 启用管理功能
#除10.0.0.1以外的用户全部拒绝
acl all_ip src 10.0.0.1
http-request deny if ! all_ip
#拒绝使用curl
acl method_curl hdr(User-Agent) -m sub -i curl
http-request deny if method_curl || !all_ip
1.5.2、基于TCP访问控制
配置四层的请求访问控制,只能用在mode tcp中
tcp-request connection { accept | reject } [ { if | unless } ]
示例:拒绝来源tcp应用,比如SSH
listen ssh
bind *:2222
mode tcp
balance roundrobin
server sshsrv1 172.16.1.7:22 check
server sshsrv2 172.16.1.8:22 check
acl invalid_src src 172.16.1.9 #定义acl匹配规则
tcp-request connection reject if invalid_src #在四层拒绝满足名为invalid_src的acl匹配规则
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
青蛙跳台 原理:一只青蛙跳n个台阶,青蛙可以一次性跳1个台阶,也可以跳2个台阶,问,有多少种跳法,可以跳过n个台阶。 分析:青蛙…