OCIのVTAP(Virtual Test Access Points)機能を使ってみた

# VTAPとは
OCIにVTAP(Virtual Test Access Points)機能がリリースされました。
[こちら](https://docs.oracle.com/ja-jp/iaas/Content/Network/Tasks/vtap.htm)によると、下記のような機能だとの事です。

>仮想テスト・アクセス・ポイント(VTAP)を使用すると、指定されたソースから選択したターゲットにトラフィックをミラー化して、トラブルシューティング、セキュリティ分析およびデータ監視を容易にできます。

L2SWで利用できるミラーポートに近い機能をOCI上で実現できると解釈したので、早速使ってみたいと思います。

# 前提条件
VTAPを利用してミラーしたトラフィックは、
一度Network Load Balancer(NLC)を経由して受信する必要があります。
そのため事前にNLBを作成し、パケットを受信するインスタンスを別で用意する必要があります。

またトラフィックミラーが出来る対象(ターゲット)は、2022年5月現在、
- DBCS
- Exadata VM cluster
- インスタンスVNIC
- Load Balancer
- Autonomous Data Warahouse(プライベートエンドポイントを利用)

となっています。([参考](https://docs.oracle.com/en-us/iaas/Content/Network/Tasks/vtap.htm))

# 検証構成
今回は、
- VTAPソース：パブリックサブネット上に構築したWebサーバ
- VATPターゲット：プライベートサブネット上に立てたNLB

とし、NLBの配下にパケットキャプチャ用のインスタンス(Network Monitor)を立ち上げます。

外部からWebサーバへアクセスした際のトラフィックのミラーが、
VTAPを経由してVM(Network Monitor)でキャプチャできることをゴールとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/e01d5a8e-5cf6-7ddd-8952-b68597fb4216.png)




＊各種VMは事前に構築済みの前提で進めます。

# 使ってみる
## NLBの作成
ネットワーキング -> ロードバランサ
からロードバランサの作成
- タイプ：ネットワーク・ロード・バランサを選択
- 詳細の追加
    - ロードバランサ名：任意
    - 可視性タイプの選択：プライベート
    - ネットワーキングの選択
        - 仮想クラウドネットワーク：該当VCNを選択
        - サブネット：該当PrivateSubnetを選択
- リスナーの構成
    - リスナー名：任意
    - リスナーで処理するトラフィックのタイプの指定：UDP/TCP/ICMP
- バックエンドの選択
    - バックエンド・セット名：任意
    - ソース/宛先ヘッダー(IP、ポート)の保持：有効
    - バックエンド・サーバーの選択：キャプチャ用のインスタンスを選択
    - ヘルス・チェック・ポリシーの指定
        - プロトコル：TCP
        - ポート：80
        何かしら設定が必要なので、tcpの80にしたがこれはお好みで。
        ヘルスチェックがOKにならないとパケットが通過しないので、インスタンスではhttpdも稼働させるようにした。(後述)

## パケットキャプチャ用のインスタンス(Network Monitor)の設定
### httpdの有効化(任意)
前述の通りNLBのヘルスチェックポリシーをtcp:80としたため、httpdを合わせて起動させた。
`$ sudo systemctl start httpd`
＊ヘルスチェックがNGとなると、パケットをNLB配下のインスタンスに流さないため、暫定的にhttpdを起動させた。

### firewalldの無効化
必要に応じてfirewalldなどは無効化ください。
`$ sudo systemctl stop firewalld`
＊筆者はこちらを失念しパケットを受信できず、ハマってしまいました。

### ソース/宛先チェックのスキップ
該当インスタンスの詳細 -> アタッチされたVNIC -> VNICの編集をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/99fe12a8-7879-b8ae-4fcd-e9c444aa4e5c.png)

ソース/宛先チェックのスキップ：チェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/a52de790-c521-79a4-a681-6d22cba52220.png)

＊こちらを選択しておかないと、ミラーして流れてきたパケットが破棄されてしまうためチェックを入れ、保存する。
(通常ではSource or DestinationのIPが、このVNICと関係ないパケットだと自動で破棄するようにチェック機能が有効化されているので、チェックを入れてこの機能をスキップさせる)

## VTAPの作成
### 仮想クラウドネットワークの選択

対象のVCNのリソース配下のVTAPを選択
ネットワーキング -> 仮想クラウドネットワーク -> 仮想クラウド・ネットワークの詳細
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/573c036f-bb11-5e42-0d7e-539f99e9a34a.png)

### VTAPの作成
VTAPの作成をクリックし下記のように選択
- 名前：任意
- ソース
    - ソースタイプ：インスタンスVNIC
    - サブネット：パブリックサブネットを任意で選択
    - インスタンスのVNIC：事前に作成したWebサーバのインスタンスを任意で選択
- ターゲット
    - リソースタイプ：Network Load Balancer
    - サブネット：プライベートサブネットを任意で選択
    - Network load balancer：先ほど作成したNLB名を選択
- 取得フィルタ
    - 新規でフィルタ(ルール)を作成
        - 名前：任意
            - 順序番号1
                - 方向：イングレス
                - 包含/除外：含める
                - ソースCIDR：[空白]
                - 宛先CIDR：[空白]
                - IPプロトコル：All
            - 順序番号2
                - 方向：エグレス
                - 包含/除外：含める
                - ソースCIDR：[空白]
                - 宛先CIDR：[空白]
                - IPプロトコル：All

    ＊フィルタルールをイングレス/エグレス共に設定しておかないと、パケットが双方向受信できない

作成完了後、起動を選択することでパケットのミラーリングが開始されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/ac25c74b-728b-ad39-9bd3-240ab5a6a4b9.png)



# 動作確認
### パケットキャプチャサーバ側
こちらのサーバ側でtcpdumpを実行し、
外部からWebサーバへアクセスした際のパケットをミラーで取得させてみました。

下記フローログをみるとわかるように、
青枠内のパケット：クライアントPC ⇔ Webサーバ
間のパケットがパケットキャプチャサーバから取得出来ていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/87fe4e95-dab9-25a6-da6c-50956b95e7c3.png)
もちろん通常では取得が出来ないパケットになりますので、無事に動作確認が出来ました。

# チェックポイント
構築時にハマる事が多々あったので、チェックポイントも掲載しておきます。
- NLBのヘルスチェックがOKになっていること
- パケットキャプチャサーバのfirewalldが無効になっていること
- パケットキャプチャサーバのVNICに対して"ソース/宛先チェックのスキップ"が有効になっていること
- VTAPを起動させること(ステータスが"実行中"になっていること)


# 最後に
従来ではパケット解析を行いたい場合は、
対象のインスタンスに対してtcpdumpを実施させる必要があったが、
インスタンスに不必要なパッケージを入れてしまう点や、tcpdump実行時に多少なりとも負荷がかかる懸念があった。
VTAP機能を用いることでこれらを解消でき、かつADWなどtcpdumpを直接実行できない環境からもパケット解析が可能になる点で非常に有益な機能だと感じました。
またVTAP自体の料金は無料です。(各種インスタンスやNLBの課金は発生します)

本記事がVTAP導入の助けになれば幸いです。


# 参考
- [VTAP for Oracle Cloud Infrastructureの発表](https://blogs.oracle.com/oracle4engineer/post/announcing-vtap-for-oracle-cloud-infrastructure-ja)
- [Oracle Cloud Infrastructure Documentation : Virtual Test Access Points](https://docs.oracle.com/en-us/iaas/Content/Network/Tasks/vtap.htm)
- [VTAPによるネットワーク・トラフィックのフォレンジック分析](https://docs.oracle.com/ja/solutions/vtap-forensic-analysis/index.html#GUID-E4EFE01E-64C1-42E9-AC66-E89895631B5A)