一、ACL介绍
访问控制列表ACL,Access Control Lists) 是一种基于包过滤的访问控制技术 它可以根据设定的条件对经过服务器传输的数据包进行过滤(条件匹配)即对接收到的报文进行匹配和过 滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内 容进行匹配并执行进一步操作,比如允许其通过或丢弃。
1、ACL配置选项
2、ACL-Name 名称
acl test path_end -m sub /a
#ACL名称,可以使用大字母A-Z、小写字母a-z、数字0-9、冒号:、点.、中横线和下划线,并且严格区分大 小写,比如:my_acl和My_Acl就是两个完全不同的acl5.8.1.2 ACL-criterion
3、ACL-criterion 匹配规范
定义ACL匹配规范,即:判断条件
hdr string,提取在一个HTTP请求报文的首部
hdr ([<name> [, <occ>]]):完全匹配字符串,header的指定信息, 表示在多值中使用的值的出 现次数
hdr_beg ([<name> [, <occ>]]):前缀匹配,header中指定匹配内容的begin
hdr_end ([<name> [, <occ>]]):后缀匹配,header中指定匹配内容end
hdr_dom ([<name> [, <occ>]]):域匹配,header中的dom(host)
hdr_dir ([<name> [, <occ>]]):路径匹配,header的uri路径
hdr_len ([<name> [, <occ>]]):长度匹配,header的长度匹配
hdr_reg ([<name> [, <occ>]]):正则表达式匹配,自定义表达式(regex)模糊匹配
hdr_sub ([<name> [, <occ>]]):子串匹配,header中的uri模糊匹配 模糊匹配c 报文中a/b/c也会匹 配
4、ACL-flags匹配模式
-i 不区分大小写
-m 使用指定的正则表达式匹配方法
-n 不做DNS解析
-u 禁止acl重名,否则多个同名ACL匹配或关系
5、ACL-operator具体操作符
整数比较: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进行 匹配
6、ACL-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.timinglee.org
exact #精确比较
substring #子串
suffix #后缀比较
prefix #前缀比较
subdir #路径, /wp-includes/js/jquery/jquery.js
domain #域名,www.timinglee.org
- regular expression #正则表达式
- hex block #16进制
7、多个ACL的组合调用方式
多个ACL的逻辑处理:
与:隐式(默认)使用
或:使用“or" 或 “||"表示
否定:使用 "!" 表示
多个ACL调用方式:
#示例:
if valid_src valid_port #与关系,ACL中A和B都要满足为true,默认为与
if invalid_src || invalid_port #或,ACL中A或者B满足一个为true
if ! invalid_src #非,取反,不满足ACL才为true
二、域名匹配
1、编辑haproxy.cfg配置文件
vim /etc/haproxy/haproxy.cfg
重启服务:
systemctl restart haproxy.service
2、测试结果
测试主机作本地解析:
vim /etc/hosts
测试结果:
三、基于源IP或子网调度访问
将指定的源地址调度至指定的web服务器组。
1、编辑haproxy.cfg配置文件
vim /etc/haproxy/haproxy.cfg
重启服务:
systemctl restart haproxy.service
2、测试结果
四、基于源地址的访问控制
拒绝指定IP或者IP范围访问
1、编辑haproxy.cfg配置文件
vim /etc/haproxy/haproxy.cfg
重启服务:
systemctl restart haproxy.service
2、测试
五、匹配浏览器类型
匹配客户端浏览器,将不同类型的浏览器调动至不同的服务器组
1、编辑haproxy.cfg配置文件
vim /etc/haproxy/haproxy.cfg
重启服务:
systemctl restart haproxy.service
2、测试
浏览器中测试(跳转到百度页面):
六、基于文件后缀名实现动静分离
1、编辑haproxy.cfg配置文件
vim /etc/haproxy/haproxy.cfg
重启服务:
systemctl restart haproxy.service
2、测试
[root@webserver1 ~]# echo css 172.25.254.10 > /usr/share/nginx/html/index.php
[root@webserver2 ~]# echo php 172.25.254.20 > /var/www/html/index.css
[root@node10 ~]# curl 172.25.254.100/index.php
php 172.25.254.10
[root@node10 ~]# curl 172.25.254.100/index.css
css 172.25.254.20
七、匹配访问路径实现动静分离
1、编辑haproxy.cfg配置文件
重启服务:
systemctl restart haproxy.service
2、测试
[root@webserver1 ~]# mkdir /usr/share/nginx/html/static
[root@webserver1 ~]# echo static 172.25.254.10 > /usr/share/nginx/html/static/index.html
[root@webserver2 ~]# mkdir /var/www/html/api/
[root@webserver2 ~]# echo api 172.25.254.20 > /var/www/html/api/index.html
[root@webserver1 ~]# curl 172.25.254.100/api/api 172.25.254.20
[root@webserver1 ~]# curl 172.25.254.100/static/
static 172.25.254.10