haproxy 常用acl規則與會話保持


一、常用的acl規則

       haproxy的ACL用於實現基於請求報文的首部、響應報文的內容或其它的環境狀態信息來做出轉發決策,這大大增強了其配置彈性。其配置法則通常分為兩 步,首先去定義ACL,即定義一個測試條件,而后在條件得到滿足時執行某特定的動作,如阻止請求或轉發至某特定的后端。定義ACL的語法格式如下。

  acl <aclname> <criterion> [flags] [operator] <value> ...

  <aclname>:ACL名稱,區分字符大小寫,且其只能包含大小寫字母、數字、-(連接線)、_(下划線)、.(點號)和:(冒號);haproxy中,acl可以重名,這可以把多個測試條件定義為一個共同的acl;
  <criterion>:測試標准,即對什么信息發起測試;測試方式可以由[flags]指定的標志進行調整;而有些測試標准也可以需要為其在<value>之前指定一個操作符[operator];
  [flags]:目前haproxy的acl支持的標志位有3個:
    -i:不區分<value>中模式字符的大小寫;
    -f:從指定的文件中加載模式;
    --:標志符的強制結束標記,在模式中的字符串像標記符時使用;
  <value>:acl測試條件支持的值有以下四類:
    整數或整數范圍:如1024:65535表示從1024至65535;僅支持使用正整數(如果出現類似小數的標識,其為通常為版本測試),且支持使用的操作符有5個,分別為eq、ge、gt、le和lt;
    字符串:支持使用“-i”以忽略字符大小寫,支持使用“\”進行轉義;如果在模式首部出現了-i,可以在其之前使用“--”標志位;   

   regular expressions:正則表達式:其機制類同字符串匹配;

   IP addresses and networks:IP地址及網絡地址;
同一個acl中可以指定多個測試條件,這些測試條件需要由邏輯操作符指定其關系。條件間的組合測試關系有三種:“與”(默認即為與操作)、“或”(使用“||”操作符)以及“非”(使用“!”操作符)。

 

常用的測試標准(criteria):
1. be_sess_rate(backend) <integer>

     用於測試指定的backend上會話創建的速率(即每秒創建的會話數)是否滿足指定的條件;常用於在指定backend上的會話速率過高時將用戶請求轉發至另外的backend,或用於阻止攻擊行為。例如:

    backend dynamic
        mode http
        acl being_scanned be_sess_rate gt 50
        redirect location /error_pages/denied.html if being_scanned

2. fe_sess_rate(frontend) <integer>

     用於測試指定的frontend(或當前frontend)上的會話創建速率是否滿足指定的條件;常用於為frontend指定一個合理的會話創建速率的 上限以防止服務被濫用。例如下面的例子限定入站郵件速率不能大於50封/秒,所有在此指定范圍之外的請求都將被延時50毫秒。

    frontend mail
        bind :25
        mode tcp
        maxconn 500
        acl too_fast fe_sess_rate ge 50
        tcp-request inspect-delay 50ms
        tcp-request content accept if ! too_fast
        tcp-request content accept if WAIT_END

3. hdr(header) <string>

     用於測試請求報文中的所有首部或指定首部是否滿足指定的條件;指定首部時,其名稱不區分大小寫,且在括號“()”中不能有任何多余的空白字符。測試服務器 端的響應報文時可以使用shdr()。例如下面的例子用於測試首部Connection的值是否為close。

    hdr(Connection) -i close

4. method <string>

    測試HTTP請求報文中使用的方法。

5. path_beg <string>

     用於測試請求的URL是否以<string>指定的模式開頭。下面的例子用於測試URL是否以/static、/iilannis、/javascript或/stylesheets頭。

    acl url_static       path_beg     -i   /static /iilannis /javascript /stylesheets   

                                           #url 目錄                                                 

6. path_end <string>

     用於測試請求的URL是否以<string>指定的模式結尾。例如,下面的例子用戶測試URL是否以jpg、gif、png、css或js結尾。

    acl url_static       path_end       -i    .jpg .gif .png .css .js

                                                 #url 結尾文件                                                                                  

7. hdr_beg <string>

     用於測試請求報文的指定首部的開頭部分是否符合<string>指定的模式。例如,下面的例子用記測試請求是否為提供靜態內容的主機img、video、download或ftp。

    acl host_static hdr_beg(host) -i img. video. download. ftp.

8. hdr_end <string>

     用於測試請求報文的指定首部的結尾部分是否符合<string>指定的模式。例如,下面的例子用記測試請求是否為

9. hdr_reg <string>

     正則匹配 

     acl bbs hdr_reg(host) -i ^(bbs.test.com|shequ.test.com|forum)

             use_backend  bbs_pool if bbs or bbs_path       #注意 "or"                                                                       

 

二、會話保持

haproxy負載均衡保持客戶端和服務器Session的三種方式:

2.1 用戶源IP 識別

  haroxy 將用戶IP經過hash計算后 指定到固定的真實服務器上(類似於nginx 的IP hash 指令)

配置指令 balance source

backend www

mode http

balance source

server web1  192.168.0.150:80 check inter 1500 rise 3 fall 3

server web2  192.168.0.151:80 check inter 1500 rise 3 fall 3

 

2.2 cookie 識別

haproxy 將WEB服務端發送給客戶端的cookie中插入(或添加加前綴)haproxy定義的后端的服務器COOKIE ID。

配置指令例舉 cookie SESSION_COOKIE insert indirect nocache

用firebug可以觀察到用戶的請求頭的cookie里 有類似" Cookie jsessionid=0bc588656ca05ecf7588c65f9be214f5;

SESSION_COOKIE=app1"

SESSION_COOKIE=app1就是haproxy添加的內容。

 

backend COOKIE_srv

mode http

cookie SESSION_COOKIE insert indirect nocache

server web1 192.168.0.150:80  cookie 1 check inter 1500 rise 3 fall 3

server web2 192.168.0.151:80  cookie 2 check inter 1500 rise 3 fall 3

 

2.3 session 識別

haproxy 將后端服務器產生的session和后端服務器標識存在haproxy中的一張表里。客戶端請求時先查詢這張表。

配置指令:appsession <cookie> len <length> timeout <holdtime>

配置指令例舉 appsession JSESSIONID len 64 timeout 5h request-learn

配置舉例

backend APPSESSION_srv

mode http

appsession JSESSIONID len 64 timeout 5h request-learn

server web1 192.168.0.150:80 cookie 1 check inter 1500 rise 3 fall 3

server web2 192.168.0.151:80 cookie 2 check inter 1500 rise 3 fall 3


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM