作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.ACL概述
acl:
对接收到的报文进行匹配和过滤,基于请求报文头部中的源地址、源端口、目标地址、目标端口、请求方法、URL、文件后缀等信息内容进行匹配并执行进一步操作。
官方文档:http://cbonte.github.io/haproxy-dconv/1.8/configuration.html#7
ACL语法如下:
acl <aclname> <criterion> [flags] [operator] [<value>] ...
acl 名称 条件 条件标记位 具体操作符 操作对象类型
示例:
acl my_acl hdr_dom(host) -i node106.yinzhengjie.org.cn
1>.ACL名称
可以使用大字母(A-Z),小写字母(a-z),冒号(":"),点("."),中横线("-")和下划线("_");并且严格区分大小写,比如"my_acl"和"My_acl"完全是两个不同的acl。
2>.ACL derivatives
hdr([<name> [,<occ>]]):
完全匹配字符串
hdr_beg([<name> [,<occ>]]):
前缀匹配
hdr_dir([<name> [,<occ>]]):
路径匹配
hdr_dom([<name> [,<occ>]]):
域匹配
hdr_end([<name> [,<occ>]]):
后缀匹配
hdr_len([<name> [,<occ>]]):
长度匹配
hdr_reg([<name> [,<occ>]]):
正则表达式匹配
hdr_sub([<name> [,<occ>]]):
子串匹配
3>.Criterion-acl
<criterion> :
匹配条件
dst:
目标IP
dst_port:
目标PORT
src:
源IP
src_port:
源PORT
hdr <string>:
用于测试请求头部首部指定内容
hdr_dom(host):
请求的host名称,如www.yinzhengjie.org.cn
hdr_beg(host):
请求的host开头,如www. img. video. download. ftp.
hdr_end(host):
请求的host结尾,如.com .net .cn
path_beg:
请求的URL开头,如/static、/images、/img、/css
path_end:
请求的URL中资源的结尾,如.gif .png .css .js .jpg .jpeg
4>.flags
<flags>:
-条件标记
-i:
不区分大小写
-m:
使用指定的pattern匹配方法
-n:
不做DNS解析
-u:
禁止acl重名,否则多个同名ACL匹配或关系
5>.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进行匹配
-subdirmatch (-m dir):
查看提取出来的用斜线分隔("/")的字符串,如果其中任何一个匹配,则ACL进行匹配
-domain match (-m dom):
查找提取的用点(".")分隔字符串,如果其中任何一个匹配,则ACL进行匹配
6>.value
<value>的类型如下:
-Boolean
布尔值false,true
-integer or integer range:
整数或整数范围,比如用于匹配端口范围,1024~32768
-IP address/network:
IP地址或IP范围, 192.168.0.1 ,192.168.0.1/24
-string
exact:
精确比较
substring:
子串
suffix:
后缀比较
prefix:
前缀比较
subdir:
路径,/wp-includes/js/jquery/jquery.js
domain:
域名,如www.yinzhengjie.org.cn
-regular expression:
正则表达式
-hex block:
16进制
7>.Acl定义与调用
多个acl作为条件时的逻辑关系:
与:
隐式(默认)使用,如"if valid_src valid_port"
或:
使用"or"或"||"表示,如"if invalid_src || invalid_port"
否定:
使用"!"表示,如"if ! invalid_src"
二.HAProxy基于域名匹配实战案例
1>.编辑haproxy的配置文件
[root@node102.yinzhengjie.org.cn ~]# cat /etc/haproxy/haproxy.cfg
global
maxconn 100000
chroot /yinzhengjie/softwares/haproxy
stats socket /yinzhengjie/softwares/haproxy/haproxy.sock mode 600 level admin
user haproxy
group haproxy
daemon
nbproc 2
cpu-map 1 0
cpu-map 2 1
nbthread 2
pidfile /yinzhengjie/softwares/haproxy/haproxy.pid
log 127.0.0.1 local5 info
defaults
option http-keep-alive
option forwardfor
option redispatch
option abortonclose
maxconn 100000
mode http
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
listen status_page
bind 172.30.1.102:8888
stats enable
stats uri /haproxy-status
stats auth admin:yinzhengjie
stats realm "Welcome to the haproxy load balancer status page of YinZhengjie"
stats hide-version
stats admin if TRUE
stats refresh 5s
frontend WEB_PORT_80
bind 172.30.1.102:80
mode http
#定义ACL
acl my_pc_page hdr_dom(host) -i pc.yinzhengjie.org.cn
acl my_mobile_page hdr_dom(host) -i mobile.yinzhengjie.org.cn
#调用ACL
use_backend pc_web if my_pc_page
use_backend mobile_web if my_mobile_page
#如果前面的ACL都没有匹配成功就访问默认的ACL
default_backend backup_web
backend pc_web
server web01 172.30.1.106:80 check inter 3000 fall 3 rise 5
backend mobile_web
server web02 172.30.1.107:80 check inter 3000 fall 3 rise 5
backend backup_web
server web03 172.30.1.108:80 check inter 3000 fall 3 rise 5
[root@node102.yinzhengjie.org.cn ~]#
[root@node102.yinzhengjie.org.cn ~]# systemctl restart haproxy #别忘记重启haproxy使得配置文件生效,启动成功后可以观察状态页,观察服务是否正常,如下图所示。
[root@node102.yinzhengjie.org.cn ~]#
2>.编辑window客户端的本地文件解析记录,如下图所示。
3>.浏览器访问"http://pc.yinzhengjie.org.cn/",如下图所示。
4>.浏览器访问"http://mobile.yinzhengjie.org.cn/",如下图所示。
5>.浏览器访问"http://node.yinzhengjie.org.cn/",如下图所示。