HAProxy 之 ACL介紹和使用

1? 概述

訪問控制列表(ACL)的使用為HAProxy提供了一個靈活的解決方案來執(zhí)行內(nèi)容交換,并且通常基于從請求中提取的內(nèi)容、響應或任何環(huán)境狀態(tài)進行決策捅僵,HAProxy基于ACL實現(xiàn)了靈活的調(diào)度

本文介紹ACL語句中各個參數(shù)含義,定義ACL眨层,使用ACL,以及結(jié)合例子來介紹ACL的使用

2? ACL作為條件時的邏輯關(guān)系

-與:隱式(默認)使用庙楚,默認為與的關(guān)系

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

-否定:使用“!“表示

示例:

有兩個條件為invalid_src和invalid_port

if??invalid_src?invalid_port?#與關(guān)系

if?invalid_src||?invalid_port?#或關(guān)系

if??!?invalid_src?#非關(guān)系

3 ACL 格式定義

3.1? ACL格式介紹

格式如下:

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

參數(shù)介紹

:ACL名稱,自定義趴樱,可使用字母馒闷,數(shù)字,: . -_等符號叁征,同時區(qū)分字符大小寫

:比較的標準和條件窜司,下一小節(jié)介紹具體用法。

的類型:

-boolean

-integeror integer range

-IPaddress / network

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

-regularexpression:正則表達式

-hexblock

-i不區(qū)分大小寫

-m使用指定的pattern匹配方法

-n不做DNS解析

-u強制每個ACL必須唯一ID航揉,否則多個同名ACL或關(guān)系

--強制flag結(jié)束.當字符串和某個flag相似時使用

[operator]

匹配整數(shù)值:eq塞祈、ge、gt帅涂、le议薪、lt

匹配字符串:

-exactmatch (-m str) :字符串必須完全匹配模式

-substringmatch (-m sub) :在提取的字符串中查找模式,如果其中任何一個被發(fā)現(xiàn)媳友,ACL將匹配

-prefixmatch (-m beg) :其中斯议,beg為begin的縮寫,在提取的字符串首部中查找模式醇锚,如果其中任何一個被發(fā)現(xiàn)哼御,ACL將匹配

-suffixmatch (-m end) :將模式與提取字符串的尾部進行比較,如果其中任何一個匹配焊唬,則ACL進行匹配

-subdirmatch (-m dir) :查看提取出來的用斜線分隔(“/”)的字符串恋昼,如果其中任何一個匹配,則ACL進行匹配

-domainmatch (-m dom) :查找提取的用點(“.”)分隔字符串赶促,如果其中任何一個匹配液肌,則ACL進行匹配

3.2? 參數(shù)criterion介紹

criterion是比較的標準和條件,比較條件和標準很多:dst鸥滨,dst_port嗦哆,src,src_port,base : string, path : string,url: string,req.hdr([[,]]) : string谤祖,status: integer

這里將一一介紹相關(guān)用法

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

返回第一個主機頭和請求的路徑部分的連接,該請求從第一個斜杠開始老速,并在問號之前結(jié)束,對虛擬主機有用

完整的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路徑,該路徑從第一個斜杠開始橘券,并在問號之前結(jié)束(無主機部分),默認會被調(diào)度到同一后端主機上额湘。

完整的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。一個典型的應用是具有預取能力的緩存但两,以及需要從數(shù)據(jù)庫聚合多個信息并將它們保存在緩存中的網(wǎng)頁門戶入口

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

示例二:

實現(xiàn)域名的調(diào)度鬓梅,根據(jù)首部實現(xiàn),將地址為www.sunny.com 滿足acl 為imagehost的請求調(diào)度到image這組backend的服務器請求谨湘,其他的請求調(diào)度到默認的組為websrv處理請求绽快。這個使用要保證測試主機能夠解析haproxy服務器為www.sunny.com

acl?imagehost?hdr(host)?www.sunny.com

use_backend?image?if?imagehost

default_backendwebsrv

.status: integer

返回在響應報文中的狀態(tài)碼,根據(jù)返回的狀態(tài)碼進行匹配

3.3? 預定義ACL

系統(tǒng)預定義的ACL,可以直接使用

以下將介紹預定義ACL的等價配置和用法說明

格式為

ACL名稱:ACL等價配置紧阔;ACL用法說明

TRUE:always_true坊罢;總是匹配

FALSE:always_false;從不匹配

HTTP:req_proto_http擅耽;匹配HTTP協(xié)議

HTTP_1.0:req_ver?1.0活孩;匹配HTTP協(xié)議1.0

HTTP_1.1:req_ver?1.1;匹配HTTP協(xié)議1.1

HTTP_CONTENT:hdr_val(content-length)gt?0乖仇;匹配已存在內(nèi)容長度

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记劝;匹配請求緩沖區(qū)中的數(shù)據(jù)

WAIT_END:wait_end艺骂;等待內(nèi)容分析的結(jié)束

4? ACL使用

use_backend配置

.use_backend? ?[{if | unless} ]

當if/unless一個基于ACL的條件匹配時切換指定backend。

例子

以下例子實現(xiàn)動靜分離隆夯,當訪問php文件的時候钳恕,就往dynhost這組backend調(diào)度别伏,其他資源默認都發(fā)到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 } ?]

根據(jù)第4層條件對傳入連接執(zhí)行操作

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

注意協(xié)議和模式的匹配厘肮,默認為HTTP協(xié)議牺陶,haproxy一般用來調(diào)度http蔫仙,如果非http協(xié)議就用mode來單獨定義,如mode? tcp,不過生產(chǎn)中矾兜,mysql一般用專業(yè)調(diào)度數(shù)據(jù)庫的工具來調(diào)度

5? 例子

例子一:實現(xiàn)ssh的調(diào)度

先在ssh的配置文件更改ssh監(jiān)聽的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連接示启,否則調(diào)度中兢哭,有一臺會因為mac不一致導致安全問題,調(diào)度成功了夫嗓,但是連接不上迟螺。

ssh??172.18.50.63

例子二:實現(xiàn)mysql調(diào)度

實現(xiàn)只有主機172.18.50.61能夠通過172.18.50.73這臺機器調(diào)度到后端的mysql,其他的機器都不能通過172.18.50.73調(diào)度連接

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

測試

登陸數(shù)據(jù)庫

mysql?-uwpadmin?-pPass123456?-h?172.18.50.73

登陸數(shù)據(jù)庫后,如果用system可以調(diào)用本機的linux命令舍咖,但是查看的是本機的相關(guān)信息矩父,如system? hostname 查看的是本機的計算機名,通過查看變量名在mysql里查看遠程的連接計算機名

show?variables?like?'hostname';

例子三:基于ACL實現(xiàn)wordpress動靜分離

注意排霉,因為應用wordpress在調(diào)用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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辙诞,一起剝皮案震驚了整個濱河市辙售,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌飞涂,老刑警劉巖旦部,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異较店,居然都是意外死亡士八,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門梁呈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來婚度,“玉大人,你說我怎么就攤上這事官卡』茸拢” “怎么了醋虏?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長哮翘。 經(jīng)常有香客問我颈嚼,道長,這世上最難降的妖魔是什么饭寺? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任阻课,我火速辦了婚禮,結(jié)果婚禮上艰匙,老公的妹妹穿的比我還像新娘限煞。我一直安慰自己,他們只是感情好员凝,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布署驻。 她就那樣靜靜地躺著,像睡著了一般绊序。 火紅的嫁衣襯著肌膚如雪硕舆。 梳的紋絲不亂的頭發(fā)上秽荞,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天骤公,我揣著相機與錄音,去河邊找鬼扬跋。 笑死阶捆,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的钦听。 我是一名探鬼主播洒试,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼朴上!你這毒婦竟也來了垒棋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤痪宰,失蹤者是張志新(化名)和其女友劉穎叼架,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衣撬,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡乖订,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了具练。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乍构。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扛点,靈堂內(nèi)的尸體忽然破棺而出哥遮,到底是詐尸還是另有隱情岂丘,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布昔善,位于F島的核電站元潘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏君仆。R本人自食惡果不足惜翩概,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望返咱。 院中可真熱鬧钥庇,春花似錦、人聲如沸咖摹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萤晴。三九已至吐句,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間店读,已是汗流浹背嗦枢。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屯断,地道東北人文虏。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像殖演,于是被迫代替她去往敵國和親氧秘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 互聯(lián)網(wǎng)架構(gòu)基礎知識 一趴久、網(wǎng)站常見架構(gòu) 負載層 頁面緩存層 web層 數(shù)據(jù)層 二丸相、運維法則 緩存為王 盡量在前端(緩...
    魏鎮(zhèn)坪閱讀 4,820評論 0 9
  • HAProxy簡介HAProxy配置ACL配置TCP轉(zhuǎn)發(fā)SSL轉(zhuǎn)發(fā) 一、HAProxy簡介: (一)HAProxy...
    哈嘍別樣閱讀 1,533評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理彼棍,服務發(fā)現(xiàn)灭忠,斷路器,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • global log 127.0.0.1 local3 chroot /etc/haproxy pidfile /...
    c38480262d38閱讀 1,822評論 0 0
  • Haproxy是既可以工作在7層也能工作在4層的反代工具.Haproxy的功能: 路由HTTP請求到后端服務器,基...
    uangianlap閱讀 1,549評論 0 1