设为首页 收藏本站
查看: 2160|回复: 0

[经验分享] HAProxy 之 ACL介绍和使用

[复制链接]

尚未签到

发表于 2017-11-7 10:01:45 | 显示全部楼层 |阅读模式
1  概述
访问控制列表(ACL)的使用为HAProxy提供了一个灵活的解决方案来执行内容交换,并且通常基于从请求中提取的内容、响应或任何环境状态进行决策,HAProxy基于ACL实现了灵活的调度
本文介绍ACL语句中各个参数含义,定义ACL,使用ACL,以及结合例子来介绍ACL的使用
2  ACL作为条件时的逻辑关系
-与:隐式(默认)使用,默认为与的关系
-或:使用“or” 或“||”表示
-否定:使用“!“ 表示
示例:
有两个条件为invalid_src 和invalid_port
1
2
3
if  invalid_src invalid_port #与关系
if invalid_src|| invalid_port #或关系
if  ! invalid_src #非关系



3 ACL 格式定义
3.1  ACL格式介绍
格式如下:
1
acl  <aclname>   <criterion>  [flags] [operator] [<value>] ...



参数介绍
<aclname>:ACL名称,自定义,可使用字母,数字,: . -_ 等符号,同时区分字符大小写
<criterion>:比较的标准和条件,下一小节介绍具体用法。
<value>的类型:
-boolean
-integeror integer range
-IPaddress / network
-string(exact, substring, suffix, prefix, subdir, domain)
-regularexpression:正则表达式
-hexblock
<flags>
-i不区分大小写
-m使用指定的pattern匹配方法
-n不做DNS解析
-u强制每个ACL必须唯一ID,否则多个同名ACL或关系
-- 强制flag结束. 当字符串和某个flag相似时使用
[operator]
匹配整数值:eq、ge、gt、le、lt
匹配字符串:
-exactmatch (-m str) :字符串必须完全匹配模式
-substringmatch (-m sub) :在提取的字符串中查找模式,如果其中任何一个被发现,ACL将匹配
-prefixmatch (-m beg) :其中,beg为begin的缩写,在提取的字符串首部中查找模式,如果其中任何一个被发现,ACL将匹配
-suffixmatch (-m end) :将模式与提取字符串的尾部进行比较,如果其中任何一个匹配,则ACL进行匹配
-subdirmatch (-m dir) :查看提取出来的用斜线分隔(“/”)的字符串,如果其中任何一个匹配,则ACL进行匹配
-domainmatch (-m dom) :查找提取的用点(“.”)分隔字符串,如果其中任何一个匹配,则ACL进行匹配
3.2  参数criterion介绍
criterion是比较的标准和条件,比较条件和标准很多:dst,dst_port,src,src_port, base : string, path : string, url: string,req.hdr([<name>[,<occ>]]) : string,status: integer
这里将一一介绍相关用法
dst:目标IP
dst_port:目标PORT
src:源IP
src_port:源PORT
示例:
定义一个acl,名称为invalid_src,指定源ip是172.18.50.61
1
acl  invalid_src src  172.18.50.61



.base: string
返回第一个主机头和请求的路径部分的连接,该请求从第一个斜杠开始,并在问号之前结束,对虚拟主机有用
完整的url中:<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>,base指的是<host>:<port>/<path>;<params>
1
2
3
4
5
6
7
8
base: exact string match
base_beg: prefix match
base_dir: subdir match
base_dom: domain match
base_end: suffix match
base_len: length match
base_reg: regex match
base_sub: substring match



.path: string
提取请求的URL路径,该路径从第一个斜杠开始,并在问号之前结束(无主机部分),默认会被调度到同一后端主机上。
完整的url中:<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>,path指/<path>;<params>
1
2
3
4
5
6
7
8
path : exact string match
path_beg : prefix match
path_dir : subdir match
path_dom : domain match
path_end : suffix match
path_len : length match
path_reg : regex match
path_sub : substring match



例子
表示当来自ip :172.18.50.61访问http:/ip/admin的url就会被拒绝,61访问其他的资源不会被拒绝
1
2
3
acl deny_src src 172.18.50.61
acl sunnypath path_beg /sunny
block if deny_srcsunnypath



.url:string
提取请求中的URL。一个典型的应用是具有预取能力的缓存,以及需要从数据库聚合多个信息并将它们保存在缓存中的网页门户入口
1
2
3
4
5
6
7
8
url: exact string match
url_beg: prefix match
url_dir: subdir match
url_dom: domain match
url_end: suffix match
url_len: length match
url_reg: regex match
url_sub: substring match



.req.hdr([<name>[,<occ>]]): string
提取在一个HTTP请求报文的首部
1
2
3
4
5
6
7
8
hdr([<name>[,<occ>]]) :exact string match
hdr_beg([<name>[,<occ>]]): prefix match
hdr_dir([<name>[,<occ>]]): subdir match
hdr_dom([<name>[,<occ>]]): domain match
hdr_end([<name>[,<occ>]]): suffix match
hdr_len([<name>[,<occ>]]): length match
hdr_reg([<name>[,<occ>]]): regex match
hdr_sub([<name>[,<occ>]]): substring match



示例一:
禁止使用curl命令
1
2
acl not_curl hdr_sub(User-Agent) -i curl
block if not_curl



示例二:
实现域名的调度,根据首部实现,将地址为www.sunny.com 满足acl 为imagehost的请求调度到image这组backend的服务器请求,其他的请求调度到默认的组为websrv处理请求。这个使用要保证测试主机能够解析haproxy服务器为www.sunny.com
1
2
3
acl imagehost hdr(host) www.sunny.com
use_backend image if imagehost
default_backendwebsrv



.status: integer
返回在响应报文中的状态码,根据返回的状态码进行匹配
3.3  预定义ACL
系统预定义的ACL,可以直接使用
以下将介绍预定义ACL的等价配置和用法说明
格式为
ACL名称:ACL等价配置;ACL用法说明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
TRUE:always_true;总是匹配
FALSE:always_false;从不匹配
HTTP:req_proto_http;匹配HTTP协议
HTTP_1.0:req_ver 1.0;匹配HTTP协议1.0
HTTP_1.1:req_ver 1.1;匹配HTTP协议1.1
HTTP_CONTENT:hdr_val(content-length)gt 0;匹配已存在内容长度
HTTP_URL_ABS:url_reg ^[^/:]*://;匹配URL绝对路径
HTTP_URL_SLASH:url_beg /;匹配URL相对路径
HTTP_URL_STAR:url *;匹配URL 等于"*"
LOCALHOST:src 127.0.0.1/8;匹配从localhost来的连接
METH_CONNECT:method CONNECT;匹配HTTP CONNECT方法
METH_GET:method GET HEAD;匹配HTTP GET 或者 HEAD 方法
METH_HEAD:method HEAD;匹配 HTTP HEAD 方法
METH_OPTIONS:method OPTIONS;匹配 HTTP OPTIONS方法
METH_POST:method POST;匹配 HTTP POST 方法
METH_TRACE:method TRACE;匹配 HTTP TRACE方法
RDP_COOKIE:req_rdp_cookie_cntgt 0;匹配RDPcookie的存在
REQ_CONTENT:req_len gt 0;匹配请求缓冲区中的数据
WAIT_END:wait_end;等待内容分析的结束




4  ACL使用
use_backend配置

.use_backend   <backend>[{if | unless}<condition>]
当if/unless一个基于ACL的条件匹配时切换指定backend。
例子
以下例子实现动静分离,当访问php文件的时候,就往dynhost这组backend调度,其他资源默认都发到websrv这组backend。
1
2
3
4
acl dynhost path_end  .php
acl imagehost hdr(host) www.sunny.com
use_backend image if dynhost
default_backend  websrv



block配置
阻止7层请求if/unless一个条件匹配
.block { if | unless }<condition>
.示例:
1
2
acl invalid_src  src172.16.200.2
block if invalid_src



http-request配置
对7层请求的访问控制,主要指http-request
.http-request   {allow | deny |add-header <name> <fmt> |set-header <name><fmt> } [ { if | unless }  <condition>]
根据第4层条件对传入连接执行操作
.tcp-request connection  {accept|reject}  [{if | unless} <condition>]
注意协议和模式的匹配,默认为HTTP协议,haproxy一般用来调度http,如果非http协议就用mode来单独定义,如mode  tcp,不过生产中,mysql一般用专业调度数据库的工具来调度
5  例子
例子一:实现ssh的调度
先在ssh的配置文件更改ssh监听的ip的ip为非22端口,然后haproxy配置如下
1
2
3
4
5
6
7
8
listen ssh
bind 172.18.50.63:22
balance leastconn
acl invalid_src  src  172.18.50.
tcp-request connection reject if  invalid_src
mode tcp
server sshsrv1 172.18.50.65:22 check
server sshsrv2 172.18.50.75:22 check  backup



测试
在172.18.50.61上测试,每次测试完成后,都要把172.18.50.63下/root/.ssh/known_hosts下的172.18.50.63的记录清理掉然后在重新ssh连接,否则调度中,有一台会因为mac不一致导致安全问题,调度成功了,但是连接不上。
1
ssh  172.18.50.63



例子二:实现mysql调度
实现只有主机172.18.50.61能够通过172.18.50.73这台机器调度到后端的mysql,其他的机器都不能通过172.18.50.73调度连接
1
2
3
4
5
6
7
8
listenmysql
    mode tcp
    bind 172.18.50.73:3306
    balance roundrobin
    acl valid_src src 172.18.50.61
    tcp-request connection reject unless valid_src
    server mysqlsrv1 172.18.50.65:3306 check
       server mysqlsrv2172.18.50.75:3306 check



测试
登陆数据库
1
mysql -uwpadmin -pPass123456 -h 172.18.50.73



登陆数据库后,如果用system可以调用本机的linux命令,但是查看的是本机的相关信息,如system  hostname 查看的是本机的计算机名,通过查看变量名在mysql里查看远程的连接计算机名
1
show variables like 'hostname';



例子三:基于ACL 实现wordpress动静分离
注意,因为应用wordpress在调用php脚本时,需要用到其他资源,所以default_backend要设置在处理wordpress  里php文件的服务器组中,如以下的dynamicblog专门用来处理php文件,所以将default_backend设置为dynamicblog这一组服务器。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
frontend  http
    bind *:80
    acl url_dyn path_end -i.php
    acl url_stac path_end-i  .jpg .gif .png .css .js .html .txt
    default_backenddynamicblog if url_dyn
    use_backend    staticblog if url_stac
    reqadd sunny-x-via:\ haproxy7c
    rspdel Server
    rspadd  Server:\ Sunny-proxy7c
    option forwardfor    header sunny-x-client
backend staticblog
    balance     roundrobin
    cookie WEBSRV insertnocache
    server      web6e 172.18.50.65:80 check weight 1   inter 3000 rise 2 fall 2 cookie cksrv1
backend dynamicblog
    balance     roundrobin
    cookie WEBSRV insertnocache
    server     web6e 172.18.50.75:80 check weight 1  inter 3000 rise 2 fall 2 cookie cksrv2
listen stats
bind :9091
stats enable
stats auth  admin:admin
stats admin  if TRUE








运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-406626-1-1.html 上篇帖子: HAProxy 之 实现https访问 下篇帖子: HAProxy 之 页面管理配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表