AlmaLinux 9
Sponsored Link

HAProxy : ACL の設定2023/03/07

 
HAProxy の ACL の設定です。
ACL 機能により、様々な条件を定義して、コネクションを振り分けることができます。
当例では以下のような環境で設定します。
前提として、DNS の設定により、バックエンドへ振り分けたいホスト名やドメイン名は 全て HAProxy サーバーで受ける必要があります。
-----------+-------------+
           |             |
           |10.0.0.30    |
+----------+-----------+ |
|   [ dlp.srv.world ]  | |
|        HAProxy       | |
+----------------------+ |
                         |
-------------+-----------+--------------+----------
             |           |              |          
             |10.0.0.51  |              |10.0.0.52 
+-----------+----------+ | +-----------+----------+
| [ node01.srv.world ] | | | [ node02.srv.world ] |
|      Web Server#1    | | |      Web Server#2    |
+----------------------+ | +----------------------+
                         |
-------------+-----------+--------------+----------
             |                          |          
             |10.0.0.53                 |10.0.0.31 
+-----------+----------+   +-----------+----------+
| [ node03.srv.world ] |   |  [ www.srv.world ]   |
|      Web Server#3    |   |      Web Server#4    |
+----------------------+   +----------------------+

[1]
ACL の書式は下記の通りです。
acl <aclname> <criterion> [flags] [operator] [<value>] ...
<aclname> は任意の ACL 名称、[operator] は一部の criteria で使用可能です。
その他は用意されています。criteria の種類は特に非常に多いため、詳細は公式ドキュメントを参照ください。
⇒ https://www.haproxy.com/documentation/hapee/latest/onepage/#7.3.6
使用頻度が高そうな criteria や flag は以下の通りです。
criterion 説明
path HTTP リクエスト中のホスト名を除く PATH の部分
query HTTP リクエスト中の最初の [?] 以降のクエリー部分
hdr HTTP リクエストのヘッダー部分
src アクセス元の ソース IP アドレス
L4 モードでも使用可
dst_port 宛先ポート
L4 モードでのみ使用可
flags 説明
-i 大文字 / 小文字を区別しない
-f 指定したファイルからパターンを読み込む
-m パターンマッチングメソッドを指定する
メソッドは右表参照
-n DNS による名前解決をしない
-u ACL の ユニーク ID を使用
method 説明
bool 値が 0 か false 以外であればマッチ
beg 値が 指定した文字列で開始していればマッチ
end 値が 指定した文字列で終了していればマッチ
int 値を 数値として比較
ip 値を IP アドレスとして比較
len 値が 指定した長さと一致した場合にマッチ
reg 値を 正規表現を使用してパターンマッチング
str 値を 文字列として比較
sub 値に 指定した文字列が含まれていればマッチ
[2] HAProxy の設定例です。
[root@dlp ~]#
vi /etc/haproxy/haproxy.cfg
# 最終行に追記
frontend http-in
        bind *:80
        option             forwardfor

        # ACL を定義
        # HTTP リクエストヘッダーの [Host] が [node01.srv.world]
        acl host_node01 hdr(Host) -i node01.srv.world

        # HTTP リクエストヘッダーの [Host] が [node02] で始まる
        acl host_node02 hdr_beg(Host) -i node02

        # HTTP リクエストヘッダーの [Host] に [develop] が含まれる
        acl host_node03 hdr_sub(Host) -i develop

        # HTTP リクエストヘッダーの [Host] の ドメイン名部分が [virtual.host]
        acl host_virtual_host hdr_dom(Host) -i virtual.host

        # HTTP リクエストの PATH の部分が [/work] で始まる
        acl path_workdir path -m beg /work

        # HTTP リクエストの PATH の部分に [test] が含まれる
        acl path_testdir path_sub -i test

        # HTTP リクエストのクエリー部分に [script] が含まれる
        acl query_script query -m sub script

        # アクセス元 クライアント IP が [10.0.0.5/32]
        acl src_ip src -m ip 10.0.0.5/32

        # 各 ACL にマッチした場合の動作を設定
        use_backend www_node01 if host_node01 || path_workdir
        use_backend www_node02 if host_node02 || path_testdir
        use_backend www_node03 if host_node03 || query_script
        use_backend www_default if host_virtual_host || src_ip
        default_backend www_default

backend www_node01
        server node01 10.0.0.51:80 check

backend www_node02
        server node02 10.0.0.52:80 check

backend www_node03
        server node03 10.0.0.53:80 check

backend www_default
        server www_default 10.0.0.31:80 check

[root@dlp ~]#
systemctl restart haproxy

[3] 任意のクライアントコンピューターから HAProxy サーバーへアクセスして設定通りの動作となるか確認しておくとよいでしょう。
関連コンテンツ