前回の記事で、Nginx でリバースプロキシを立ててみました。記事
今回は、その動きを詳しく見るためにパケットキャプチャをします。
要約
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'
-i オプション:インターフェイス指定
-f オプション:フィルタ(今回はホストのIP アドレスを指定。クオーテーションが必要)
eth0 とは、リバースプロキシがバックエンドのWEB サーバに向けているインターフェイスです。
10.0.1.4 はそのバックエンドのwWEB サーバです。
このフィルタで、10.0.1.4 を送信元または宛先に含む、eth0 のパケットが見られるはず。
自分用
今回の環境で、-i オプション抜きで -f 'host 10.0.1.4' を打つと勝手にeth0 でキャプチャが始まった。たぶん他にインターフェイスがないことが原因。ふつうは指定が必要なんでしょう。
キャプチャ
想定される通信は、
- 踏み台サーバとしてのリバースプロキシからWEB サーバへのSSH
- 自分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 を見ていると長くなりすぎそうなので、今度書きます。
お疲れさまでした。