HAProxy的高級配置選項-ACL篇之基於域名匹配案例
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
一.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/",如下圖所示。