Haproxy的ACL配置及案例

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

1.  ACL:访问控制列表(ACL,Access Control Lists)是一种基于包过滤的访问控制技术,它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配),即对接收到的报文进行匹配和过滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内容进行匹配并执行进一步操作,比如允许其通过或丢弃。

2.  Haproxy中ACL的配置语法及参数:

acl语法:
acl    <aclname>      <criterion>  [flags]  [operator]  [<value>]
acl 该条acl规则的名称    匹配规范   匹配模式  具体操作符  操作对象类型

3.  环境规划:

主机名主机地址角色
node1192.168.188.11负载均衡调度器
node2192.168.188.12后端服务器1
node3192.168.188.13后端服务器2
node4192.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时,已经发生了转发。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值