1、ACL
访问控制列表(ACL,Access Control Lists)是一种基于包过滤的访问控制技术,它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配),即对接收到的报文进行匹配和过滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内容进行匹配并执行进一步操作,比如允许其通过或丢弃。
官方帮助:
http://cbonte.github.io/haproxy-dconv/2.1/configuration.html#7
http://cbonte.github.io/haproxy-dconv/2.0/configuration.html#7
1.1、ACL的配置选项
acl <aclname> <criterion> [flags] [operator] [<value>]
acl 名称 匹配规范 匹配模式 具体操作符 操作对象类型
ACL-Name
#ACL名称,可以使用大字母A-Z、小写字母a-z、数字0-9、冒号:、点.、中横线和下划线,并且严格区分大小写,比如:my_acl和My_Acl就是两个完全不同的acl
ACL-criterion
#定义ACL匹配规范,即:判断条件
hdr string #提取在一个HTTP请求报文的首部
hdr([<name> [,<occ>]]) #完全匹配字符串,header的指定信息,<occ> 表示在多值中使用的值的出现次数
hdr_beg([<name> [,<occ>]]) #前缀匹配,header中指定匹配内容的begin
hdr_end([<name> [,<occ>]]) #后缀匹配,header中指定匹配内容end
hdr_dom([<name> [,<occ>]]) #域匹配,header中的domain name
hdr_dir([<name> [,<occ>]]) #路径匹配,header的uri路径
hdr_len([<name> [,<occ>]]) #长度匹配,header的长度匹配
hdr_reg([<name> [,<occ>]]) #正则表达式匹配,自定义表达式(regex)模糊匹配
hdr_sub([<name> [,<occ>]]) #子串匹配,header中的uri模糊匹配
#提取请求的URL路径,该路径从第一个斜杠开始,并在问号之前结束(无主机部分)
path_end : suffix match #请求的URL中资源的结尾,如 .gif .png .css .js .jpg .jpeg
dst #目标IP
dst_port #目标PORT
src #源IP
src_port #源PORT
ACL-flags
#ACL的匹配模式
-i 不区分大小写
-m 使用指定的pattern匹配方法
-n 不做DNS解析
-u 禁止acl重名,否则多个同名ACL匹配或关系
ACL-operator
#ACL的操作符
整数比较:eq、ge、gt、le、lt
字符比较:
- exact match (-m str) :字符串必须完全匹配模式
- substring match (-m sub) :在提取的字符串中查找模式,如果其中任何一个被发现,ACL将匹配
- prefix match (-m beg) :在提取的字符串首部中查找模式,如果其中任何一个被发现,ACL将匹配
- suffix match (-m end) :将模式与提取字符串的尾部进行比较,如果其中任何一个匹配,则ACL进行匹配
- subdir match (-m dir) :查看提取出来的用斜线分隔(“/")的字符串,如其中任一个匹配,则ACL进行匹配
- domain match (-m dom) :查找提取的用点(“.")分隔字符串,如果其中任何一个匹配,则ACL进行匹配
ACL-value
#value的类型
The ACL engine can match these types against patterns of the following types :
- Boolean #布尔值
- integer or integer range #整数或整数范围,比如用于匹配端口范围
- IP address / network #IP地址或IP范围, 192.168.0.1 ,192.168.0.1/24
- string--> www.magedu.com
exact #精确比较
substring #子串
suffix #后缀比较
prefix #前缀比较
subdir #路径, /wp-includes/js/jquery/jquery.js
domain #域名,www.magedu.com
- regular expression #正则表达式
- hex block #16进制
1.2、使用haproxy的ACL实现基于文件后缀名的动静分离
1.2.1、动态服务器配置(10.0.0.101)
root@dynamic:~# apt -y install apache2 php php-fpm
root@dynamic:~# vim /var/www/html/index.php
10.0.0.101
<?php
phpinfo();
?>
1.2.2、静态服务器配置(10.0.0.102)
root@static:~# apt -y install nginx
root@static:~# echo "Welcome to static page `hostname -I`" > /var/www/html/index.html
#网上找一些静态文件放到/var/www/html/这个目录下
root@static:/var/www/html# ls
a.jpg b.png index.html index.nginx-debian.html test.css
1.2.3、haproxy服务器配置(10.0.0.100)
这里的环境我还是按照前面文章的环境,在上面的环境修改配置即可。
root@haproxy:~# vim /etc/haproxy/conf.d/zg_web_80.cfg
root@haproxy:~# cat /etc/haproxy/conf.d/zg_web_80.cfg
frontend zg_web_80
bind 10.0.0.100:80
mode http
balance roundrobin
acl acl_dynamic path_end -i .php
acl acl_static path_end -i .jpg .gif .png .css .js .jpeg .html
use_backend dynamic_hosts if acl_dynamic
use_backend static_hosts if acl_static
backend dynamic_hosts
mode http
server 10.0.0.101 10.0.0.101:80 weight 1 check inter 3000 fall 2 rise 5
backend static_hosts
server 10.0.0.102 10.0.0.102:80 weight 1 check inter 3000 fall 2 rise 5
#重新加载一下配置文件
root@haproxy:~# systemctl reload haproxy
1.2.4、使用浏览器访问测试
1.3、使用haproxy的ACL实现基于文件路径来实现的动静分离
1.3.1、在后端服务器创建好相关目录
haproxy在基于文件路径来实现动静分离上的具体操作与基于文件后缀的方式大体相同,不同的是在进行匹配规范时要用到path_beg,它表示请求的uri开头,比如/static、/images、/css等等。这里我创建/static、/images、/css做为静态文件路径,创建/api作为动态的文件路径。
root@dynamic:~# mkdir /var/www/html/{static,images,css,api}
root@dynamic:~# echo "Welcome to `hostname -I` static page" > /var/www/html/static/index.html
root@dynamic:~# echo "Welcome to `hostname -I` images page" > /var/www/html/images/index.html
root@dynamic:~# echo "Welcome to `hostname -I` css page" > /var/www/html/css/index.html
root@dynamic:~# echo "Welcome to `hostname -I` api page" > /var/www/html/api/index.html
root@static:~# mkdir /var/www/html/{static,images,css,api}
root@static:~# echo "Welcome to `hostname -I` static page" > /var/www/html/static/index.html
root@static:~# echo "Welcome to `hostname -I` images page" > /var/www/html/images/index.html
root@static:~# echo "Welcome to `hostname -I` css page" > /var/www/html/css/index.html
root@static:~# echo "Welcome to `hostname -I` api page" > /var/www/html/api/index.html
1.3.2、在haproxy服务器配置ACL规则
当请求uri开头为/static、/images、/css的判定为acl_static,当请求uri开头为/api的为acl_dynamic,这些规则只要有一个成立就可以了。
root@haproxy:~# vim /etc/haproxy/conf.d/zg_web_80.cfg
frontend zg_web_80
bind 10.0.0.100:80
mode http
balance roundrobin
acl acl_dynamic path_beg /api
acl acl_dynamic path_end -i .php
acl acl_static path_beg /static /images /css
acl acl_static path_end -i .jpg .gif .png .css .js .jpeg .html
use_backend dynamic_hosts if acl_dynamic
use_backend static_hosts if acl_static
backend dynamic_hosts
mode http
server 10.0.0.101 10.0.0.101:80 weight 1 check inter 3000 fall 2 rise 5
backend static_hosts
server 10.0.0.102 10.0.0.102:80 weight 1 check inter 3000 fall 2 rise 5
root@haproxy:~# systemctl reload haproxy.service