概要

はじめに

  • 今回は、サーバーを通過するhttps通信のパケットをキャプチャして調査を開始するまでの流れを説明します。
  • パケットキャプチャには、メジャーなLinuxのtcpdumpコマンドを使用します。tcpdumpコマンドによって取得したダンプの調査は、WindowsクライアントにインストールしたWiresharkを使用します。

前提条件

  • ネットワーク上で発生したトラブルシューティングの初心者向けにまとめます。
  • AWSのVPC内に設置したリバースプロキシ(EC2)→ ALB → ウェブサーバー構成があり、今回はリバースプロキシにてtcpdumpを取得します。(疎通確認は、踏み台(EC2)からcurlを投げます)
  • EC2は、Amazon Linux 2を使用します。リバースプロキシ(EC2)までの通信はhttps(443)、リバースプロキシ(EC2)~後続のALB間はhttp(80)となります。
  • 事前にWindowsクライアントにWiresharkをインストールします。httpsの暗号を復号化するための秘密鍵を準備します。

パケットキャプチャの方法

tcpdumpコマンドによるパケットキャプチャ

  • キャプチャ対象のサーバーに、tcpdumpを仕掛けます。
    • tcpdumpをスーパーユーザーで実行します。
    • 複数のインタフェースがあれば、-i でインタフェースを指定します。今回は1つしかないため、省略します。
    • -s でキャプチャするサイズを指定します。デフォルトはサイズの制限があるとのことで、-s 0 を指定します。
    • ポートの絞り込みが可能であれば、port XX(送受信のポート指定)or src port XX(受信のポート指定)or dst port XX(送信のポート指定) を指定します。今回は送受信のポートを 443 に指定します。
    • -w でダンプファイルを指定します。長期間取得する場合は、書き込むファイルシステムの空き容量を確認しましょう。
$ sudo tcpdump -s 0 -w /tmp/tcpdump_20191022-1.out port 443
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C61 packets captured ← リクエスト終了後に、[Ctrl]+[C]にて停止
61 packets received by filter
0 packets dropped by kernel
  • テスト用のサーバーからリクエスト(curlコマンド)を投げます。
$ curl -v --resolve dev01.example.com:443:10.10.1.23 https://dev01.example.com/healthCheck --cacert XXXXX.pem.cer

** 省略 **

< HTTP/1.1 200 OK
< Date: Tue, 22 Oct 2019 05:13:47 GMT
< Server: Apache
< Content-Type: application/json;charset=UTF-8
< Content-Length: 19
<
* Connection #0 to host dev01.example.com left intact
Received a request.
  • tcpdumpの採取が長時間の場合、ログアウトしてもプロセスが停止しないようにnohupを付けて実行します。
$ nohup sudo tcpdump -s 0 -w /tmp/tcpdump_20191022-1.out port 443 &

scp or sftpによるダンプファイルのダウンロード

  • scp or sftpコマンドあるいはCyberduckなどのソフトウェアを使用して、Wiresharkをインストールしたクライアントにダンプファイルをダウンロードします。

全文はこちら

https通信をtcpdumpでキャプチャしてWiresharkする方法(著者:新川 貴章)