zoukankan      html  css  js  c++  java
  • HAProxy(二):HAProxy的ACL规则实现智能负载均衡详解与示例

    一、HAProxy的ACL的功能

    ACL(Access Control List)访问控制列表,HAProxy中的ACL的匹配条件和控制条件有许多种,功能很强大,可以通过源地址、源端口、目标地址、目标端口、请求的资源类型、请求的主机等。

    acl格式:acl <aclname> <criterion> [flags] [operator] [<value>] 
    
      aclname:自定义acl的名称,必填项,只能是大小写、数字、'-''_''.''' 
    
      criterion:表示检查那些数据或内容,例如USERAGENT这个首部的值
        四个最为常用的criterion为:
          src:ip 源IP
          src_port:integer 源端口
          dst:ip 目标IP
          dst_port:integer 目标端口
      flags:定义控制条件,例如是否区分字符大小写等,flags的可选参数如下:
    
        -i 忽略字符大小写
    
        -m 启用特定的匹配方式,一般不用
    
        -n 禁止DNS反向解析
    
        -u 不允许aclname重复,默认是可以重名的,当两个acl的名称相同时,运算为或机制。
    
      operator:判断匹配条件,与<criterion>相比较的条件
    
        若匹配整数值:eq,ge,gt,le,lt
    
        若匹配字符串:
    
      value:访问控制的具体内容或值。value的类型如下:
    
        boolean:布尔值
    
        integer or integer range:整数或整数范围
    
        IP address/network:网络地址
    
        string(exact, substring, suffix, prefix, subdir, domain):字符串
    
        regular expression:正则表达式
    
        hex block

    上面的指令和参数都是为了设置或定义ACL的匹配条件的,即ACL仅仅只是将匹配条件进行分类归纳,而不进行处理。若要将定义好的ACL规则做处理,便需要下面的参数来设置:

    1.当符合指定的条件时使用特定的backend,<backend>表示设置的backend名,if和unless为判断条件,<condition>为比较的对象,可以是ACL规则,要注意的是在if和unless后面可以接两个ACL,默认表示两个ACL同时满足时才use_backend执行。格式如下:

    use_backend <backend> [{if | unless} <condition>] #Switch to a specific backend if/unless an ACL-based condition is matched.

    2.阻塞一个七层请求满足/不满足某一ACL匹配条件。格式如下:

    block { if | unless } <condition> #Block a layer 7 request if/unless a condition is matched

    例:

    acl invalid_src src 192.18.29.101  #acl匹配条件为源地址为192.18.29.101,acl名为invalid_src
    block if invalid_src          #阻断满足名为invalid_src的acl匹配条件
    errorfile 403 /etc/fstab       #并定义错误页

    3.配置七层的请求访问控制,与block阻塞不同,http-request更灵活,可做黑白名单控制。只能用在mode http中。

    http-request { allow | deny } [ { if | unless } <condition> ]

    4.配置四层的请求访问控制。

    tcp-request connection {accept|reject}  [{if | unless} <condition>]

    例:

    listen ssh
    bind :22022
    balance leastconn
    acl invalid_src src 172.16.200.2         #定义acl匹配规则
    tcp-request connection reject if invalid_src  #在四层拒绝满足名为invalid_src的acl匹配规则
    mode tcp
    server sshsrv1 172.16.100.6:22 check
    server sshsrv2 172.16.100.7:22 check        

     二、ACL示例

    要注意到的是acl关键字可用在frontend、listen、backend中,不能用在default中。

    例1:设置HAProxy状态页,只允许指定IP访问,设置如下:

    listen stats #定义名称
            bind *:9099 #监听在9099端口
            acl sta src 192.168.29.1 #匹配名为sta且源IP地址为192.168.29.1的ACL规则
            block if ! sta #阻断不匹配sta规则的所有条件,!为非
            stats enable #启用stats页
            stats uri /myhaproxy?admin #自定义stats页面uri
            stats realm "Hello World" 
            stats auth admin:admin #设置状态页登录账号和密码

    访问成功如下图,其他IP的主机是不能成功访问的

    例2:不适用block,使用http-request来达到例1的效果。

    在没有设置访问规则限制时,用IP为192.168.29.104的主机访问stats主页:

    提示错误401,只需输入账号密码即可访问,方法为:

    curl --basic -u admin:admin http://192.168.29.101:9099/myhaproxy?admin

    说明IP为29.104的主机可以访问,并无限制。

    添加限制后:

    listen stats #定义名称
            bind *:9099 #监听在9099端口
            acl sta src 192.168.29.1 #匹配名为sta且源IP地址为192.168.29.1的ACL规则
            http-request deny unless sta #拒绝除匹配sta规则以外的规则访问
            stats enable #启用stats页
            stats uri /myhaproxy?admin #自定义stats页面uri
            stats realm "Hello World" 
            stats auth admin:admin #设置状态页登录账号和密码

    再用IP为29.104的主机访问效果如下:

    此时错误为403,而29.1的主机是可以访问的(图太大了就省略了),说明ACL控制生效了。

    例3.七层规则匹配

    七层ACL规则匹配中,常用的参数是path,它用来做URL规则匹配,path包括以下参数:

    path : 精确匹配
    path_beg : 匹配字符串开头的所有内容
    path_dir : 子路径匹配
    path_dom : 
    path_end : 匹配字符串结尾的所有内容
    path_len : 字符串长度匹配
    path_reg : 正则表达式匹配
    path_sub : 域名子串匹配

     下面来举一个使用path的具体例子,选两台主机,安装Nginx并用Nginx虚拟为4台主机,两台用来处理图片请求,两台用来处理文本请求,利用HAProxy负载均衡的ACL控制机制实现,结构图如下:

    1.在192.168.29.102上添加监听8080端口的虚拟主机(安装的是Nginx),修改Nginx配置,在主配置中添加如下信息:

    server {
            listen       8080 default_server;
            listen       [::]:8080 default_server;
            server_name  _;
            root         /usr/share/nginx/html/test; #路径要修改,尽量不使用默认,尽量模拟为两台不同物理机的效果
    
            # Load configuration files for the default server block.
            include /etc/nginx/default.d/*.conf;
    
            location / {
            }
    
            error_page 404 /404.html;
                location = /40x.html {
            }
    
            error_page 500 502 503 504 /50x.html;
                location = /50x.html {
            }
        }

    2.在80端口的主机root目录下创建文件static.txt,内容为static 1;在8080端口主机root目录下创建文件static.txt,内容为static 2。重启Nginx服务,并确保能正常访问,如下图

    3.用同样的方法在192.168.29.103上创建分别监听在80和8080端口的虚拟主机,并在根目录下创建图片文件,确保能正常访问,如下图:

     4.在主机192.168.29.101上配置HAProxy

    frontend myweb
            bind *:80
            acl image path_end .png #匹配以.png结尾的path规则
            acl txt path_end .txt #匹配以.txt结尾的path规则
            use_backend imagesv if image #将规则image负载均衡到服务器组imagesv
            use_backend txtsv if txt  #将规则txt负载均衡至服务器组txtsv
            default_backend app #默认组,无匹配时负载均衡至此
    
    backend imagesv
            balance roundrobin
            server image1 192.168.29.103:80 check
            server image2 192.168.29.103:8080 check
    
    backend txtsv
            balance roundrobin
            server txt1 192.168.29.102:80 check
            server txt2 192.168.29.102:8080 check
    
    backend app
            balance leastconn
            cookie server insert  nocache
            server app1 192.168.29.102:80 check cookie svr1
            server app2 192.168.29.103:80 check cookie svr2

    配置完成后重启HAProxy,分别访问192.168.29.101/image.png和192.168.29.101/static.txt,并刷新,会发现内容会不停变化,如下图:

    这说明ACL规则培植成功,HAProxy会根据请求的结尾来判断负载均衡规则。

    总结:上面举了3个很简单的HAProxy ACL访问控制的例子,虽然例子中的配置很粗糙,但也可以初步领略到HAProxy有着比较智能的负载均衡功能,在后面的博客中我会更深入的介绍HAProxy的细节配置与调优

  • 相关阅读:
    C#listbox使用方法
    poj 3894 System Engineer (二分图最大匹配--匈牙利算法)
    Java实现 蓝桥杯VIP 算法训练 连接字符串
    Java实现 蓝桥杯VIP 算法训练 连接字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 黑白无常
  • 原文地址:https://www.cnblogs.com/readygood/p/9776403.html
Copyright © 2011-2022 走看看