IBM Cloud ICLBの動作確認(3) -レイヤ7編-

##目的
IBM Cloud Load Balancerを活用して、Webサーバへのロードバランスを試してみた。
今回はICLBのレイヤー7機能を確認する。
前回記事はこちら

* 初期導入編：[IBM Cloud ICLBの初期導入(1) -初期導入編-](https://qiita.com/khoshina/items/6a092bec9a9dfeae2c01)
* 分散方式編：[IBM Cloud ICLBの初期導入(2) -分散方式編-](https://qiita.com/khoshina/items/993959a09a51a553ebf8)
* レイヤ7編：本ページ

##環境
* ローカル端末：macOS Catalina 10.15.6 1台
* プラットフォーム:IBMCloud
    * ロードバランサ:IBM Cloud Load Balancer(ICLB) 1サービス(Public to Private)
    * DNSサービス:IBMCloud DNS 1サービス
    * 接続先サーバ:CentOS 7.7.1908(Virtual Server for Classic) 2台

###概要構成図
![スクリーンショット 2020-09-04 23.07.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/0243915c-4435-0ba0-f803-c226ec692c8b.png)

###通信経路
Client -> ICLB(HTTPSアクセス):**認証局証明書デプロイ** -> Server(HTTPアクセス):**証明書不要**

1.インターネット端末よりICLBのFQDNへアクセスする。 -> https://iclb.xcloudyx.com
2.IBMCloud DNSのCNAME情報より、ICLBのPublicIPアドレスがわかる -> kou-iclb01-1160157
3.インターネット端末とICLB間でTLS(SSL)接続を確立する。
4.ICLBの分散アルゴリズムに基づいて、Privateネットワークのサーバ２台にHTTPで分散接続する。

##アクセスパス制御
`IBM Cloudポータルでの作業`

参考：[レイヤー7ポリシー](https://cloud.ibm.com/docs/loadbalancer-service?topic=loadbalancer-service-layer-7-policy)

アクセス先のコンテンツパスに応じて、ユーザの参照先を制御する。

今回は、**iclb.xcloudyx.com/cent**にアクセスしに来た場合
**glb.m365.work**にアクセス先を変更する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/072b4fd5-80f9-6cd8-3af0-91099f0d87be.png)

* Policy Name:任意のポリシー名を記載
* Action:**Redirect to URL**を選択する
* Redicret:リダイレクト先のURLを記載、今回は「https://glb.m365.work」

![IBM_Cloud____Local_Load_Balancer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/c7dfa796-d8b6-1564-5171-294546370f62.png)

* Type:**PATH**を選ぶ
* Compare Type:**EQUAL_TO**を選ぶ
* Value:「**/cent**」を入力

　最後に**Add**選択する。

![スクリーンショット_2020_09_10_15_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/a7160195-1262-e048-43b6-0ec960244b23.png)

###動作確認
`ローカル端末での作業`

**設定変更前**
**/cent**のパスは存在しないので、404 Not Foundとなる。

```
% curl -s -I https://iclb.xcloudyx.com/cent
HTTP/1.1 404 Not Found
```


参考までにGoogleChromeのChrome Developer Toolsからみるとこんな感じ
Macの場合は**Command＋Option＋I**キーで表示可能

![貼り付けた画像_2020_09_10_15_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/ca25ac1a-aa2a-7044-ae39-b6d3dd138aa4.png)

<font color="Red">**設定変更後**</font>
Locationヘッダが埋め込まれ、リダイレクトされている
Location:https://glb.m365.work

```
% curl -s -I https://iclb.xcloudyx.com/cent
HTTP/1.1 302 Found
Location: https://glb.m365.work
```

![貼り付けた画像_2020_09_10_15_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/d84ccb34-ff2e-d35a-b4bb-2f1c8d782d30.png)

##ファイル対応制御

`IBM Cloudポータルでの作業`

参考：[レイヤー7ポリシー](https://cloud.ibm.com/docs/loadbalancer-service?topic=loadbalancer-service-layer-7-policy)

今回は、画像ファイル等の**.jpg**へのアクセスが来た場合、アクセス拒否してみる。

* Policy Name：任意のポリシー名を記載
* Action：**Reject**を選ぶ
* Type:**FILE_TYPE**を選ぶ
* Compare Type:**ENDS_WITH**を選ぶ
* Value:**.jpg**を記載

![貼り付けた画像_2020_09_10_15_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/46038c87-c1ec-0d50-e27b-7224790e5a8b.png)

###動作確認
`ローカル端末での作業`

**設定変更前**

**aaa.jpg**のファイルはそもそも存在しないので、**404 Not Found**になる。

```
% curl -s -I https://iclb.xcloudyx.com/aaa.jpg
HTTP/1.1 404 Not Found
```

<font color="Red">**設定変更後**</font>
**403 Forbidden**かつ**Connection:close**となり、明確にアクセスが拒否されている

```
% curl -s -I https://iclb.xcloudyx.com/aaa.jpg
HTTP/1.0 403 Forbidden
Connection: close
```

##HTTPヘッダ制御

`IBM Cloudポータルでの作業`

参考：[レイヤー7ポリシー](https://cloud.ibm.com/docs/loadbalancer-service?topic=loadbalancer-service-layer-7-policy)

今回は、FQDNではなくIPアドレスを直接指定したアクセスを拒否する。
FQDNでアクセスした場合、HTTPヘッダにFQDNが埋め込まれるため、IPアドレスでアクセスすると
このヘッダがないので、これにて拒否する。
○ https://iclb.xcloudyx.com
x 128.168.xx.xx (iclb.xcloudyx.comのFQDN)

* Type:**HEADER**を選ぶ
* Compare Type:**REGEX**を選ぶ
* Value:**?!iclb\\.xcloudyx\\.com\$**を記載
* Key：**1**を選択(HEADERおよびCookieの場合必要)
* Invert:**1**を選択(指定した条件を反転する)

Compare TypeをREGEXとして、iclb.xcloudyx.comが含まれる場合に制御対象とする。
また、invertを1とすることで、条件を反転され<font color="Red">iclb.xcloudyx.comが含まれない場合</font>となる。

![貼り付けた画像_2020_09_10_17_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/31b999f5-90e1-2ad3-82a1-b67002afab45.png)


###動作確認
`ローカル端末での作業`

**設定変更前**

アクセス可能

```
% curl  -k https://128.168.xx.xx
sv2
```

<font color="Red">**設定変更後**</font>

**503 Service Unavailable**かつ**Connection:close**となり、明確にアクセスが拒否されている

```
% curl -k -s -I https://128.168.xx.xx
HTTP/1.0 503 Service Unavailable
Connection: close
```