1. 概要

常に、ネットワークの問題を特定して解決することは、ネットワーク管理者にとって日常的な作業です。 これらの問題を解決するためのコマンドラインユーティリティがいくつかありますが、その目的に最も適したtcpdumpがあります。

このチュートリアルでは、論理および物理インターフェイスを介してネットワークパケットをキャプチャすることにより、tcpdumpの使用法を拡張します。

2. ローカルホストとループバックインターフェイスとは何ですか?

理解を深めるために、ローカルホストの概念をコンピューターシステムの仮想ホスト名およびドメイン名として視覚化してみましょう。 localhost を呼び出すときは常に、それは常に自分のコンピューターシステムを指します。 一言で言えば、コンピュータはそれ自体と通信します。 したがって、ハードウェアカードに障害が発生した場合でも、マシンのネットワークサービスを確認するのに大いに役立ちます。

通常、ローカルホストは、すべてのオペレーティングシステムに常に存在するネットワークループバックインターフェイスを介してマシンにアクセスします。 デフォルトでは、ループバックインターフェイスは127.0.0.1のIPアドレスを取得します。 その後、ローカルホストも名前解決のために同じIPに解決されます。

$ cat /etc/hosts
127.0.0.1       localhost
127.0.1.1       sandbox1
::1     ip6-localhost ip6-loopback

通常、この論理インターフェイスを介して送信されたパケットは、マシンの物理インターフェイスを使用せずに同じインターフェイスに返されます(ループバックされます)。 したがって、インターフェイスはその名前をループバックとして取得します。

IETFは、ネットワークループバックの目的で127.0.0.0/8全体を割り当てます。 サーバーをインストールするたびに、システムはループバックインターフェイスを取得します。

ループバックインターフェイス構成の以下のスニペットを見てみましょう。

$ ip a s lo 
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
    inet 127.0.0.1/8 scope host lo 
       valid_lft forever preferred_lft forever 
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever

3. tcpdump

tcpdump は、Linuxシステムのネットワークインターフェイストラフィックを分析するための強力なコマンドラインツールです。 Linuxシステムでrootまたはsudoを使用してこのツールを実行するには、特権アクセスが必要です。 ホスト名、IP、プロトコル、ネットワーク名などを使用して、ネットワークパケットを簡単に検索およびフィルタリングできます。

それでは、tcpdumpの使用法を見てみましょう。 ここで、出力はSSHセッションに関連しています。

$ sudo tcpdump
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
04:47:21.629831 IP 27.57.7.242.32917 > sandbox1.ssh: Flags [P.], seq 639116254:639116462, ack 1982486691, win 501, length 208
04:47:21.757924 ARP, Request who-has 10.87.34.12 tell _gateway, length 46
06:47:21.880039 IP sandbox1 > 104.26.11.14: ICMP echo request, id 20418, seq 1, length 64
06:47:21.914808 IP 104.26.11.14 > sandbox1: ICMP echo reply, id 20418, seq 1, length 64

それでは、出力の最初の行を見てみましょう。

  • 04:47:21.629831 –マイクロ秒単位のIPパケットのタイムスタンプ
  • IP – IP {インターネットプロトコル}、ARP {アドレス解決プロトコル}、ICMP{インターネット制御メッセージプロトコル}などのプロトコルタイプ
  • 27.57.7.242.32917 –送信元IPアドレスとポート。 通常、送信元ポートは、登録されている不明なポート範囲からランダムに取得されます
  • sandbox1.ssh –宛先IPアドレスとポート。 {既知のポート番号22はsshとして変換されます}
  • Flags[P。]–任意のTCPフラグ{P – PUSH}; ピリオドはACKを示します
  • seq 639116254:639116462 –開始シーケンス番号と終了シーケンス番号を含むシーケンス範囲。 違いは、フィールド長であるバイト単位で運ばれる量です
  • ack 1982486691 –TCPパケットの確認応答番号
  • win 501 –ソースマシンのTCPウィンドウサイズ
  • 長さ208–TCPデータの長さまたはペイロードサイズ。 ここでは、639116462 – 639116254 = 208

4. tcpdumpを使用したインターフェイスの監視

tcpdump には、ネットワークインターフェイストラフィックを解析、検索、およびフィルタリングするための多くのオプションがあります。 特定のインターフェイスからのパケットを監視する場合は、オプション-iを使用できます。

デモンストレーションのために、2つのPuTTYセッションを開きましょう。 最初のセッションでは、ループバックインターフェイスでパケットキャプチャを開始してから、ローカルホストへの単純なpingを実行します。

$ ping -c 1 localhost
..
..

$ sudo tcpdump -i lo
06:24:36.453843 IP localhost > localhost: ICMP echo request, id 19865, seq 1, length 64
06:24:36.453854 IP localhost > localhost: ICMP echo reply, id 19865, seq 1, length 64

同様の行で、ループバックインターフェイスからSSHパケットを生成してキャプチャしてみましょう。

$ ssh localhost
tools@localhost's password:

$ sudo tcpdump -i lo 
06:30:52.419160 IP localhost.43398 > localhost.ssh:
  Flags [S], seq 4234592172, win 65495, options [mss 65495,sackOK,TS val 796452486 ecr 0,nop,wscale 7], length 0

tcpdump には、他にもいくつかの便利なオプションがあります。

低レベルの情報を取得するには、冗長を有効にする必要があります。

tcpdump -vv -i ens160

pcap ファイルを読み取るには、-rオプションを使用できます。

tcpdump -r prod_inf_mtr.pcap

ホスト名/ソースIPを使用してフィルタリングし、任意のインターフェイスから10個のパケットのみをキャプチャする場合:

tcpdump host baeldung.com -i any -c10
tcpdump host 104.26.12.74 -i any -c10

次に、ホストとポートの情報を使用してフィルタリングできます。

tcpdump -i any "host baeldung.com and (port 22 or port 443)"

さらに、これを使用して、送信元および宛先ネットワーク情報を使用してフィルタリングできます。

tcpdump -i any -n "src net 192.168.0.0/16 and not dst net 10.0.0.0/8" -c4

そして最後に、以下に示すようにIPv6情報を解読することもできます。

tcpdump -i any ip6 host google.com -c4

5. 結論

この記事では、ローカルホストがシステムのデフォルト名である理由と、ローカルホストがループバックネットワークインターフェイスを介してアプリケーションをテストするのにどのように役立つかを説明しました。 さらに、高度なパケット分析のためにtcpdumpで利用できるさまざまなユーザーフレンドリーなオプションも確認しました。