1. 程式人生 > >HAProxy 之 ACL介紹和使用

HAProxy 之 ACL介紹和使用

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  <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]

匹配整數值:eqgegtlelt

匹配字符串:

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

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

-prefixmatch (-m beg) :其中,begbegin的縮寫,在提取的字符串首部中查找模式,如果其中任何一個被發現,

ACL將匹配

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

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

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

3.2 參數criterion介紹

criterion是比較的標準和條件,比較條件和標準很多:dstdst_portsrc,src_port, base : string, path : string, url: string,req.hdr([<name>[,<occ>]]) : stringstatus: integer

這裏將一一介紹相關用法

dst目標IP

dst_port目標PORT

srcIP

src_portPORT

示例:

定義一個acl,名稱為invalid_src,指定源ip是172.18.50.61

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>

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>

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/adminurl就會被拒絕,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([<name>[,<occ>]]): string

提取在一個HTTP請求報文的首部

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命令

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

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 }<condition>

.示例:

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監聽的ipip為非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



本文出自 “陽光運維” 博客,請務必保留此出處http://ghbsunny.blog.51cto.com/7759574/1978996

HAProxy 之 ACL介紹和使用