[Ubuntu] tcpdumpでパケットキャプチャしてみた

この記事は約8分で読めます。

tcpdumpというツールを使うことでパケットを表示することができるようになります。
ローカルサーバーを立ててHTTP通信をキャプチャしてみたため、その結果をまとめます。

tcpdumpとは

tcpdumpはLinuxで使われるパケットキャプチャツールです。ネットワーク上にどのようなパケットが流れているのかを確認することができます。

LiveServerでローカルサーバーをたてる

今回はVSCodeのLive Serverという拡張機能を使用してローカルサーバーを立て、そこに流れるパケットを監視することにしました。

Live Server - Visual Studio Marketplace
Extension for Visual Studio Code - Launch a development local Server with live reload feature for static & dynamic pages

(わたしの環境では)ポート5500でアクセスすることができます。以下のようなindex.htmlを作成しました。

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>tcpdump テストHTMLファイル</title>
    <link rel="stylesheet" href="style.css" />
  </head>
  <body>
    <header class="header">header</header>
    <main class="main">
      <h1>Hello, World!</h1>
    </main>
    <footer class="footer">footer</footer>
  </body>
</html>

tcpdumpでパケットをキャプチャする

以下のコマンドを実行してパケットキャプチャを行いました。

sudo tcpdump -A -i lo tcp port 5500

コマンドの解説

  • -A: キャプチャしたパケットをASCII文字列で出力するオプションです。似たようなオプションとして、パケットを16進数で出力する-Xオプションがあります。
  • -i lo: パケットをキャプチャするインターフェースを指定します。今回はローカルサーバーに流れるパケットを監視するため、ループバックインターフェースのloを指定しています。
  • tcp port 5500: フィルタ条件を設定するオプションです。ここではTCPプロトコルを使用して、ポート番号5500で送受信されるパケットのみを出力するようにしています。

実行結果

以下がLiveServerで立てたサーバーにアクセスした時の出力内容です。たくさん出力されていたのですが、その中から気になった9個のパケットを抜き出して見ました。なお、出力内容は一部省略している可能性があります。

17:11:07.305957 IP localhost.43846 > localhost.5500: Flags [S], seq 1283261177, win 65495, options [mss 65495,sackOK,TS val 574771742 ecr 0,nop,wscale 7], length 0
E..<.Y@.@.T`.........F.|L}...........0.........
"BR.........
17:11:07.305975 IP localhost.5500 > localhost.43846: Flags [S.], seq 232759992, ack 1283261178, win 65483, options [mss 65495,sackOK,TS val 574771742 ecr 574771742,nop,wscale 7], length 0
E..<..@.@.<..........|.F....L}.......0.........
"BR."BR.....
17:11:07.305987 IP localhost.43846 > localhost.5500: Flags [.], ack 1, win 512, options [nop,nop,TS val 574771742 ecr 574771742], length 0
E..4.Z@.@.Tg.........F.|L}...........(.....
"BR."BR.

17:11:07.326200 IP localhost.43846 > localhost.5500: Flags [P.], seq 1:740, ack 1, win 512, options [nop,nop,TS val 574771762 ecr 574771742], length 739
E....[@.@.Q..........F.|L}.................
"BR2"BR.GET /index.html HTTP/1.1
Host: 127.0.0.1:5500
Connection: keep-alive
17:11:07.326215 IP localhost.5500 > localhost.43846: Flags [.], ack 740, win 506, options [nop,nop,TS val 574771762 ecr 574771762], length 0
E..4.x@.@..I.........|.F....L}.......(.....
"BR2"BR2

17:11:07.327401 IP localhost.5500 > localhost.43846: Flags [P.], seq 1:829, ack 740, win 512, options [nop,nop,TS val 574771764 ecr 574771762], length 828
E..p.y@.@............|.F....L}.......e.....
"BR4"BR2HTTP/1.1 200 OK
Vary: Origin
Access-Control-Allow-Credentials: true
17:11:07.327412 IP localhost.43846 > localhost.5500: Flags [.], ack 829, win 506, options [nop,nop,TS val 574771764 ecr 574771764], length 0
E..4.\@.@.Te.........F.|L}...........(.....
"BR4"BR4
17:11:07.327530 IP localhost.5500 > localhost.43846: Flags [P.], seq 829:2338, ack 740, win 512, options [nop,nop,TS val 574771764 ecr 574771764], length 1509
E....z@.@..b.........|.F....L}.............
"BR4"BR4<!-- Code injected by live-server -->
<script>
17:11:07.327534 IP localhost.43846 > localhost.5500: Flags [.], ack 2338, win 502, options [nop,nop,TS val 574771764 ecr 574771764], length 0
E..4.]@.@.Td.........F.|L}...........(.....
"BR4"BR4

項目の解説

1つ目のパケットを例に、一部項目の解説を行います。

  • Flags [S]: パケットの内容を示すTCPフラグです。ここでは、SYN(S)フラグが立っています。その他、ACK(.)やPSH(P)などがあります。
  • seq 1283261177: シーケンス番号です。パケットの順序を把握するためなどに使われます。
  • win 65495: ウィンドウサイズです。一度に送信できるデータ量を示しています。
  • options [opts]: TCPのオプションです。ここでは、最大セグメントサイズ(mss)や、タイムスタンプ(TS)などが含まれています。

項目のより詳細な解説は以下のマニュアルを参照してください。

tcpdump(1) man page | TCPDUMP & LIBPCAP

これらのパケットが示すこと

最初の3つのパケットは3ウェイハンドシェイクを行っています。この部分でTCP接続を確立しています。

4番目と5番目のパケットはHTTPリクエストを送信するために使用されています。4番目のパケットにはHostやConnectionなどのHTTPヘッダーが含まれた、GETメソッドを使用したペイロードが含まれています。

残りのパケットはHTTPレスポンスを示しています。6番目のパケットにはAccess-Control-Allow-CredentialsなどのHTTPレスポンスヘッダーが含まれ、ステータスコード200が返されたことが示されています。8番目のパケットには残りのペイロードが含まれています。

まとめ

今回の記事ではtcpdumpを使用してパケットキャプチャを行いました。

ネットワークはまだまだ勉強中なので、キャプチャした内容を完璧に理解することが出来ませんでしたが、実際に3ウェイハンドシェイクを行っている部分を確認することができたのは大きな収穫です。

タイトルとURLをコピーしました