パケットキャプチャでリバプロの動きを確認

前回の記事で、Nginx でリバースプロキシを立ててみました。[記事](https://qiita.com/dessin/items/d2854a0025f6ea01f7b7)

今回は、その動きを詳しく見るためにパケットキャプチャをします。
## 要約
tshark をリバースプロキシにインストールし、バックエンドサーバとの通信をキャプチャする。
ついでにSSH も見えた。
## 作業
### インストール
tshark はかの有名なwireshark のコマンドライン版だそうです。t はterminal
wireshark をインストールすると勝手についてくるようです。
リバースプロキシにインストールします。
```
(RevProxyで)
# sudo dnf install wireshark 
```
tshark だと、root ユーザーでコマンド実行すると警告がでますが今のところ無視します。
### コマンド
tshark のオプションはいろいろありますが、パケットキャプチャと言えばフィルタなのでそこに注目します。
``` 
# tshark -i eth0 -f 'host 10.0.1.4'
Capturing on 'eth0'
```

:::note
-i オプション：インターフェイス指定
-f オプション：フィルタ（今回はホストのIP アドレスを指定。クオーテーションが必要）
:::

eth0 とは、リバースプロキシがバックエンドのWEB サーバに向けているインターフェイスです。
10.0.1.4 はそのバックエンドのwWEB サーバです。
このフィルタで、10.0.1.4 を送信元または宛先に含む、eth0 のパケットが見られるはず。

:::note
自分用
今回の環境で、-i オプション抜きで -f 'host 10.0.1.4' を打つと勝手にeth0 でキャプチャが始まった。たぶん他にインターフェイスがないことが原因。ふつうは指定が必要なんでしょう。
:::

### キャプチャ
想定される通信は、
1. 踏み台サーバとしてのリバースプロキシからWEB サーバへのSSH 
1. 自分PC のブラウザからリバースプロキシにアクセスしたときにリダイレクトされる通信

です。
適当に観察して遊びましょう。
```
  102 620.383164766     10.0.0.4 → 10.0.1.4     TCP 74 49908 → 80 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=1307360433 TSecr=0 WS=128
  103 620.384395364     10.0.1.4 → 10.0.0.4     TCP 74 80 → 49908 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1410 SACK_PERM=1 TSval=2192855130 TSecr=1307360433 WS=128
  104 620.384422864     10.0.0.4 → 10.0.1.4     TCP 66 49908 → 80 [ACK] Seq=1 Ack=1 Win=29312 Len=0 TSval=1307360434 TSecr=2192855130
  105 620.384466264     10.0.0.4 → 10.0.1.4     HTTP 547 GET / HTTP/1.0
  106 620.385108763     10.0.1.4 → 10.0.0.4     TCP 66 80 → 49908 [ACK] Seq=1 Ack=482 Win=30080 Len=0 TSval=2192855131 TSecr=1307360434
  107 620.386224562     10.0.1.4 → 10.0.0.4     TCP 250 HTTP/1.0 200 OK  [TCP segment of a reassembled PDU]
  108 620.386245462     10.0.0.4 → 10.0.1.4     TCP 66 49908 → 80 [ACK] Seq=482 Ack=185 Win=30336 Len=0 TSval=1307360436 TSecr=2192855131
  109 620.386253362     10.0.1.4 → 10.0.0.4     HTTP 129 HTTP/1.0 200 OK  (text/html)
  110 620.386259162     10.0.1.4 → 10.0.0.4     SSH 166 Server: Encrypted packet (len=100)
  111 620.386264762     10.0.0.4 → 10.0.1.4     TCP 66 48054 → 22 [ACK] Seq=1249 Ack=993 Win=317 Len=0 TSval=1307360436 TSecr=2192855132
  112 620.386445962     10.0.0.4 → 10.0.1.4     TCP 66 49908 → 80 [FIN, ACK] Seq=482 Ack=249 Win=30336 Len=0 TSval=1307360436 TSecr=2192855131
  113 620.387292461     10.0.1.4 → 10.0.0.4     TCP 66 80 → 49908 [ACK] Seq=249 Ack=483 Win=30080 Len=0 TSval=2192855133 TSecr=1307360436
```
以上は、ブラウザでNginx のアドレスにアクセスしたときのキャプチャ結果です。一回のアクセスで12 のパケットがやり取りされてます。6 往復ですね。
* 102 ~ 104 でスリーウェイハンドシェイクでTCP が確立されています。
* 105 でHTTP のGET リクエスト。スリーウェイハンドシェイクのACK と同時に飛んでますね。
* 106, 107 はそれぞれ104, 105 への応答です。107 は分割されたTCP パケットが来たというメッセージがついてますね。
* 108 は107 への応答
* 109 はファイル送り終わったよというパケットでしょうか。
* 110 にはSSH が入り込んでます。リバースプロキシを踏み台として利用してバックエンドサーバにSSH しているので見づらくなってますが、バックエンドが出すログが、踏み台サーバのコンソールに見えているのでそれだと思います。
* 112 ですが、HTTP クライアントからFIN が来てます。この後FIN がバックエンドサーバから来るのが、TCP 終了の手続きだと思いますがなんで来ないんだろう。ブラウザ閉じたりしても来ない。

以上の通り、SSH を抜くと5 往復でしたね。

ついでにSSH の開始時の通信を見ておきます。
```
    1 0.000000000     10.0.0.4 → 10.0.1.4     TCP 74 54256 → 22 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=1310570799 TSecr=0 WS=128
    2 0.001565899     10.0.1.4 → 10.0.0.4     TCP 74 22 → 54256 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1410 SACK_PERM=1 TSval=2196065496 TSecr=1310570799 WS=128
    3 0.001598699     10.0.0.4 → 10.0.1.4     TCP 66 54256 → 22 [ACK] Seq=1 Ack=1 Win=29312 Len=0 TSval=1310570801 TSecr=2196065496
    4 0.001821199     10.0.0.4 → 10.0.1.4     SSH 87 Client: Protocol (SSH-2.0-OpenSSH_8.0)
    5 0.002474698     10.0.1.4 → 10.0.0.4     TCP 66 22 → 54256 [ACK] Seq=1 Ack=22 Win=29056 Len=0 TSval=2196065497 TSecr=1310570801
    6 0.021232183     10.0.1.4 → 10.0.0.4     SSHv2 87 Server: Protocol (SSH-2.0-OpenSSH_8.0)
    7 0.021247383     10.0.0.4 → 10.0.1.4     TCP 66 54256 → 22 [ACK] Seq=22 Ack=22 Win=29312 Len=0 TSval=1310570820 TSecr=2196065516
    8 0.022585182     10.0.0.4 → 10.0.1.4     SSHv2 1434 Client: Key Exchange Init
    9 0.024974780     10.0.1.4 → 10.0.0.4     SSHv2 1114 Server: Key Exchange Init
   10 0.026823079     10.0.0.4 → 10.0.1.4     SSHv2 114 Client: Diffie-Hellman Key Exchange Init
   11 0.032409874     10.0.1.4 → 10.0.0.4     SSHv2 526 Server: Diffie-Hellman Key Exchange Reply, New Keys, Encrypted packet (len=180)
   12 0.035010572     10.0.0.4 → 10.0.1.4     SSHv2 82 Client: New Keys
   13 0.079225536     10.0.1.4 → 10.0.0.4     TCP 66 22 → 54256 [ACK] Seq=1530 Ack=1454 Win=31872 Len=0 TSval=2196065572 TSecr=1310570834
   14 0.079242536     10.0.0.4 → 10.0.1.4     SSHv2 118 Client: Encrypted packet (len=52)
   15 0.081238435     10.0.1.4 → 10.0.0.4     TCP 66 22 → 54256 [ACK] Seq=1530 Ack=1506 Win=31872 Len=0 TSval=2196065576 TSecr=1310570878
   16 0.081251235     10.0.1.4 → 10.0.0.4     SSHv2 118 Server: Encrypted packet (len=52)
   17 0.081326235     10.0.0.4 → 10.0.1.4     SSHv2 134 Client: Encrypted packet (len=68)
   18 0.091597127     10.0.1.4 → 10.0.0.4     SSHv2 150 Server: Encrypted packet (len=84)
   19 0.132507194     10.0.0.4 → 10.0.1.4     TCP 66 54256 → 22 [ACK] Seq=1574 Ack=1666 Win=34304 Len=0 TSval=1310570932 TSecr=2196065586

```
ssh コマンドを実行してパスワードを入力するまででこんな感じでした。
Diffie-Hellman 鍵交換が見えて、すげぇ！ネスぺで見たやつだ！ってなりました。
SSH を見ていると長くなりすぎそうなので、今度書きます。

お疲れさまでした。