15.7. アクセス制御リストを使用したロードバランサーの保護
Octavia API を使用してアクセス制御リスト (ACL) を作成し、リスナーへの受信トラフィックを、許可されたソース IP アドレスのセットに制限することができます。それ意外の受信トラフィックは、すべて拒否されます。
前提条件
本項では、Octavia ロードバランサーの保護方法を説明する上で、以下のことを前提としています。
-
バックエンドサーバー 192.0.2.10 および 192.0.2.11 は
private-subnet
という名前のサブネット上にあり、TCP ポート 80 にカスタムアプリケーションが設定されている。 -
サブネット
public-subnet
はクラウドオペレーターが作成した共有外部サブネットで、インターネットからアクセスすることができる。 - ロードバランサーはインターネットからアクセス可能な基本的なロードバランサーで、リクエストをバックエンドサーバーに分散する。
- TCP ポート 80 のアプリケーションには、限られたソース IP アドレス (192.0.2.0/24 および 198.51.100/24) からしかアクセスすることができない。
手順
サブネット (
public-subnet
) にロードバランサー (lb1
) を作成します。注記丸かっこ () 内の名前を、実際に使用される名前に置き換えてください。
$ openstack loadbalancer create --name lb1 --vip-subnet-id public-subnet
ロードバランサー (
lb1
) のステータス表示がACTIVE
およびONLINE
になるまで、以下のコマンドを再実行します。$ openstack loadbalancer show lb1
許可される CIDR でリスナー (
listener1
) を作成します。$ openstack loadbalancer listener create --name listener1 --protocol TCP --protocol-port 80 --allowed-cidr 192.0.2.0/24 --allowed-cidr 198.51.100/24 lb1
リスナー (
listener1
) のデフォルトプール (pool1
) を作成します。$ openstack loadbalancer pool create --name pool1 --lb-algorithm ROUND_ROBIN --listener listener1 --protocol TCP
サブネット (
private-subnet
) 上のメンバー 192.0.2.10 および 192.0.2.11 を、作成したプール (pool1
) に追加します。$ openstack loadbalancer member create --subnet-id private-subnet --address 192.0.2.10 --protocol-port 80 pool1 $ openstack loadbalancer member create --subnet-id private-subnet --address 192.0.2.11 --protocol-port 80 pool1
検証手順
以下のコマンドを入力します。
$ openstack loadbalancer listener show listener1
以下のような出力が表示されるはずです。
+-----------------------------+--------------------------------------+ | Field | Value | +-----------------------------+--------------------------------------+ | admin_state_up | True | | connection_limit | -1 | | created_at | 2019-12-09T11:38:05 | | default_pool_id | None | | default_tls_container_ref | None | | description | | | id | d26ba156-03c3-4051-86e8-f8997a202d8e | | insert_headers | None | | l7policies | | | loadbalancers | 2281487a-54b9-4c2a-8d95-37262ec679d6 | | name | listener1 | | operating_status | ONLINE | | project_id | 308ca9f600064f2a8b3be2d57227ef8f | | protocol | TCP | | protocol_port | 80 | | provisioning_status | ACTIVE | | sni_container_refs | [] | | timeout_client_data | 50000 | | timeout_member_connect | 5000 | | timeout_member_data | 50000 | | timeout_tcp_inspect | 0 | | updated_at | 2019-12-09T11:38:14 | | client_ca_tls_container_ref | None | | client_authentication | NONE | | client_crl_container_ref | None | | allowed_cidrs | 192.0.2.0/24 | | | 198.51.100/24 | +-----------------------------+--------------------------------------+
パラメーター
allowed_cidrs
は、192.0.2.0/24 および 198.51.100/24 からのトラフィックだけを許可するように設定します。ロードバランサーが保護されていることを確認するには、
allowed_cidrs
の一覧に記載されていない CIDR のクライアントからリスナーにリクエストの実施を試みます。リクエストは成功しないはずです。以下のような出力が表示されるはずです。curl: (7) Failed to connect to 10.0.0.226 port 80: Connection timed out curl: (7) Failed to connect to 10.0.0.226 port 80: Connection timed out curl: (7) Failed to connect to 10.0.0.226 port 80: Connection timed out curl: (7) Failed to connect to 10.0.0.226 port 80: Connection timed out