システム管理者である私が、これまでの経験の中で頻繁に感じることは、ネットワーク接続の問題のトラブルシューティングはとても面倒であることです。そのような状況において大きな味方となってくれるのが、tcpdump です。
tcpdump は、システムを通過するネットワークトラフィックをキャプチャして分析できるコマンドライン・ユーティリティです。これは、セキュリティツールであるだけでなく、ネットワークの問題のトラブルシューティングにもよく使用されます。
tcpdump は多くのオプションとフィルターを備えた強力かつ多用途のツールであり、さまざまな場合に使用できます。これはコマンドラインツールであるため、GUI が使用できないリモートのサーバーまたはデバイスで実行するのに最適で、データを収集して後で分析できます。バックグラウンドで起動したり、cron などのツールを使用してスケジュールされたジョブとして起動したりすることもできます。
このブログ記事では、tcpdump の最も一般的な機能を見ていきます。
1.Linux にインストールする
tcpdump はいくつかの Linux ディストリビューションに含まれているため、すでにインストールされている可能性があります。次のコマンドを実行することで、tcpdump がシステムにインストールされているかどうかを確認できます。
$ which tcpdump
/usr/sbin/tcpdumptcpdump がインストールされていない場合は、次のように dnf パッケージマネージャーを使用してインストールできます。
$ sudo dnf install tcpdumptcpdump には、ネットワーク・パケット・キャプチャ用のライブラリ libpcap が必要です。インストールされていない場合は、依存関係として自動的に追加されます。
これでパケットのキャプチャを開始する準備ができました。
2.tcpdump でパケットをキャプチャする
トラブルシューティングや分析のためにパケットをキャプチャするには、tcpdump に昇格されたアクセス許可が必要です。そのため、次の例ではほとんどのコマンドの前に sudo が付いています。
まず、コマンド tcpdump --list-interfaces (または略して -D) を使用して、キャプチャに使用できるインタフェースを確認します。
$ sudo tcpdump -D
1.eth0
2.virbr0
3.eth1
4.any (Pseudo-device that captures on all interfaces)
5.lo [Loopback]上の例では、私のマシンで利用可能なすべてのインタフェースが表示されています。特別なインタフェース any では、任意のアクティブなインタフェースでのキャプチャが可能になります。
これを使用してパケットのキャプチャを開始しましょう。次のコマンドを実行して、任意のインタフェースのすべてのパケットをキャプチャします。
$ sudo tcpdump --interface any
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
09:56:18.293641 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 3770820720:3770820916, ack 3503648727, win 309, options [nop,nop,TS val 76577898 ecr 510770929], length 196
09:56:18.293794 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 196, win 391, options [nop,nop,TS val 510771017 ecr 76577898], length 0
09:56:18.295058 IP rhel75.59883 > gateway.domain: 2486+ PTR? 1.64.168.192.in-addr.arpa. (43)
09:56:18.310225 IP gateway.domain > rhel75.59883: 2486 NXDomain* 0/1/0 (102)
09:56:18.312482 IP rhel75.49685 > gateway.domain: 34242+ PTR? 28.64.168.192.in-addr.arpa. (44)
09:56:18.322425 IP gateway.domain > rhel75.49685: 34242 NXDomain* 0/1/0 (103)
09:56:18.323164 IP rhel75.56631 > gateway.domain: 29904+ PTR? 1.122.168.192.in-addr.arpa. (44)
09:56:18.323342 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 196:584, ack 1, win 309, options [nop,nop,TS val 76577928 ecr 510771017], length 388
09:56:18.323563 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 584, win 411, options [nop,nop,TS val 510771047 ecr 76577928], length 0
09:56:18.335569 IP gateway.domain > rhel75.56631: 29904 NXDomain* 0/1/0 (103)
09:56:18.336429 IP rhel75.44007 > gateway.domain: 61677+ PTR? 98.122.168.192.in-addr.arpa. (45)
09:56:18.336655 IP gateway.domain > rhel75.44007: 61677* 1/0/0 PTR rhel75. (65)
09:56:18.337177 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 584:1644, ack 1, win 309, options [nop,nop,TS val 76577942 ecr 510771047], length 1060
---- SKIPPING LONG OUTPUT -----
09:56:19.342939 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 1752016, win 1444, options [nop,nop,TS val 510772067 ecr 76578948], length 0
^C
9003 packets captured
9010 packets received by filter
7 packets dropped by kernel
$tcpdump は、割り込み信号を受信するまでパケットのキャプチャを継続します。Ctrl+C を押すことでキャプチャを中断できます。この例では、tcpdump は 9,000 を超えるパケットをキャプチャしました。ここでは ssh を使用してサーバーに接続しているため、tcpdump はこれらすべてのパケットをキャプチャしました。キャプチャされるパケットの数を制限して tcpdump を停止するには、-c (count) オプションを使用します。
$ sudo tcpdump -i any -c 5
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
11:21:30.242740 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 3772575680:3772575876, ack 3503651743, win 309, options [nop,nop,TS val 81689848 ecr 515883153], length 196
11:21:30.242906 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 196, win 1443, options [nop,nop,TS val 515883235 ecr 81689848], length 0
11:21:30.244442 IP rhel75.43634 > gateway.domain: 57680+ PTR? 1.64.168.192.in-addr.arpa. (43)
11:21:30.244829 IP gateway.domain > rhel75.43634: 57680 NXDomain 0/0/0 (43)
11:21:30.247048 IP rhel75.33696 > gateway.domain: 37429+ PTR? 28.64.168.192.in-addr.arpa. (44)
5 packets captured
12 packets received by filter
0 packets dropped by kernel
$この場合、tcpdump は 5 つのパケットをキャプチャした後、自動的に停止しました。これはさまざまなシナリオで役立ちます。たとえば、接続のトラブルシューティングを行っていて、最初のパケットをいくつかキャプチャするだけで十分な場合などです。これがさらに便利なのは、フィルターを適用して特定のパケットをキャプチャする場合です (以下を参照)。
デフォルトでは、前の例で示したように、tcpdump は IP アドレスとポートを名前に解決します。ネットワークの問題をトラブルシューティングする場合、一般には IP アドレスとポート番号を使用するほうが簡単です。オプション -n を使用して名前解決を無効にし、-nn を使用してポート解決を無効にします。
$ sudo tcpdump -i any -c5 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
23:56:24.292206 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 166198580:166198776, ack 2414541257, win 309, options [nop,nop,TS val 615664 ecr 540031155], length 196
23:56:24.292357 IP 192.168.64.1.35110 > 192.168.64.28.22: Flags [.], ack 196, win 1377, options [nop,nop,TS val 540031229 ecr 615664], length 0
23:56:24.292570 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 615664 ecr 540031229], length 372
23:56:24.292655 IP 192.168.64.1.35110 > 192.168.64.28.22: Flags [.], ack 568, win 1400, options [nop,nop,TS val 540031229 ecr 615664], length 0
23:56:24.292752 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 568:908, ack 1, win 309, options [nop,nop,TS val 615664 ecr 540031229], length 340
5 packets captured
6 packets received by filter
0 packets dropped by kernel上に示すように、キャプチャ出力には IP アドレスとポート番号が表示されます。これにより、tcpdump による DNS ルックアップの発行も防止され、ネットワークの問題のトラブルシューティング中におけるネットワークトラフィックの軽減に役立ちます。
これでネットワークパケットをキャプチャできるようになりました。次はこの出力の意味について見ていきましょう。
3.出力形式を理解する
tcpdump は、TCP、UDP、ICMP など、さまざまなプロトコルをキャプチャしてデコードできます。ここですべてを説明することはできませんが、まず TCP パケットを見てみましょう。さまざまなプロトコル形式の詳細については、tcpdump のマニュアルページを参照してください。tcpdump によってキャプチャされた典型的な TCP パケットは次のようになります。
08:41:13.729687 IP 192.168.64.28.22 >
192.168.64.1.41916: Flags [P.], seq 196:568,
ack 1, win 309, options [nop,nop,TS val
117964079 ecr 816509256], length 372フィールドは送信されるパケットのタイプによって異なる場合がありますが、これが一般的な形式です。
最初のフィールドの 08:41:13.729687 は、ローカルクロックに基づいた受信パケットのタイムスタンプを表します。
次の IP はネットワーク・レイヤー・プロトコルを表します。ここでは IPv4 です。IPv6 パケットの場合、値は IP6 となります。
次のフィールドの 192.168.64.28.22 は、送信元 IP アドレスとポートです。その後に宛先 IP アドレスとポート、192.168.64.1.41916 が続きます。
そして、送信元と宛先の後に TCP フラグ Flags [P.] が表示されています。このフィールドの一般的な値は次のとおりです。
値 | フラグタイプ | 説明 |
S | SYN | 接続開始 |
F | FIN | 接続完了 |
P | PUSH | データプッシュ |
R | RST | 接続リセット |
. | ACK | 確認 |
このフィールドは値を組み合わせたものにすることもでき、たとえば SYN-ACK パケットに [S.] と指定できます。
その次は、パケットに含まれるデータのシーケンス番号です。キャプチャされた最初のパケットの場合、これは絶対数です。後続のパケットでは、追跡しやすくするために相対番号が使用されます。この例では、シーケンスは seq 196:568 であり、このパケットにはこのフローのバイト 196 ~ 568 が含まれていることを意味します。
その次に ack 番号の ack 1 が続きます。ここでは、データを送信する側なので 1 になります。データを受信する側の場合、このフィールドは、このフロー上で次に想定されるバイト (データ) を表します。たとえば、このフローの次のパケットの ack 番号は 568 になります。
次のフィールドはウィンドウサイズ win 309 です。これは、受信バッファで利用可能なバイト数を表し、その後に最大セグメントサイズ (MSS) やウィンドウスケールなどの TCP オプションが続きます。TCP プロトコルオプションの詳細については、「Transmission Control Protocol (TCP) Parameters」を参照してください。
最後はパケット長 length 372 です。これは、ペイロードデータの長さ (バイト単位) を表します。この長さは、シーケンス番号の最後のバイトと最初のバイトの差です。
次は、パケットをフィルタリングして結果を絞り込み、特定の問題のトラブルシューティングを容易にする方法を学びましょう。
4.パケットをフィルタリングする
上で述べたように、tcpdump は大量のパケットをキャプチャしてしまう可能性があり、その中にはトラブルシューティングしている問題に関連していないパケットもあります。たとえば、Web サーバーとの接続の問題をトラブルシューティングしている場合、SSH トラフィックは関係がないため、出力から SSH パケットを削除すると実際の問題に取り組みやすくなります。
tcpdump の最も強力な機能の 1 つは、送信元および宛先の IP アドレス、ポート、プロトコルなどのさまざまなパラメーターを使用して、キャプチャされたパケットをフィルタリングする機能です。最も一般的なものをいくつか見てみましょう。
プロトコル
プロトコルに基づいてパケットをフィルタリングするには、コマンドラインでプロトコルを指定します。たとえば、次のコマンドを使用して ICMP パケットのみをキャプチャします。
$ sudo tcpdump -i any -c5 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes別のターミナルで、別のマシンに ping を実行してみます。
$ ping opensource.com
PING opensource.com (54.204.39.132) 56(84) bytes of data.
64 bytes from ec2-54-204-39-132.compute-1.amazonaws.com (54.204.39.132): icmp_seq=1 ttl=47 time=39.6 mstcpdump キャプチャに戻り、tcpdump は ICMP 関連のパケットのみをキャプチャして表示していることに注目してください。この場合、tcpdump は、名前 opensource.com を解決するときに生成された名前解決パケットを表示しません。
09:34:20.136766 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 1, length 64
09:34:20.176402 IP ec2-54-204-39-132.compute-1.amazonaws.com > rhel75: ICMP echo reply, id 20361, seq 1, length 64
09:34:21.140230 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 2, length 64
09:34:21.180020 IP ec2-54-204-39-132.compute-1.amazonaws.com > rhel75: ICMP echo reply, id 20361, seq 2, length 64
09:34:22.141777 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 3, length 64
5 packets captured
5 packets received by filter
0 packets dropped by kernelホスト
host フィルターを使用して、特定のホストに関連するパケットのみにキャプチャを制限します。
$ sudo tcpdump -i any -c5 -nn host 54.204.39.132
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
09:54:20.042023 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [S], seq 1375157070, win 29200, options [mss 1460,sackOK,TS val 122350391 ecr 0,nop,wscale 7], length 0
09:54:20.088127 IP 54.204.39.132.80 > 192.168.122.98.39326: Flags [S.], seq 1935542841, ack 1375157071, win 28960, options [mss 1460,sackOK,TS val 522713542 ecr 122350391,nop,wscale 9], length 0
09:54:20.088204 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 122350437 ecr 522713542], length 0
09:54:20.088734 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 122350438 ecr 522713542], length 112: HTTP: GET / HTTP/1.1
09:54:20.129733 IP 54.204.39.132.80 > 192.168.122.98.39326: Flags [.], ack 113, win 57, options [nop,nop,TS val 522713552 ecr 122350438], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernelこの例では、tcpdump はホスト 54.204.39.132 との間で送受信されるパケットのみをキャプチャして表示しています。
ポート
目的のサービスまたはポートに基づいてパケットをフィルタリングするには、port フィルターを使用します。たとえば、次のコマンドを使用して、Web (HTTP) サービスに関連するパケットをキャプチャします。
$ sudo tcpdump -i any -c5 -nn port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
09:58:28.790548 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [S], seq 1745665159, win 29200, options [mss 1460,sackOK,TS val 122599140 ecr 0,nop,wscale 7], length 0
09:58:28.834026 IP 54.204.39.132.80 > 192.168.122.98.39330: Flags [S.], seq 4063583040, ack 1745665160, win 28960, options [mss 1460,sackOK,TS val 522775728 ecr 122599140,nop,wscale 9], length 0
09:58:28.834093 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 122599183 ecr 522775728], length 0
09:58:28.834588 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 122599184 ecr 522775728], length 112: HTTP: GET / HTTP/1.1
09:58:28.878445 IP 54.204.39.132.80 > 192.168.122.98.39330: Flags [.], ack 113, win 57, options [nop,nop,TS val 522775739 ecr 122599184], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel送信元 IP/ホスト名
送信元または宛先の IP アドレスまたはホスト名に基づいてパケットをフィルタリングすることもできます。たとえば、次のコマンドでホスト 192.168.122.98 からのパケットをキャプチャします。
$ sudo tcpdump -i any -c5 -nn src 192.168.122.98
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:02:15.220824 IP 192.168.122.98.39436 > 192.168.122.1.53: 59332+ A? opensource.com. (32)
10:02:15.220862 IP 192.168.122.98.39436 > 192.168.122.1.53: 20749+ AAAA? opensource.com. (32)
10:02:15.364062 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [S], seq 1108640533, win 29200, options [mss 1460,sackOK,TS val 122825713 ecr 0,nop,wscale 7], length 0
10:02:15.409229 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [.], ack 669337581, win 229, options [nop,nop,TS val 122825758 ecr 522832372], length 0
10:02:15.409667 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [P.], seq 0:112, ack 1, win 229, options [nop,nop,TS val 122825759 ecr 522832372], length 112: HTTP: GET / HTTP/1.1
5 packets captured
5 packets received by filter
0 packets dropped by kerneltcpdumps は、名前解決 (ポート 53) や HTTP (ポート 80) などの複数のサービスについて、送信元 IP アドレス 192.168.122.98 のパケットをキャプチャしたことに注意してください。応答パケットは、送信元 IP が異なるため表示されません。
逆に、dst フィルターを使用して宛先 IP/ホスト名でフィルタリングすることもできます。
$ sudo tcpdump -i any -c5 -nn dst 192.168.122.98
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:05:03.572931 IP 192.168.122.1.53 > 192.168.122.98.47049: 2248 1/0/0 A 54.204.39.132 (48)
10:05:03.572944 IP 192.168.122.1.53 > 192.168.122.98.47049: 33770 0/0/0 (32)
10:05:03.621833 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [S.], seq 3474204576, ack 3256851264, win 28960, options [mss 1460,sackOK,TS val 522874425 ecr 122993922,nop,wscale 9], length 0
10:05:03.667767 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [.], ack 113, win 57, options [nop,nop,TS val 522874436 ecr 122993972], length 0
10:05:03.672221 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 522874437 ecr 122993972], length 642: HTTP: HTTP/1.1 302 Found
5 packets captured
5 packets received by filter
0 packets dropped by kernel複雑な表現
論理演算子 and と or を使用してフィルターを組み合わせ、より複雑な表現を作成することもできます。たとえば、送信元 IP アドレス 192.168.122.98 とサービス HTTP のみからのパケットをフィルタリングするには、次のコマンドを使用します。
$ sudo tcpdump -i any -c5 -nn src 192.168.122.98 and port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:08:00.472696 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [S], seq 2712685325, win 29200, options [mss 1460,sackOK,TS val 123170822 ecr 0,nop,wscale 7], length 0
10:08:00.516118 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [.], ack 268723504, win 229, options [nop,nop,TS val 123170865 ecr 522918648], length 0
10:08:00.516583 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [P.], seq 0:112, ack 1, win 229, options [nop,nop,TS val 123170866 ecr 522918648], length 112: HTTP: GET / HTTP/1.1
10:08:00.567044 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 123170916 ecr 522918661], length 0
10:08:00.788153 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [F.], seq 112, ack 643, win 239, options [nop,nop,TS val 123171137 ecr 522918661], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernelフィルターを括弧でグループ化すると、より複雑な表現を作成できます。この場合、シェルがフィルター表現とシェル表現を混同しないように、フィルター表現全体を引用符で囲みます。
$ sudo tcpdump -i any -c5 -nn "port 80 and (src 192.168.122.98 or src 54.204.39.132)"
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:10:37.602214 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [S], seq 871108679, win 29200, options [mss 1460,sackOK,TS val 123327951 ecr 0,nop,wscale 7], length 0
10:10:37.650651 IP 54.204.39.132.80 > 192.168.122.98.39346: Flags [S.], seq 854753193, ack 871108680, win 28960, options [mss 1460,sackOK,TS val 522957932 ecr 123327951,nop,wscale 9], length 0
10:10:37.650708 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 123328000 ecr 522957932], length 0
10:10:37.651097 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 123328000 ecr 522957932], length 112: HTTP: GET / HTTP/1.1
10:10:37.692900 IP 54.204.39.132.80 > 192.168.122.98.39346: Flags [.], ack 113, win 57, options [nop,nop,TS val 522957942 ecr 123328000], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernelこの例では、HTTP サービス (ポート 80) のみと送信元 IP アドレス 192.168.122.98 または 54.204.39.132 のパケットをフィルタリングしています。これは、同じフローの両側を調べる簡単な方法です。
5.パケットの内容をチェックする
前の例では、送信元、宛先、ポートなどの情報についてパケットのヘッダーのみをチェックしています。これだけでネットワーク接続の問題をトラブルシューティングできる場合もあります。ただし、場合によっては、パケットの内容を検査して、送信しているメッセージに必要なものが含まれていること、または想定される応答を受信したことを確認する必要があります。パケットの内容を確認するために、tcpdump には 2 つの追加フラグとして、16 進数で内容を出力する -X と、ASCII で内容を出力する ASCII または -A が用意されています。
たとえば、次のようにして Web リクエストの HTTP の内容を検査します。
$ sudo tcpdump -i any -c10 -nn -A port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
13:02:14.871803 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [S], seq 2546602048, win 29200, options [mss 1460,sackOK,TS val 133625221 ecr 0,nop,wscale 7], length 0
E..<..@.@.....zb6.'....P...@......r............
............................
13:02:14.910734 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [S.], seq 1877348646, ack 2546602049, win 28960, options [mss 1460,sackOK,TS val 525532247 ecr 133625221,nop,wscale 9], length 0
E..<..@./..a6.'...zb.P..o..&...A..q a..........
.R.W....... ................
13:02:14.910832 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 133625260 ecr 525532247], length 0
E..4..@.@.....zb6.'....P...Ao..'...........
.....R.W................
13:02:14.911808 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 133625261 ecr 525532247], length 112: HTTP: GET / HTTP/1.1
E.....@.@..1..zb6.'....P...Ao..'...........
.....R.WGET / HTTP/1.1
User-Agent: Wget/1.14 (linux-gnu)
Accept: */*
Host: opensource.com
Connection: Keep-Alive
................
13:02:14.951199 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [.], ack 113, win 57, options [nop,nop,TS val 525532257 ecr 133625261], length 0
E..4.F@./.."6.'...zb.P..o..'.......9.2.....
.R.a....................
13:02:14.955030 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 525532258 ecr 133625261], length 642: HTTP: HTTP/1.1 302 Found
E....G@./...6.'...zb.P..o..'.......9.......
.R.b....HTTP/1.1 302 Found
Server: nginx
Date: Sun, 23 Sep 2018 17:02:14 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 207
X-Content-Type-Options: nosniff
Location: https://opensource.com/
Cache-Control: max-age=1209600
Expires: Sun, 07 Oct 2018 17:02:14 GMT
X-Request-ID: v-6baa3acc-bf52-11e8-9195-22000ab8cf2d
X-Varnish: 632951979
Age: 0
Via: 1.1 varnish (Varnish/5.2)
X-Cache: MISS
Connection: keep-alive
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://opensource.com/">here</a>.</p>
</body></html>
................
13:02:14.955083 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 133625304 ecr 525532258], length 0
E..4..@.@.....zb6.'....P....o..............
.....R.b................
13:02:15.195524 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [F.], seq 113, ack 643, win 239, options [nop,nop,TS val 133625545 ecr 525532258], length 0
E..4..@.@.....zb6.'....P....o..............
.....R.b................
13:02:15.236592 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 525532329 ecr 133625545], length 0
E..4.H@./.. 6.'...zb.P..o..........9.I.....
.R......................
13:02:15.236656 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 644, win 239, options [nop,nop,TS val 133625586 ecr 525532329], length 0
E..4..@.@.....zb6.'....P....o..............
.....R..................
10 packets captured
10 packets received by filter
0 packets dropped by kernelこれは、呼び出しがプレーン HTTP を使用していることを前提とした場合、API 呼び出しに関する問題のトラブルシューティングに役立ちます。暗号化された接続の場合、この出力はあまり役に立ちません。
6.キャプチャをファイルに保存する
tcpdump が提供するもう 1 つの便利な機能は、キャプチャした内容をファイルに保存し、結果を後で分析できることです。これにより、たとえば夜間にバッチモードでパケットをキャプチャして、朝に結果を確認することができます。また、分析するパケットが多すぎる場合にも役立ちます。リアルタイムではキャプチャの実行が速すぎる可能性があるためです。
パケットを画面に表示するのではなくファイルに保存するには、オプション -w (write) を使用します。
$ sudo tcpdump -i any -c10 -nn -w webserver.pcap port 80
[sudo] password for ricardo:
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10 packets captured
10 packets received by filter
0 packets dropped by kernelこのコマンドは、出力を webserver.pcap という名前のファイルに保存します。拡張子の .pcap はパケットキャプチャを表しており、このファイル形式の命名規則となっています。
この例に示すように、画面には何も表示されず、オプション -c10 に従って、10 パケットをキャプチャした後にキャプチャが終了します。パケットがキャプチャされていることを確認するためにフィードバックが必要な場合は、オプション -v を使用します。
tcpdump はバイナリー形式でファイルを作成するため、テキストエディターでは開くことはできません。ファイルの内容を読み取るには、-r (read) オプションを指定して tcpdump を実行します。
$ tcpdump -nn -r webserver.pcap
reading from file webserver.pcap, link-type LINUX_SLL (Linux cooked)
13:36:57.679494 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [S], seq 3709732619, win 29200, options [mss 1460,sackOK,TS val 135708029 ecr 0,nop,wscale 7], length 0
13:36:57.718932 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [S.], seq 1999298316, ack 3709732620, win 28960, options [mss 1460,sackOK,TS val 526052949 ecr 135708029,nop,wscale 9], length 0
13:36:57.719005 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 135708068 ecr 526052949], length 0
13:36:57.719186 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 135708068 ecr 526052949], length 112: HTTP: GET / HTTP/1.1
13:36:57.756979 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [.], ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 0
13:36:57.760122 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 642: HTTP: HTTP/1.1 302 Found
13:36:57.760182 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 135708109 ecr 526052959], length 0
13:36:57.977602 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [F.], seq 113, ack 643, win 239, options [nop,nop,TS val 135708327 ecr 526052959], length 0
13:36:58.022089 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 526053025 ecr 135708327], length 0
13:36:58.022132 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 644, win 239, options [nop,nop,TS val 135708371 ecr 526053025], length 0
$ネットワーク・インタフェースから直接パケットをキャプチャしなくなるため、ファイルを読み取るために sudo は必要ありません。
リアルタイムデータの場合と同様、これまでに説明したフィルターのいずれかを使用して、ファイルの内容をフィルターすることもできます。たとえば、次のコマンドを実行して、送信元 IP アドレス 54.204.39.132 からのキャプチャファイル内のパケットを検査します。
$ tcpdump -nn -r webserver.pcap src 54.204.39.132
reading from file webserver.pcap, link-type LINUX_SLL (Linux cooked)
13:36:57.718932 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [S.], seq 1999298316, ack 3709732620, win 28960, options [mss 1460,sackOK,TS val 526052949 ecr 135708029,nop,wscale 9], length 0
13:36:57.756979 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [.], ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 0
13:36:57.760122 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 642: HTTP: HTTP/1.1 302 Found
13:36:58.022089 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 526053025 ecr 135708327], length 0
次のステップ
tcpdump コマンドライン・インタフェースは、ネットワークトラフィックのキャプチャと分析に優れた柔軟性を提供します。より複雑なフローを理解するためにグラフィカルツールが必要な場合は、Wireshark を検討してください。
Wireshark のメリットの 1 つは、tcpdump によってキャプチャされた .pcap ファイルを読み取れることです。tcpdump を使用すると、GUI を持たないリモートマシンでパケットをキャプチャし、結果ファイルを Wireshark で分析できます。これについてはまた別の機会に説明します。
tcpdump のこれらの基本機能は、この強力で多用途のツールを使い始めるのに役立ちます。詳細については、tcpdump の Web サイトおよび man ページを参照してください。
執筆者紹介
Ricardo Gerardi is a Principal Consultant at Red Hat, having transitioned from his previous role as a Technical Community Advocate for Enable Sysadmin. He's been at Red Hat since 2018, specializing in IT automation using Ansible and OpenShift.
With over 25 years of industry experience and 20+ years as a Linux and open source enthusiast and contributor, Ricardo is passionate about technology. He is particularly interested in hacking with the Go programming language and is the author of Powerful Command-Line Applications in Go and Automate Your Home Using Go. Ricardo also writes regularly for Red Hat and other blogs, covering topics like Linux, Vim, Ansible, Containers, Kubernetes, and command-line applications.
Outside of work, Ricardo enjoys spending time with his daughters, reading science fiction books, and playing video games.
類似検索
vi エディター入門
自動化を超えて:AI 駆動型のセキュリティ脆弱性の急増に対して、人間による技術的な支援が必要な理由
Infrastructure At The Edge | Compiler
Operating System Management | Compiler
チャンネル別に見る
自動化
テクノロジー、チームおよび環境に関する IT 自動化の最新情報
AI (人工知能)
お客様が AI ワークロードをどこでも自由に実行することを可能にするプラットフォームについてのアップデート
オープン・ハイブリッドクラウド
ハイブリッドクラウドで柔軟に未来を築く方法をご確認ください。
セキュリティ
環境やテクノロジー全体に及ぶリスクを軽減する方法に関する最新情報
エッジコンピューティング
エッジでの運用を単純化するプラットフォームのアップデート
インフラストラクチャ
世界有数のエンタープライズ向け Linux プラットフォームの最新情報
アプリケーション
アプリケーションの最も困難な課題に対する Red Hat ソリューションの詳細
仮想化
オンプレミスまたは複数クラウドでのワークロードに対応するエンタープライズ仮想化の将来についてご覧ください