1. ACL:访问控制列表(ACL,Access Control Lists)是一种基于包过滤的访问控制技术,它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配),即对接收到的报文进行匹配和过滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内容进行匹配并执行进一步操作,比如允许其通过或丢弃。
2. Haproxy中ACL的配置语法及参数:
acl语法:
acl <aclname> <criterion> [flags] [operator] [<value>]
acl 该条acl规则的名称 匹配规范 匹配模式 具体操作符 操作对象类型
3. 环境规划:
| 主机名 | 主机地址 | 角色 |
| node1 | 192.168.188.11 | 负载均衡调度器 |
| node2 | 192.168.188.12 | 后端服务器1 |
| node3 | 192.168.188.13 | 后端服务器2 |
| node4 | 192.168.188.14 | 测试服务器 |
4. ACL示例--域名匹配:
1>. 配置Haproxy配置文件,这里使用子配置文件的方式配置:
[root@node1 ~]# cd /etc/haproxy/conf.d/
[root@node1 conf.d]# vim acltest1.cfg
frontend acltest1 ##前端配置
bind :80
mode http
log global
###########定义acl规则#########
acl domacl_one hdr_dom(host) -i xian.yunjisuan.com
acl domacl_two hdr_dom(host) -i chengdu.yunjisuan.com
##########调用acl规则#########
use_backend domcalone_host if domacl_one
use_backend domcaltwo_host if domacl_two
default_backend domcalone_host
############配置后端##########
backend domcalone_host
mode http
server web1 192.168.188.12:80 check
backend domcaltwo_host
mode http
server web2 192.168.188.13:80 check
##重启haproxy
[root@node1 conf.d]# systemctl restart haproxy.service
解析配置:1. 当访问域名为" xian.yunjisuan.com "的主机时,会匹配到" domacl_one "该条acl规则;如果该条acl规则成立,则调用名为" domcalone_host "的后端配置。
2. 当访问域名为" chengdu.yunjisuan.com "的主机时,会匹配到" domacl_two "该条acl规则;如果该条acl规则成立,则调用名为" domcaltwo_host "的后端配置。
3. 如果不满足以上两条acl,则默认调用名为" domcaltwo_host "的后端配置。
2>. 配置windows的域名解析:
在" C:\Windows\System32\drivers\etc\hosts "中添加域名解析"192.168.188.11 xian.yunjisuan.com chengdu.yunjisuan.com"。
3>. 配置后端访问页面,node2和node3配置一致:
[root@node2 ~]# yum install httpd -y
[root@node2 ~]# echo "`hostname -I`" > /var/www/html/index.html
[root@node2 ~]# systemctl start httpd
4>. 通过浏览器访问,测试haproxy acl是否配置成功:
5. ACL示例--基于源IP或子网调度访问:
1>. 配置Haproxy配置文件,这里使用子配置文件的方式配置:
[root@node1 conf.d]# vim acltest2.cfg
frontend acltest2
bind :80
mode http
log global
########acl set########
acl domacl1 hdr_dom(host) -i xian.yunjisuan.com
acl domacl2 hdr_dom(host) -i chengdu.yunjisuan.com
acl srcacl src 192.168.188.0/24
########acl host#######
use_backend backend_one if srcacl
use_backend backend_one if domacl1
use_backend backend_two if domacl2
######backend host#####
backend backend_one
mode http
server web1 192.168.188.12:80 check
backend backend_two
mode http
server web2 192.168.188.13:80 check
解析配置:1. 如果是通过源IP为" srcacl "该条acl规则中的网段访问的,就调用名为" backend_one "的后端配置,该条配置会优先生效。
2. 当访问域名为" xian.yunjisuan.com "的主机时,会匹配到" domacl1 "该条acl规则;如果该条acl规则成立,则调用名为" backend_one "的后端配置。
3. 当访问域名为" chengdu.yunjisuan.com "的主机时,会匹配到" domacl2 "该条acl规则;如果该条acl规则成立,则调用名为" backend_two"的后端配置。
2>. 通过浏览器访问,测试haproxy acl是否配置成功:

6. ACL示例--源地址的访问控制:
1>. 配置Haproxy配置文件,这里使用子配置文件的方式配置:
[root@node1 conf.d]# vim acltest3.cfg
frontend acltest3
bind :80
mode http
log global
#######acl set#######
acl deny_acl src 192.168.188.11/24 ##拒绝指定ip或者指定网段访问
#######acl host######
http-request deny if deny_acl ##定义拒绝访问的acl规则的语法
default_backend default1_host
#####backend hosts###
backend default1_host
mode http
server web1 192.168.188.12:80 check
backend default2_host
mode http
server web2 192.168.188.13:80 check
配置解析:1. 如果访问的源地址是" deny_acl "的acl规则,就拒绝其访问。
2. 如果没有匹配的acl规则,就匹配" default1_host "的后端配置。
拒绝访问的acl规则的语法:" http-request deny ACL调用方式 ACL规则名称 "。
2>. 通过浏览器访问,测试haproxy acl是否配置成功:

7. ACL示例 -- 基于文件后缀名实现动静分离:
1>. 配置Haproxy配置文件,这里使用子配置文件的方式配置:
[root@node1 conf.d]# vim acltest4.cfg
frontend acltest4
bind :80
mode http
log global
#####acl set#####
acl static_page path_end .jpg .jpeg .png .gif .html
acl update_page path_end .php
#####acl host####
use_backend static_host if static_page
use_backend update_host if update_page
default_backend update_host
###backend hosts##
backend static_host
mode http
server web1 192.168.188.12:80 check
backend update_host
mode http
server web2 192.168.188.13:80 check
配置解析:1. 如果访问的请求的URL路径的后缀名为" .jpg .jpeg .png .gif .html ",就匹配名为" static_page "的acl规则,如果条件成立,则调用名为" static_host "的后端配置,即静态配置。
2. 如果访问的请求的URL路径的后缀名为" .php ",就匹配名为" update_page "的acl规则,如果条件成立,则调用名为" update_host "的后端配置,即动态配置。
3. 如果没有匹配的acl规则,则默认调用名为" update_host "的后端配置。例如:如果访问192.168.188.11/test.jsp,就相当于访问192.168.188.13/test.jsp。
2>. 配置后端服务器页面:
##这里就通过简单的页面分别代替静态页面和动态页面
[root@node2 ~]# echo "this is static page" > /var/www/html/test.html
[root@node3 ~]# echo "this is update page" > /var/www/html/test.php
3>. 通过浏览器访问,测试haproxy acl是否配置成功:



8. ACL -- 匹配访问路径实现动静分离:
1>. 配置Haproxy配置文件,这里使用子配置文件的方式配置:
[root@node1 conf.d]# vim acltest5.cfg
frontend acltest5
bind :80
mode http
log global
#############acl set############
acl static_page path_beg -i /static
acl update_page path_beg -i /update
#############acl host##########
use_backend static_hosts if static_page
use_backend update_hosts if update_page
default_backend update_hosts
#############backend hosts######
backend static_hosts
mode http
server web1 192.168.188.12:80 check
backend update_hosts
mode http
server web1 192.168.188.13:80 check
配置解析:1. 如果请求的URL以" /static "开头,则匹配名为" static_page "的ACL规则,调用名为" static_hosts "的后端配置,访问定义的后端服务器的http://192.168.188.12/static。
2. 如果请求的URL以" /update "开头,则匹配名为" update_page "的ACL规则,调用名为" update_hosts "的后端配置,访问定义的后端服务器的http://192.168.188.13/update。
3. 如果没有匹配的ACL规则,则默认调用名为" update_hosts "的后端配置。
2>. 后端访问页面配置:
[root@node2 ~]# mkdir /var/www/html/static/
[root@node2 ~]# echo "static_page" > /var/www/html/static/index.html
[root@node3 ~]# mkdir /var/www/html/update/
[root@node3 ~]# echo "update_page" > /var/www/html/update/index.html
3>. 通过浏览器访问,测试haproxy acl是否配置成功:

9. 自定义Haproxy的错误页面:
[root@node1 ~]# vim /etc/haproxy/haproxy.cfg
defaults
.......
##errorfile 错误状态码 展示的错误页面
errorfile 503 /usr/local/haproxy/html/503.http
.......
##配置错误页面:
[root@node1 ~]# mkdir /usr/local/haproxy/html
[root@node1 ~]# vim 503.http
HTTP/1.1 503 Service Unavailable
Content-Type:text/html;charset=utf-8
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>报错页面</title>
</head>
<body>
<center><h1>网站维护中......请稍侯再试</h1></center>
<center><h2>联系电话:400-123-4567</h2></center>
<center><h3>503 Service Unavailable</h3></center>
</body>
##重启haproxy
[root@node1 ~]# systemctl stop haproxy.service
模拟503异常,将两个后端服务器节点的服务全部停止。
[root@node2 ~]# systemctl stop httpd.service
[root@node3 ~]# systemctl stop httpd.service
通过浏览器再次访问负载调度器:

10. 配置基于http的重定向:
1>. 配置文件配置内容:
[root@node1 ~]# vim /erc/haproxy/haproxy.cfg
defaults
........
##errorloc 错误状态码 要转发到的地址
errorloc 503 http://192.168.188.14/error_page/503.html
........
2>. 转发的页面配置:
[root@node4 ~]# mkdir /var/www/html/error_page
[root@node4 ~]# vim /var/www/html/error_page/503.html
<!DOCTYPE html>
<html lang="en">
<head>
<title>报错页面</title>
</head>
<body>
<center><h1>网站维护中......请稍侯再试</h1></center>
<center><h2>联系电话:400-123-4567</h2></center>
<center><h3>503 Service Unavailable</h3></center>
</body>
3>. 模拟503异常,将两个后端服务器节点的服务全部停止:
[root@node2 ~]# systemctl stop httpd.service
[root@node3 ~]# systemctl stop httpd.service
4>. 通过浏览器再次访问负载调度器:

发现当访问192.168.188.11时,已经发生了转发。
本文详细介绍了如何使用Haproxy的ACL功能进行访问控制,包括基于域名、源IP、源地址、文件后缀名和URL路径的匹配策略,以及配置错误页面和实现HTTP重定向。通过示例展示了ACL在域名调度、动静分离、访问控制和故障处理中的应用。
247

被折叠的 条评论
为什么被折叠?



