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的细节配置与调优

  • 相关阅读:
    Steve Jobs 2005年于 Stanford University 毕业典礼上的演讲
    欧姆龙血糖仪HEA214换购备忘
    (转载)2011年高考作文之《时间在流逝》(安徽考生)
    2012年部分节假日安排(转载)
    乔布斯语录(转载)
    欢乐谷一日游
    上海公交投诉电话:12319
    中国公路“买路钱”应该怎么管?(转载)
    C#操作excel
    SQL Server数据库对列的操作
  • 原文地址:https://www.cnblogs.com/readygood/p/9776403.html
Copyright © 2011-2022 走看看