IBM Cloud: VPCにF5 BIG-IP Virtual Editionを導入してみた（2022年10月改訂版）

# 1. はじめに

（以前、[IBM Cloud: VPCにF5 BIG-IP Virtual Editionを導入してみた](https://qiita.com/testnin2/items/395eb7ea5c9fd274863d)という記事を書いていました。本稿はその改訂版です）
IBM CloudのVPCではVirtual Network Function(VNF)機能として、現在[以下の製品・サービスが利用可能](https://cloud.ibm.com/docs/vpc?topic=vpc-deploy-vnf&locale=en)である。

- [Check Point CloudGuard IaaS Security Gateway](https://cloud.ibm.com/catalog/content/checkpoint-iaas-gw-ibm-vpc-1.0.7-9ed8dbde-2931-45f5-a7a7-0c90ce0d2686-global)
- [Fortinet FortiGate Next-Generation Firewall - A/P HA](https://cloud.ibm.com/catalog/content/ibm-fortigate-AP-HA-terraform-deploy-5dd3e4ba-c94b-43ab-b416-c1c313479cec-global)
- [Fortinet FortiGate Next-Generation Firewall - Single VM](https://cloud.ibm.com/catalog/content/ibm-fortigate-terraform-deploy-1f878ca9-069f-42ca-9ed9-5b461d4d5231-global)
- [F5 BIG-IP Virtual Edition for VPC](https://cloud.ibm.com/catalog/content/ibmcloud_schematics_bigip_multinic_declared-1.0-d33f1544-e938-478a-b0dd-d883370f08d0-global)
- [Check Point CloudGuard IaaS Security Management](https://cloud.ibm.com/catalog/content/checkpoint-iaas-mgmt-ibm-vpc-1.0.7-9ea27a83-e5e7-43d9-9e8f-df8dd1befc5a-global)
- [Juniper vSRX Next-Generation Firewall](https://cloud.ibm.com/catalog/content/juniper-vsrx-catalog-deploy-1.4-dc1e707c-33dd-4321-b2a5-c22dbf0dd0ee-global)
- [Palo Alto VM-Series Firewall](https://cloud.ibm.com/catalog/content/ibmcloud-vmseries-1.9-6470816d-562d-4627-86a5-fe3ad4e94b30-global)

なお、これらの3rd Party製品はBYOL(Bring Your Own License)で提供しており、そのサポートは3rd Partyから受ける必要がある。

:warning: 注文画面には以下の警告が出る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/08fe42a8-44b4-a200-5b4b-17551cd19e82.png)
:warning: 例えばF5 for VPCのcaseを起票しようとすると、以下のようにF5社に問い合わせるようなメッセージが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/d3b0da5c-85eb-6b93-13ed-7e29db41a545.png)

本稿では、`BIG-IP Virtual Edition for VPC`を導入してみる。F5社によるドキュメントは以下になる。

- [F5 BIG-IP Virtual Edition in IBM Cloud VPC Gen 2](https://clouddocs.f5.com/cloud/public/v1/ibm_index.html)
- [Deploy F5 BIG-IP Virtual Edition in IBM Cloud VPC Gen 2](https://clouddocs.f5.com/cloud/public/v1/ibm/ibm_deploy.html)
- [f5devcentral/ibmcloud_schematics_bigip_multinic_declared](https://github.com/f5devcentral/ibmcloud_schematics_bigip_multinic_declared)

今回はテスト用途なので、30日のトライアルライセンスを[ここ](https://www.f5.com/ja_jp/trials/big-ip-virtual-edition)から申請し、メールに送付されてきたライセンス情報を利用した。

# 2. 注文方法
カタログからF5を検索すれば、対象のタイルが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/fe9d0396-6294-bdb3-dfde-1e396ef46d9f.png)

以下は、画面に沿って値を入力していく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/eef9260c-63f7-de34-30a0-2e12cce597d2.png)

F5 BIG-IPの導入には内部的にはIBM Cloud Schematics（実装はTerraform）を使っているので、そのworkspace名を指定する必要がある（特にこだわりがなければデフォルトのままで良い）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/0c8721d7-05a2-31e2-0956-7fdeb84213de.png)



以下、今回変更した箇所を記した。
- ライセンス情報は後から入力可能なので、`none`のままで良い。
- TMOSはF5製品のOS(Operating System)であり、adminはブラウザアクセス用の管理IDである。


| Parameter | 今回の入力例 | 補足|
|:-----------|:------------|:------------|
| external_subnet_id  | `02e7-b50228c7-2431-4854-ad4c-b68f6c7382a7`   | 事前に作成した`10.4.0.0/24`のsubnet IDを指定。   |
| management_subnet_id  | `02e7-ff96ff2a-fa27-4d88-b855-98fb85112636`    |事前に作成した`10.0.0.0/24`のsubnet IDを指定    |
| region      | `jp-tok`       | 今回は東京リージョンを指定         |
| ssh_key_name        | `key-syasuda`      | （VSIのプロビジョニングなどにも利用する）事前に登録したSSH鍵の名前           |
| tmos_image_name      | `bigip-17`      | 2022年10月現在のデフォルト値のイメージは存在しないためエラーになる。 longest matchingでイメージ名が選択される。以下のnoteも参考に。<br> :warning: pull requestを送っています。     |
| resource_group    | `Default`     | `Optional Deployment values`として定義されているが、デフォルト値である`default`は不適切。IBM Cloudには標準で`Default`というリソースグループが存在するが、`Default`と`default`は異なるため、`default`のままだと該当するリソースグループが存在しないというエラーになる。適切なリソースグループを選択する必要があるため、むしろこれは`Required Deployment values`に分類されるべき項目。 <br> :warning: pull requestを送っています。  |
| tmos_admin_password    | `zaq12wsxcde34rfv`     | 後からCLIで設定できるが、すぐに使えるように設定。実環境では適切な値に変更してください。     |


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/1f44f5c8-48a1-7c36-79af-8a7aa20cc3e5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/a9720a63-f558-9a83-efc4-af6c751cacb2.png)


:::note
2022年10月20日現在、サブネットは指定できても、IPアドレスを指定してプロビジョニングすることはできないようです。改善を期待したいところです。
:::

:::note
2022年10月20日現在、以下のバージョンが利用できることを確認しています。利用可能なマイナーバージョンは頻繁にF5社によって変更されているようですが、docsの更新がありません。tmos_image_nameはlongest matchでイメージを決めているようなので、確実にプロビジョニングをしたい場合は、bigip-17などぐらいで指定しておいた方が安全だと思います。
- bigip-15-1-6-1-0-0-10
- bigip-16-1-3-1-0-0-11
- bigip-17-0-0-1-0-0-4
:::

- *2022/10/23追記*

適切なtmos_imageが選択されなかった場合は以下のようなエラーになる。

```
 2022/10/20 03:01:40 Terraform apply | Error: External Program Execution Failed
 2022/10/20 03:01:40 Terraform apply | 
 2022/10/20 03:01:40 Terraform apply |   on image.tf line 14, in data "external" "tmos_public_image":
 2022/10/20 03:01:40 Terraform apply |   14:   program = ["python3", "${path.module}/bigip_image_selector.py"]
 2022/10/20 03:01:40 Terraform apply | 
 2022/10/20 03:01:40 Terraform apply | The data source received an unexpected error while attempting to execute the
 2022/10/20 03:01:40 Terraform apply | program.
 2022/10/20 03:01:40 Terraform apply | 
 2022/10/20 03:01:40 Terraform apply | Program: /usr/bin/python3
 2022/10/20 03:01:40 Terraform apply | Error Message: No image in the public image catalog matched version bigip-18
 2022/10/20 03:01:40 Terraform apply | State: exit status 1
 2022/10/20 03:01:40 Terraform apply | 
 2022/10/20 03:01:40 [1m[31mTerraform APPLY error: Terraform APPLY errorexit status 1[39m[0m
 2022/10/20 03:01:40 [1m[31mCould not execute job: Error : Terraform APPLY errorexit status 1[39m[0m
```

この`bigip_image_selector.py`という名前から、おそらく[このスクリプト](https://github.com/f5devcentral/ibmcloud_schematics_bigip_multinic_declared/blob/master/bigip_image_selector.py)が使われていると想像される。よって、以下を実行することで現時点で有効なスクリプトを確認することができそうである。

```
$ curl -s https://f5-adc-jp-tok.s3.jp-tok.cloud-object-storage.appdomain.cloud/f5-image-catalog.json | jq -r '."jp-tok"[].image_name'
bigip-14-1-4-5-0-0-7-all-1slot-013122001-jp-tok
bigip-14-1-4-5-0-0-7-ltm-1slot-013122001-jp-tok
bigip-14-1-4-6-0-0-8-all-1slot-jp-tok
bigip-14-1-4-6-0-0-8-ltm-1slot-jp-tok
bigip-14-1-5-1-0-0-6-all-1slot-jp-tok
bigip-14-1-5-1-0-0-6-ltm-1slot-jp-tok
bigip-14-1-5-2-0-0-3-all-1slot-jp-tok
bigip-14-1-5-2-0-0-3-ltm-1slot-jp-tok
bigip-15-1-5-0-0-10-all-1slot-013122001-jp-tok
bigip-15-1-5-0-0-10-ltm-1slot-013122001-jp-tok
bigip-15-1-5-1-0-0-14-all-1slot-jp-tok
bigip-15-1-5-1-0-0-14-ltm-1slot-jp-tok
bigip-15-1-6-1-0-0-10-all-1slot-jp-tok
bigip-15-1-6-1-0-0-10-ltm-1slot-jp-tok
bigip-15-1-7-0-0-6-all-1slot-jp-tok
bigip-15-1-7-0-0-6-ltm-1slot-jp-tok
bigip-16-1-2-1-0-0-10-all-1slot-012722001-jp-tok
bigip-16-1-2-1-0-0-10-all-1slot-013122001-jp-tok
bigip-16-1-2-1-0-0-10-ltm-1slot-012722001-jp-tok
bigip-16-1-2-1-0-0-10-ltm-1slot-013122001-jp-tok
bigip-16-1-2-2-0-0-28-all-1slot-jp-tok
bigip-16-1-2-2-0-0-28-ltm-1slot-jp-tok
bigip-16-1-3-1-0-0-11-all-1slot-jp-tok
bigip-16-1-3-1-0-0-11-ltm-1slot-jp-tok
bigip-16-1-3-2-0-0-4-all-1slot-jp-tok
bigip-16-1-3-2-0-0-4-ltm-1slot-jp-tok
bigip-17-0-0-1-0-0-4-all-1slot-jp-tok
bigip-17-0-0-1-0-0-4-ltm-1slot-jp-tok
```
```
$ curl -s https://f5-adc-jp-osa.s3.jp-osa.cloud-object-storage.appdomain.cloud/f5-image-catalog.json | jq -r '."jp-osa"[].image_name'
bigip-14-1-4-5-0-0-7-all-1slot-013122001-jp-osa
bigip-14-1-4-5-0-0-7-ltm-1slot-013122001-jp-osa
bigip-14-1-4-6-0-0-8-all-1slot-jp-osa
bigip-14-1-4-6-0-0-8-ltm-1slot-jp-osa
bigip-14-1-5-1-0-0-6-all-1slot-jp-osa
bigip-14-1-5-1-0-0-6-ltm-1slot-jp-osa
bigip-14-1-5-2-0-0-3-all-1slot-jp-osa
bigip-14-1-5-2-0-0-3-ltm-1slot-jp-osa
bigip-15-1-5-0-0-10-all-1slot-013122001-jp-osa
bigip-15-1-5-0-0-10-ltm-1slot-013122001-jp-osa
bigip-15-1-5-1-0-0-14-all-1slot-jp-osa
bigip-15-1-5-1-0-0-14-ltm-1slot-jp-osa
bigip-15-1-6-1-0-0-10-all-1slot-jp-osa
bigip-15-1-6-1-0-0-10-ltm-1slot-jp-osa
bigip-15-1-7-0-0-6-all-1slot-jp-osa
bigip-15-1-7-0-0-6-ltm-1slot-jp-osa
bigip-16-1-2-1-0-0-10-all-1slot-012722001-jp-osa
bigip-16-1-2-1-0-0-10-all-1slot-013122001-jp-osa
bigip-16-1-2-1-0-0-10-ltm-1slot-012722001-jp-osa
bigip-16-1-2-1-0-0-10-ltm-1slot-013122001-jp-osa
bigip-16-1-2-2-0-0-28-all-1slot-jp-osa
bigip-16-1-2-2-0-0-28-ltm-1slot-jp-osa
bigip-16-1-3-1-0-0-11-all-1slot-jp-osa
bigip-16-1-3-1-0-0-11-ltm-1slot-jp-osa
bigip-16-1-3-2-0-0-4-all-1slot-jp-osa
bigip-16-1-3-2-0-0-4-ltm-1slot-jp-osa
bigip-17-0-0-1-0-0-4-all-1slot-jp-osa
bigip-17-0-0-1-0-0-4-ltm-1slot-jp-osa
```




# 3. プロビジョニングの実行

Installを押下すると、IBM Cloud Schematicsのworkspace上で淡々とプロビジョニングが実施される。5分程度で完了する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/0b61a26a-f056-49ee-b633-b61f2c5586ea.png)



なお、プロビジョニングに失敗した際は、再度注文画面に戻る必要はなく、失敗したworkspaceのSettingにて、パラメーター値を編集・上書きし、再度`Apply plan`を押下すれば即時に再実行できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/9966d317-d4f0-b610-0f07-a07a077fd8c9.png)



# 4. プロビジョニング後の状態

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/ee498e11-c4a4-6570-caed-cc37f318ec9f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/6f6f4c47-49f3-b229-fabf-36e1a44ea65e.png)

気をつけなければいけないのは、defaultのsecurity groupではなく、新たにsecurity groupが生成されており、しかもそのsecurity groupは全ての通信を許可するような構成になっていることである。Floating IPが割り当てられていないため、このままの状態でインターネットに晒されるわけではないが、実際に利用する際にはInboundだけでも早々に通信元を制限するように構成変更することが望ましい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/dfeeee0e-a38b-f879-ae7c-8a8f3db69dd5.png)



# 5. Web Consoleへのログイン確認とライセンス登録

- SSH port forwarding（`ssh -L 9443:10.0.0.27:443 踏み台サーバーのIPアドレス`）をして、端末上から`https://localhost:9443/`にアクセスしてF5のコンソールにアクセスする。UserIDは`admin`、Passwordは`tmos_admin_password`で設定した値を利用。 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/64aac03f-fd89-8dfd-fc1d-5d929e6cb53b.png)
- ログイン後の状態。Activateを押下 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/e970ba3d-cca5-b718-6b2c-9e95b9257658.png)
- ライセンス情報を入力。インターネットに繋がっていないので、Activation MethodはManualを選択。`Next`を押下。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/debfae71-7503-6855-53d6-25bde1a4a230.png)
- `Click here to access F5 Licensing Server`を押下。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/664fa799-da44-dcd4-83c3-6cc519d2ee9e.png)
- 先程の画面で表示された`Dossier`をコピー&ペーストし、`Next` ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/c51abb2b-36ea-06a8-bd2c-31a265f4a4cd.png)
- 内容を確認し、`Next` ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/5c56ce49-eef2-6ba3-d31f-ac38d624a629.png)
- ライセンスキーを入手した。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/59a8e80b-7567-08a8-ab5b-a468faa6cc5d.png)
- 前項で得られたライセンスキーをStep 3の項目にコピー＆ペーストして、`Next`。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/285073da-cea4-9513-b393-4e9728d6a083.png)
- 以下のように再ログインが求められる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/3ae9aadc-d2af-5036-cb6a-e8a83083bc21.png)
- 再度ログインする ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/4244d053-9693-d2d5-cb1f-6a8b19fc7bab.png)
- ライセンス登録が完了した。 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/e5bcf677-8643-0217-7579-696ea146db0f.png)



# 6. CLIによるログイン確認・設定確認

適当な踏み台サーバー経由でログインする。

```txt:バージョン情報の確認
[root@new-syasuda-tok1-vpc1 ~]# ssh root@10.0.0.27
The authenticity of host '10.0.0.27 (10.0.0.27)' can't be established.
ECDSA key fingerprint is SHA256:rqEgAHxbaB9jGmZiJlRWwF4agwgnIHVD5yS8aLRpBac.
ECDSA key fingerprint is MD5:9a:43:95:06:42:ab:af:3f:89:10:bf:81:ba:c0:ac:ab.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.27' (ECDSA) to the list of known hosts.

[root@f5-ve-01:Active:Standalone] config # tmsh
root@(f5-ve-01)(cfg-sync Standalone)(Active)(/Common)(tmos)# show sys version

Sys::Version
Main Package
  Product     BIG-IP
  Version     17.0.0.1
  Build       0.0.4
  Edition     Point Release 1
  Date        Fri Jul 15 01:45:12 PDT 2022
```
```txt:IPアドレス情報
root@(f5-ve-01)(cfg-sync Standalone)(Active)(/Common)(tmos)# show sys ip-address

--------------------------------------------------------
Sys::IP Address
Entry           Component             Object-ID
--------------------------------------------------------
default         net route             net_1_1_default_gw
8.8.8.8:domain  net dns-resolver      f5-aws-dns
8.8.8.8:domain  net dns-resolver      f5-aws-dns
8.8.8.8:domain  net dns-resolver      f5-aws-dns
10.0.0.1        sys management-route  default
10.0.0.27       cm device             f5-ve-01.local
10.4.0.12       cm device             f5-ve-01.local
10.4.0.12       cm device             f5-ve-01.local
10.4.0.12       cm device             f5-ve-01.local
161.26.0.7      sys dns               n/a
161.26.0.8      sys dns               n/a
```
```txt:ルーティング情報
root@(f5-ve-01)(cfg-sync Standalone)(Active)(/Common)(tmos)# show net route

----------------------------------------------------------------------------------
Net::Routes
Name                Destination         Type       NextHop               Origin
----------------------------------------------------------------------------------
net_1_1_default_gw  default             gw         10.4.0.1              static
127.20.0.0/16       127.20.0.0/16       interface  tmm_bp                connected
10.4.0.0/24         10.4.0.0/24         interface  /Common/net_1_1       connected
127.1.1.0/24        127.1.1.0/24        interface  tmm                   connected
ff02:fff::/64       ff02:fff::/64       interface  tmm_bp                connected
fe80::%vlan4095/64  fe80::%vlan4095/64  interface  tmm_bp                connected
fe80::/64           fe80::/64           interface  /Common/socks-tunnel  connected
fe80::/64           fe80::/64           interface  /Common/http-tunnel   connected
fe80::%vlan4095/64  fe80::%vlan4095/64  interface  /Common/tmm_bp        connected
ff02:fff::/64       ff02:fff::/64       interface  /Common/tmm_bp        connected
ff02:ffd::/64       ff02:ffd::/64       interface  /Common/net_1_1       connected
fe80::%vlan4093/64  fe80::%vlan4093/64  interface  /Common/net_1_1       connected
ff02::/64           ff02::/64           interface  tmm                   connected
fe80::/64           fe80::/64           interface  tmm                   connected
```
```txt:DNS情報
root@(f5-ve-01)(cfg-sync Standalone)(Active)(/Common)(tmos)# list sys dns name-servers
sys dns {
    name-servers { 161.26.0.7 161.26.0.8 }
}
```
```txt:NTPの設定確認と変更
root@(f5-ve-01)(cfg-sync Standalone)(Active)(/Common)(tmos)# list sys ntp
sys ntp {
    servers { 0.pool.ntp.org 1.pool.ntp.org }
    timezone UTC
}
root@(f5-ve-01)(cfg-sync Standalone)(Active)(/Common)(tmos)# modify sys ntp servers replace-all-with {time.adn.networklayer.com}
root@(f5-ve-01)(cfg-sync Standalone)(Active)(/Common)(tmos)# list sys ntp
sys ntp {
    servers { time.adn.networklayer.com }
    timezone UTC
}
root@(f5-ve-01)(cfg-sync Standalone)(Active)(/Common)(tmos)# quit
[root@f5-ve-01:Active:Standalone] config # ntpq -pn
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*161.26.0.6      172.25.65.16     2 u   46   64  377    1.489   15.842   4.620
[root@f5-ve-01:Active:Standalone] config # ntpq -c rv
associd=0 status=0615 leap_none, sync_ntp, 1 event, clock_sync,
version="ntpd 4.2.6p5@1.2349-o Fri Jul 15 08:24:45 UTC 2022 (1)",
processor="x86_64", system="Linux/3.10.0-862.14.4.el7.ve.x86_64",
leap=00, stratum=3, precision=-25, rootdelay=2.862, rootdisp=48.498,
refid=161.26.0.6,
reftime=e6fd958a.c7fc5c21  Fri, Oct 21 2022 22:02:50.781,
clock=e6fd9690.6fa86c2a  Fri, Oct 21 2022 22:07:12.436, peer=42461, tc=6,
mintc=3, offset=15.842, frequency=19.383, sys_jitter=0.000,
clk_jitter=11.469, clk_wander=0.369
```