GNU/Linux >> Linux の 問題 >  >> Linux

Linuxコマンドラインでのtcpdumpの使用の概要

システム管理者としての私の経験では、ネットワーク接続の問題のトラブルシューティングが難しいことがよくあります。そのような状況では、tcpdumpは素晴らしい味方です。

Linuxターミナル

  • Linux用の上位7つのターミナルエミュレータ
  • Linuxでのデータ分析のための10個のコマンドラインツール
  • 今すぐダウンロード:SSHチートシート
  • 高度なLinuxコマンドのチートシート
  • Linuxコマンドラインチュートリアル

Tcpdumpは、システムを通過するネットワークトラフィックをキャプチャして分析できるコマンドラインユーティリティです。多くの場合、ネットワークの問題のトラブルシューティングやセキュリティツールに使用されます。

多くのオプションとフィルターを含む強力で用途の広いツールであるtcpdumpは、さまざまな場合に使用できます。これはコマンドラインツールであるため、GUIを使用できないリモートサーバーまたはデバイスで実行して、後で分析できるデータを収集するのが理想的です。バックグラウンドで起動することも、cronなどのツールを使用してスケジュールされたジョブとして起動することもできます。

この記事では、tcpdumpの最も一般的な機能のいくつかを見ていきます。

1。 Linuxへのインストール

TcpdumpはいくつかのLinuxディストリビューションに含まれているため、すでにインストールされている可能性があります。次のコマンドを使用して、tcpdumpがシステムにインストールされているかどうかを確認します。

$ which tcpdump
/usr/sbin/tcpdump

tcpdumpがインストールされていない場合は、ディストリビューションのパッケージマネージャーを使用してインストールできます。たとえば、CentOSまたはRed Hat Enterprise Linuxでは、次のようになります。

$ sudo dnf install -y tcpdump

Tcpdumpには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を使用します (カウント )オプション:

$ 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 ネットワーク層プロトコルを表します。この場合、IPv4IPv6の場合 パケットの場合、値はIP6です。 。

次のフィールド、192.168.64.28.22 、は送信元IPアドレスとポートです。この後に、192.168.64.1.41916で表される宛先IPアドレスとポートが続きます。 。

ソースと宛先の後に、TCPフラグFlags [P.]があります。 。このフィールドの一般的な値は次のとおりです。

フラグタイプ 説明
S SYN 接続開始
F FIN 接続終了
P プッシュ データプッシュ
R RST 接続のリセット
ACK 謝辞

このフィールドは、[S.]など、これらの値の組み合わせにすることもできます。 SYN-ACKの場合 パケット。

次は、パケットに含まれるデータのシーケンス番号です。キャプチャされた最初のパケットの場合、これは絶対数です。後続のパケットは、追跡を容易にするために相対番号を使用します。この例では、シーケンスはseq 196:568,です。 これは、このパケットにこのフローの196〜568バイトが含まれていることを意味します。

この後にAck番号が続きます:ack 1 。この場合、データを送信する側であるため、1になります。データを受信する側の場合、このフィールドは、このフローで次に予想されるバイト(データ)を表します。たとえば、このフローの次のパケットのAck番号は568になります。

次のフィールドはウィンドウサイズですwin 309 、受信バッファで使用可能なバイト数を表し、その後にMSS(最大セグメントサイズ)やウィンドウスケールなどのTCPオプションが続きます。 TCPプロトコルオプションの詳細については、伝送制御プロトコル(TCP)パラメータを参照してください。

最後に、パケット長length 372があります。 、ペイロードデータの長さをバイト単位で表します。長さは、シーケンス番号の最後のバイトと最初のバイトの差です。

それでは、パケットをフィルタリングして結果を絞り込み、特定の問題のトラブルシューティングを容易にする方法を学びましょう。

4。パケットのフィルタリング

上記のように、tcpdumpは非常に多くのパケットをキャプチャする可能性があり、その一部はトラブルシューティングしている問題とは関係がありません。たとえば、SSHトラフィックに関心のないWebサーバーとの接続の問題をトラブルシューティングしている場合、出力から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 ms

tcpdumpキャプチャに戻ると、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 kernel

tcpdumpは、送信元IPアドレスが192.168.122.98のパケットをキャプチャしたことに注意してください。 名前解決(ポート53)やHTTP(ポート80)などの複数のサービス用。送信元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つの追加フラグを提供します:-X コンテンツを16進数で印刷し、ASCIIまたは-A コンテンツをASCIIで印刷します。

たとえば、次のような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..<..@[email protected].'[email protected]............
............................
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..@[email protected].'....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.....@[email protected].'....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/%3C/span%3Ehttps%3A%3Cspan%20class%3D"sy0">//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..@[email protected].'....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..@[email protected].'....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..@[email protected].'....P....o..............
.....R..................
10 packets captured
10 packets received by filter
0 packets dropped by kernel

これは、呼び出しがプレーンHTTPを使用していると仮定して、API呼び出しの問題をトラブルシューティングするのに役立ちます。暗号化された接続の場合、この出力はあまり役に立ちません。

6。キャプチャをファイルに保存する

tcpdumpが提供するもう1つの便利な機能は、キャプチャをファイルに保存して、後で結果を分析できるようにする機能です。これにより、たとえば、夜間にバッチモードでパケットをキャプチャし、朝に結果を確認できます。また、リアルタイムキャプチャが速すぎる可能性があるため、分析するパケットが多すぎる場合にも役立ちます。

パケットを画面に表示する代わりにファイルに保存するには、オプション-wを使用します (書き込みの場合 ):

$ 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を指定して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のこれらの基本機能は、この強力で用途の広いツールを使い始めるのに役立ちます。詳細については、tcpdumpのWebサイトとマニュアルページを参照してください。

tcpdumpコマンドラインインターフェイスは、ネットワークトラフィックをキャプチャおよび分析するための優れた柔軟性を提供します。 If you need a graphical tool to understand more complex flows, look at Wireshark.

One benefit of Wireshark is that it can read .pcap files captured by tcpdump. You can use tcpdump to capture packets in a remote machine that does not have a GUI and analyze the result file with Wireshark, but that is a topic for another day.


This article was originally published in October 2018 and has been updated by Seth Kenlon.


Linux
  1. コマンドラインを使用してLinuxでtar.gzファイルを抽出する方法

  2. コマンドラインを使用してLinuxでユーザーを削除する方法

  3. コマンドラインを使用してLinuxを再起動する方法

  1. Linuxコマンドラインに関する8つのヒント

  2. Linuxのchownコマンドの概要

  3. Linux でコマンドラインを使用して任意のファイルをダウンロードするための 4 つのツール

  1. Linuxコマンドラインで力を使用する

  2. Linuxコマンドラインで牛を飼う

  3. Linuxコマンドラインにアクセスしてください