ACL实践
1、什么是ACL
主要对请求报文和响应报文进行匹配和过滤。其配置法则通常分为两步:首先定义 ACL 规则,即定义一个测试条件,条件可以是请求报文中的源地址、源端口、目标地址、目标端口、请求方法、URL 、文件后缀等;然后在条件得到满足时执行相应的动作;比如阻止请求、又或着转发请求至某特定的后端。
#ACL语法
acl <aclname> <criterion> [flags] [operator] [<value>]#acl名称
#acl 名称 条件 条件标记位 具体操作符 操作对象
#ACL示例
acl my_chrome hdr(User-Agent) -m sub -i Chrom
<aclname> : ACL名称,可使用字母数字;﹒-_区分字符大小写
<criterion>:比较的标准和条件
'基于源地址、源端口、目标地址、目标端口: src、src_port、dst、dst_port
'基于 Header信息比对:hdr、hdr_beg、hdr_end、hdr_dom
'基于路径或后缀比对: path_beg、path_end
'基于请求的方法比对: method
<flags>:条件标记
'-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讲行匹配
<value>:条件目标
'布尔值: 比如,false,true
'整数或整数范围,比如用于匹配端口范围 1024~32768
'I地址或IP范围: 192.168.0.1~192.168.0.1/24
'字符串: 比如匹配URL 路径,/static、/images
2、条件判断
其实就是acl中的条件匹配,不同的值不同的用法
3、ACL逻辑关系
多个acl作为条件时的逻辑关系:
'与:默认,如if acl1 ac12表示满足第一个的同时要满足第二acl此条件才为真
'或:使用or或|表示,如if acl1 || acl2表示满足acl1或ac12中的任意一个此条件就为真
'非:使用!表示,如if ! acl1表示对该ACL取相反的操作,意思就是非该ACL此条件为真1
4、ACL访问控制
配置七层的请求访问控制;只能用在mode http中;
http-request { allow | deny} [ {if | unless }<condition> ]
示例:仅允许10.0.0.1访问haproxy的 stats
listen haproxy-stats
bind *:9999
stats enable
stats hide-version
stats uri /haproxy ?stats
stats realm "HAProxy statistics "stats auth admin:123456
stats admin if TRUE
acl all_ip src 10.0.0.1 #定义acl
http-request deny if ! all_ip #不匹配all_ip的地址全部拒绝访问
配置四层的请求访问控制;只能用在 mode tcp 中;
tcp-request connection {acceptlreject} [if | unless }<condition>]
示例:拒绝来源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 invalidiIsrc src 172.16.1.1 # 定义acl匹配规则
tcp-request connection reject if invalid_src # 在四层拒绝满足名为invaLla_src 的 acl 匹配规则
5、实例
1. 基于域名调度
根据用户请求的不同域名,调到不同的后端集群
用户请求www.oldzhang.com 调度到 172.16.1.7:80;172.16.1.8:80
用户请求java.oldzhang.com 调度到 172.16.1.7:8080;172.16.1.8:8080
2.基于设备调度
根据用户请求的user-agent,调到不同的后端集群
用户请求chrom 调度到 172.16.1.7:80
用户请求firefox 调度到 172.16.1.8:80
3.基于路径调度
根据用户请求的URL,调到不同的后端集群
用户请求/static 调度到 172.16.1.7:80
用户请求/user 调度到 172.16.1.8:80
4.基于后缀调度
根据用户请求的后缀,调到不同的后端集群
用户请求.txt 调度到 172.16.1.7:80
用户请求.pdf 调度到 172.16.1.8:80
6、场景
6.1.haproxy实现mysql负载均衡
用户请求3306端口,调度到172.16.1.7:3306 172.16.1.8:3306
6.2.haproxy实现HTTP负载均衡
用户请求www.oldzhang.com,调度到172.16.1.7:80 172.16.1.8:80
6.3.haproxy实现HTTPS负载均衡
用户通过http请求,自动跳转到https
与后端web_cluster 集群通过http协议通讯
web_cluster 集群中的节点:172.16.1.7:80 172.16.1.8:80
keepalived: 虚拟地址漂移技术
本文来自博客园,作者:kirin(麒麟),转载请注明原文链接:https://www.cnblogs.com/kirin365/articles/16137626.html