OCI 特定ホストの通信データをWiresharkでパケットキャプチャ

## 概要
通信問題が発生した時はデータセンターにWireshark PC持ち込んで、Switchにミラー設定して
Wiresharkでパケットキャプチャして解析ということをよくやっています。パブリッククラウド内で通信問題発生した時にPC持ち込んで調査というわけにはいかないのですが、特定NICのパケットをミラーリングしてくれるサービスがありますので今回はOracle Cloud(OCI)を使って設定検証してみました。

## 検証構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/ca50c6da-5847-792b-bc16-3d9c51519128.png)


OCI内にWebサーバとLoadBalancerを構築してPCから簡単なhttp通信ができるようにします。
今回はWebサーバの入出力パケットとLoadBalancerの入出力パケットを取得します。
取得はVTAPの機能を使ってミラーリングされたパケットがNLBを通じてNLB配下のホストに転送されます。
https://docs.oracle.com/ja/solutions/oci-network-vtap-wireshark/index.html#GUID-3196621D-12EB-470A-982C-4F7F6F3723EC
今回はNLB転送先はWindows上にWiresharkをインストールして確認します。

## 検証設定

Wireshark PC、NLB設定、VTAP取得フィルタ、VTAP設定が必要なようです。

まずはWireshark PC設定から行っていきます

■Wireshark PC
Windowsサーバをデプロイ
Wiresharkをインストール
適切なFirewallルールを設定
適切なNSG,Security Listを設定

■NLB
OCIコンソールからネットワーキング>ロードバランサー>ロードバランサーの作成

ネットワークロードバランサーを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/3cc6b9f4-50c0-b7d2-aaf9-d088b860c04b.png)

【詳細の追加】
ロードバランサ名の入力
可視性タイプの選択
設置するセグメントの選択
（ネットワークセキュリティグループは任意。今回は検証のため設定していますがセキュリティを考慮して適切に設定されることをおすすめします）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/01bd6b2d-af52-87a0-c6d4-646b06a0b3c5.png)


【リスナーの構成】
リスナー名の入力
リスナーで処理するトラフィックタイプはUCP/TCP/ICMPを指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/2c247e16-19bb-0a58-c853-5d68bcc4e943.png)

【バックエンドの選択】

バックエンドセット名の入力
ソース・ヘッダー(IP、ポート)の保持(バックエンド・セット)はソースIPの保持されていることを確認
バックエンドサーバーはWireshark導入したPCを選択
ヘルスチェックポリシーはポート80を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/4505f968-3706-20c3-f3e9-08466f996332.png)

■VTAP 取得フィルタ
ネットワーキング>ネットワーク・コマンド・センター>取得フィルタの作成
名前の入力
ルール設定
今回はイングレス、エグレスともにすべて対象としています。通信負荷を下げるため可能であればフィルタすることも要検討です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/415b54ea-e9c8-418f-3390-71e72665d857.png)

■VTAP
ネットワーキング>ネットワーク・コマンド・センター>VTAPの作成
名前の入力
ソース
　パケット取得するVMまたはLBを選択します
ターゲット
　先程設定したNLBを指定します
取得フィルタ
　先程設定した取得フィルタを指定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/bdfa7e4a-cdfb-16eb-3ec3-02f314cb52ec.png)

拡張オプション　優先順位モード
デフォルトではミラーパケットは本番パケットよりも優先度が低く設定されています
チェックをつけることにより本番パケットと同等の優先になるようです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/376b05e5-52db-e2af-158b-dc0399de559e.png)

設定が完了すると起動ボタンを押下します。ステータスが実行中になることを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/49d384fd-62e6-d8c2-fdf0-4ae0a33946ed.png)

## 検証結果
■PC～Webサーバ間通信をPCとWebサーバにてパケットキャプチャ

3wayハンドシェイクのWebサーバからのSYN-ACKがWebサーバ側ではキャプチャできていません。
それ以外は綺麗に取れています。
Webサーバ側でパケット順番はひっくり返っていますがきっとどこかのLAN内でアグリゲーションしていてパケット順序が変わっただけかと思います。

[PC]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/ed1a585c-4db9-cbee-bf35-78449da9db29.png)
[Webサーバ]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/9516c694-808f-af22-f0bf-0cbc99d2f246.png)

■PC～Webサーバ間通信をPCとLoadBalancerにてパケットキャプチャ

続いてLoadBalancerでも取得できるかテストしました。
前のテストと同様に3wayハンドシェイクのWebサーバからのSYN-ACKがWebサーバ側ではキャプチャできていません。
それ以外は綺麗に取れています。

[PC]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/31e53e63-0ee9-d021-cb54-312baa00c088.png)
[LoadBalancer]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/f075b0e8-5aa9-fa38-06ac-394e72cfd27b.png)

## キャプチャ設定の考慮
パケットキャプチャーはLAN環境や取得PCのスペックによって正常に取得できないことがあります（これはオンプレ環境でも同じ）
正確に取得できなかった場合いくつか方法を検討することが必要と感じました
* 取得PCのスペックを上げる。ケチって1vcpu, 8GBメモリでテストするとパケットが正確にとれなかったので2vcpu, 16GBメモリで行いました。
* Wiresharkをコマンドで実施する
* WindowsからLinuxに変えてみる
* VTAPの優先モードを変えてみる

また、なぜかサーバのSYN-ACKパケットは何度キャプチャしてもとれませんでした。
何か取得設定漏れがあるのかもしれませんが、SYN-ACKに対してのPCからのACKは取れているので特に問題ではありません

上記の考慮点があったとしてもパケットキャプチャできるのはネットワークトラブルシューティングする際には非常に有効な手段かと思います。
郊外のDCにパソコン持ち込んで作業するようなことしなくてすみます。