HAProxy 之 ACL介绍和使用

1  概述

访问控制列表(ACL)的使用为HAProxy提供了一个灵活的解决方案来执行内容交换,并且通常基于从请求中提取的内容、响应或任何环境状态进行决策,HAProxy基于ACL实现了灵活的调度

本文介绍ACL语句中各个参数含义,定义ACL,使用ACL,以及结合例子来介绍ACL的使用

2  ACL作为条件时的逻辑关系

-与:隐式(默认)使用,默认为与的关系

-或:使用“or”或“||”表示

-否定:使用“!“表示

示例:

有两个条件为invalid_src和invalid_port

if  invalid_src invalid_port #与关系

if invalid_src|| invalid_port #或关系

if  ! invalid_src #非关系

3 ACL 格式定义

3.1  ACL格式介绍

格式如下:

acl       [flags] [operator] [] ...

参数介绍

:ACL名称,自定义,可使用字母,数字,: . -_等符号,同时区分字符大小写

:比较的标准和条件,下一小节介绍具体用法。

的类型:

-boolean

-integeror integer range

-IPaddress / network

-string(exact, substring, suffix, prefix, subdir, domain)

-regularexpression:正则表达式

-hexblock

-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([[,]]) : string,status: integer

这里将一一介绍相关用法

dst:目标IP

dst_port:目标PORT

src:源IP

src_port:源PORT

示例:

定义一个acl,名称为invalid_src,指定源ip是172.18.50.61

acl  invalid_src src  172.18.50.61

.base: string

返回第一个主机头和请求的路径部分的连接,该请求从第一个斜杠开始,并在问号之前结束,对虚拟主机有用

完整的url中:://:@:/;?#,base指的是:/;

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中:://:@:/;?#,path指/;

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访问其他的资源不会被拒绝

acl deny_src src 172.18.50.61

acl sunnypath path_beg /sunny

block if deny_srcsunnypath

.url:string

提取请求中的URL。一个典型的应用是具有预取能力的缓存,以及需要从数据库聚合多个信息并将它们保存在缓存中的网页门户入口

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([[,]]): string

提取在一个HTTP请求报文的首部

hdr([[,]]) :exact string match

hdr_beg([[,]]): prefix match

hdr_dir([[,]]): subdir match

hdr_dom([[,]]): domain match

hdr_end([[,]]): suffix match

hdr_len([[,]]): length match

hdr_reg([[,]]): regex match

hdr_sub([[,]]): substring match

示例一:

禁止使用curl命令

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

acl imagehost hdr(host) www.sunny.com

use_backend image if imagehost

default_backendwebsrv

.status: integer

返回在响应报文中的状态码,根据返回的状态码进行匹配

3.3  预定义ACL

系统预定义的ACL,可以直接使用

以下将介绍预定义ACL的等价配置和用法说明

格式为

ACL名称:ACL等价配置;ACL用法说明

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   [{if | unless} ]

当if/unless一个基于ACL的条件匹配时切换指定backend。

例子

以下例子实现动静分离,当访问php文件的时候,就往dynhost这组backend调度,其他资源默认都发到websrv这组backend。

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 }

.示例:

acl invalid_src  src172.16.200.2

block if invalid_src

http-request配置

对7层请求的访问控制,主要指http-request

.http-request   {allow | deny |add-header |set-header } [ { if | unless }  ]

根据第4层条件对传入连接执行操作

.tcp-request connection  {accept|reject}  [{if | unless} ]

注意协议和模式的匹配,默认为HTTP协议,haproxy一般用来调度http,如果非http协议就用mode来单独定义,如mode  tcp,不过生产中,mysql一般用专业调度数据库的工具来调度

5  例子

例子一:实现ssh的调度

先在ssh的配置文件更改ssh监听的ip的ip为非22端口,然后haproxy配置如下

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不一致导致安全问题,调度成功了,但是连接不上。

ssh  172.18.50.63

例子二:实现mysql调度

实现只有主机172.18.50.61能够通过172.18.50.73这台机器调度到后端的mysql,其他的机器都不能通过172.18.50.73调度连接

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

测试

登陆数据库

mysql -uwpadmin -pPass123456 -h 172.18.50.73

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

show variables like 'hostname';

例子三:基于ACL实现wordpress动静分离

注意,因为应用wordpress在调用php脚本时,需要用到其他资源,所以default_backend要设置在处理wordpress里php文件的服务器组中,如以下的dynamicblog专门用来处理php文件,所以将default_backend设置为dynamicblog这一组服务器。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • 互联网架构基础知识 一、网站常见架构 负载层 页面缓存层 web层 数据层 二、运维法则 缓存为王 尽量在前端(缓...
    魏镇坪阅读 4,788评论 0 9
  • HAProxy简介HAProxy配置ACL配置TCP转发SSL转发 一、HAProxy简介: (一)HAProxy...
    哈喽别样阅读 1,520评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,600评论 18 139
  • global log 127.0.0.1 local3 chroot /etc/haproxy pidfile /...
    c38480262d38阅读 1,806评论 0 0
  • Haproxy是既可以工作在7层也能工作在4层的反代工具.Haproxy的功能: 路由HTTP请求到后端服务器,基...
    uangianlap阅读 1,536评论 0 1