クラウド上のLinuxインスタンスのパケットをリアルタイムでキャプチャする方法

# はじめに
NW関連のトラブルが発生した際や、各サーバ間の通信のやり取りを確認するには、
tcpdumpやWiresharkなどのパケットキャプチャソフトを用いてパケットを解析することがあります。

Wiresharkを用いることで、パケットをより詳細にビジュアライズに解析することができますが、
クラウド上のノードをWiresharkでキャプチャするには、一度tcpdumpでダンプファイルを取得後に、
ローカルにファイルを移して解析する、などの手間が発生します。
またその場合はリアルタイムでパケット解析が出来ないため、解析難易度も上がります。

今回はクライアント側のWindowsやLinuxから、クラウド上に設置されたLinuxインスタンスのパケットをリアルタイムで手軽に取得してみたいと思います。

クラウドはOCI (Oracle Cloud Infrastructure) を利用し、
- パブリックサブネット上のインスタンス
- プライベートサブネット上のインスタンス(Bastionサービス経由での取得)

を対象に取得してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/8e5412af-da45-6ec8-19f4-e31a97672f76.png)




# 条件
キャプチャ対象マシン：ssh許可、tcpdumpがインストール済み
クライアントPC(キャプチャ閲覧)：Windows or Linux、Wiresharkインストール済み

＊sshを受け付けられるように、OCI上のNSG,セキュリティリストは適宜設定ください

# 実行方法
まず事前にWindowsPCのコマンドプロンプト or Linuxのターミナル上から、
sshで該当のインスタンスにログインし、接続の確認を行ってください。(yesを入力)
こちらを済ませておかないと、この後正しくパケットを受け取れません。
```
>ssh -i [KeyPath] [HostName]
The authenticity of host 'xx.xx.xx.xx (<no hostip for proxy command>)' can't be established.
ECDSA key fingerprint is SHA256:<略>.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'xx.xx.xx.xx' (ECDSA) to the list of known hosts.
```

## Windowsからのリモートキャプチャ

下記コマンドを入力すること自動的にWiresharkが立ち上がり、キャプチャが開始されます。
```shell
>ssh -i [KeyPath] [HostName] "sudo tcpdump -U -w - -i [NICName] not port 22" | "C:\Program Files\Wireshark\Wireshark.exe" -k -i -

例)
>ssh -i privateKey opc@xxx.xxx.xxx.xxx "sudo tcpdump -U -w - -i ens3 not port 22" | "C:\Program Files\Wireshark\Wireshark.exe" -k -i -
```
＊今回はsshポート(22番)をキャプチャしないように、`not port 22`をtcpdumpのオプションに付与しています


## Linux上からのリモートキャプチャ
こちらもWindowsと同様にPipeを繋げてあげることで利用可能です。
＊Mac環境が無いためわかりませんが、Macでも同様に下記コマンドで実施できるはずです。

```shell
$ ssh -i .ssh/privatekey opc@xxx.xxx.xxx.xxx "sudo tcpdump -U -w - -i ens3 not port 22" | sudo wireshark -k -i -
```



必要に応じてWireshark上でさらにフィルタをかけることも可能です。

下図はLinuxインスタンス上でPingした結果(左枠)を、Windows上のWiresharkでicmpにフィルタした上でリモートキャプチャしている(右枠)図となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/9abde7c0-dd3d-a8db-c980-9193aef850b8.png)



# 要塞経由でのリモートキャプチャ
OCIには要塞(Bastion)というサービスがあり、
インスタンスがパブリックサブネットに存在していなくても(グローバルIPを持っていなくても)、
Bastionサービスを利用することでセキュアにアクセスすることが可能です。
[OCI Bastionは22年5月現在、無償で利用可能です。](https://www.oracle.com/jp/security/cloud-security/bastion/faq/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/9792b02a-e191-a75e-6799-2872533bd7a2.png)


＊要塞サービスの詳細はこちらをご確認ください。
https://docs.oracle.com/en-us/iaas/Content/Bastion/Concepts/bastionoverview.htm
インターネットゲートウェイは不要ですが、該当インスタンスにBastionプラグインを有効化させる必要があることと、該当VCNのルーティングでサービスゲートウェイへのアクセスを可能にしておく必要があります。
>Before creating a Managed SSH session, verify that:
>- The Bastion plugin is enabled on the target compute instance . See Managing Plugins with Oracle Cloud Agent.
>- The VCN includes a service gateway  and a route rule for the service gateway. See Access to Oracle Services: Service Gateway.

## Bastion経由でのリモートキャプチャ
こちらを利用した接続の場合も下記コマンドでクライアントPCからのリモートキャプチャが可能です。

```shell
> [Bastionセッションから展開されたSSHコマンド] "sudo tcpdump -U -w - -i [NICName] not port 22" | "C:\Program Files\Wireshark\Wireshark.exe" -k -i -

#Windowsでの例
> ssh -i privateKey -o ProxyCommand="ssh -i privateKey -W %h:%p -p 22 ocid1.bastionsession.<略>@host.bastion.uk-london-1.oci.oraclecloud.com" -p 22 opc@10.0.20.212 "sudo tcpdump -U -w - -i ens3 not port 22" | "C:\Program Files\Wireshark\Wireshark.exe" -k -i -

#Linuxでの例
$ ssh -i privateKey -o ProxyCommand="ssh -i privateKey -W %h:%p -p 22 ocid1.bastionsession.<略>@host.bastion.uk-london-1.oci.oraclecloud.com" -p 22 opc@10.0.20.212 "sudo tcpdump -U -w - -i ens3 not port 22" | sudo wireshark -k -i -
```

インターネットゲートウェイを通過せず、
非常にセキュアな解析も可能になるためこちらのサービスもぜひ利用してみてください。


# 参考
- [Wireshark Pipes | Remotecapture](https://wiki.wireshark.org/CaptureSetup/Pipes#remote-capture)
- [Windows上のWireSharkでリモートのLinuxのtcpdumpをリアルタイムで表示する](https://qiita.com/kure/items/16191bb3c0b6558d0b30)
- [OCI 要塞の概要](https://docs.oracle.com/ja-jp/iaas/Content/Bastion/Concepts/bastionoverview.htm)