When a network application does not run as expected, it is important to be able to look under the hood. Even when everything seems to run smoothly, running a network diagnosis can help ensure everything is working as it should. Several diagnosis tools exists for this purpose; each one operates on a different level. It would go beyond the scope of this book to discuss all tools, so we will focus on the more well-known and commonly used tools in the following sections.
最初に netstat
コマンド (net-tools パッケージに含まれます) を紹介しましょう。netstat
コマンドはマシンのその瞬間のネットワーク活動に関する要約を表示します。何も引数を渡さずに実行した場合、netstat
コマンドは開かれた接続をリストします。このリストはとても長くなる場合があります。なぜなら、このリストには多くの Unix ドメインソケットが含まれるからです (Unix ドメインソケットはデーモンによって広く使われています)。Unix ドメインソケットはネットワークに関与するものではありません (dbus
通信、X11
トラフィック、仮想ファイルシステムとデスクトップ間の通信などに関与するものです)。
一般的に netstat
を実行する際には標準の挙動を変更するオプションを使います。最も頻繁に使われるオプションを以下に挙げます。
-t
。TCP 接続だけが表示されます。
-u
。UDP 接続だけが表示されます。-t
と -u
オプションは同時に使えます。Unix ドメインソケットの表示を抑制するにはどちらか一方を使うだけで十分です。
-a
。リッスンしている (接続を待ち受けている) ソケットも表示されます。
-n
。結果が数値的に表示されます。すなわち、IP アドレス (DNS で名前解決しません)、ポート番号 (/etc/services
の定義する別名を使いません)、ユーザ id (ログイン名を使いません) を使って表示されます。
-p
。関連付けられたプロセスが表示されます。netstat
を root 権限で実行した場合にのみ、このオプションは役に立ちます。なぜなら、普通のユーザは自分のプロセス以外を見ることができないからです。
-c
。継続的に接続リストを更新します。
netstat(8) マニュアルページに書かれている他のオプションを使えば、表示される結果をさらに細かく制御することが可能です。実質的には上に挙げたオプションのうち最初の 5 種類を組み合わせて使うことが多いため、結果としてシステムとネットワークの管理者は netstat -tupan
を身に付けることが多いです。負荷の高くないマシンでは、以下のような典型的な結果を返します。
#
netstat -tupan
稼働中のインターネット接続 (サーバと確立)
Proto 受信-Q 送信-Q 内部アドレス 外部アドレス 状態 PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 397/rpcbind
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 431/sshd
tcp 0 0 0.0.0.0:36568 0.0.0.0:* LISTEN 407/rpc.statd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 762/exim4
tcp 0 272 192.168.1.242:22 192.168.1.129:44452 ESTABLISHED 1172/sshd: roland [
tcp6 0 0 :::111 :::* LISTEN 397/rpcbind
tcp6 0 0 :::22 :::* LISTEN 431/sshd
tcp6 0 0 ::1:25 :::* LISTEN 762/exim4
tcp6 0 0 :::35210 :::* LISTEN 407/rpc.statd
udp 0 0 0.0.0.0:39376 0.0.0.0:* 916/dhclient
udp 0 0 0.0.0.0:996 0.0.0.0:* 397/rpcbind
udp 0 0 127.0.0.1:1007 0.0.0.0:* 407/rpc.statd
udp 0 0 0.0.0.0:68 0.0.0.0:* 916/dhclient
udp 0 0 0.0.0.0:48720 0.0.0.0:* 451/avahi-daemon: r
udp 0 0 0.0.0.0:111 0.0.0.0:* 397/rpcbind
udp 0 0 192.168.1.242:123 0.0.0.0:* 539/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 539/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 539/ntpd
udp 0 0 0.0.0.0:5353 0.0.0.0:* 451/avahi-daemon: r
udp 0 0 0.0.0.0:39172 0.0.0.0:* 407/rpc.statd
udp6 0 0 :::996 :::* 397/rpcbind
udp6 0 0 :::34277 :::* 407/rpc.statd
udp6 0 0 :::54852 :::* 916/dhclient
udp6 0 0 :::111 :::* 397/rpcbind
udp6 0 0 :::38007 :::* 451/avahi-daemon: r
udp6 0 0 fe80::5054:ff:fe99::123 :::* 539/ntpd
udp6 0 0 2001:bc8:3a7e:210:a:123 :::* 539/ntpd
udp6 0 0 2001:bc8:3a7e:210:5:123 :::* 539/ntpd
udp6 0 0 ::1:123 :::* 539/ntpd
udp6 0 0 :::123 :::* 539/ntpd
udp6 0 0 :::5353 :::* 451/avahi-daemon: r
予想通り、確立された接続 (2 つの SSH 接続) と接続を待ち受けているアプリケーション (LISTEN
と記載されます。特に 25 番をリッスンしている Exim4 電子メールサーバ) が表示されます。
nmap
(同名のパッケージに含まれます) はある意味でリモートに対する netstat
に相当します。nmap
は 1 台または数台のリモートサーバに対して「well-known」ポート群をスキャンし、入ってきた接続に応答したアプリケーションの見つかったポートをリストします。さらに、nmap
は一部のアプリケーションを識別することが可能です。場合によってはアプリケーションのバージョン番号さえも識別することが可能です。nmap
は netstat
と対照的にリモートから実行されるため、プロセスやユーザの情報を提供できません。しかしながら、nmap
は複数のリモートサーバに対して一気に実行できます。
nmap
を実行する際の典型例は -A
オプション (nmap
は見つかったサーバソフトウェアのバージョンを識別しようとします) だけを使い、その後ろにスキャンする 1 つか複数の IP アドレスまたは DNS 名を渡すことです。繰り返しになりますが、他にも多くのオプションが存在し、nmap
の挙動をさらに細かく制御することが可能です。nmap(1) マニュアルページを参照してください。
#
nmap debian
Starting Nmap 7.80 ( https://nmap.org ) at 2022-02-22 20:58 CET
Nmap scan report for debian (192.168.122.57)
Host is up (0.000087s latency).
Not shown: 996 closed ports
PORT STATE SERVICE
22/tcp open ssh
79/tcp open finger
80/tcp open http
113/tcp open ident
Nmap done: 1 IP address (1 host up) scanned in 0.07 seconds
#
nmap -A localhost
nmap -A localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2022-02-22 20:56 CET
Stats: 0:01:16 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 83.33% done; ETC: 20:57 (0:00:15 remaining)
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000086s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 994 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5 (protocol 2.0)
|_auth-owners: foobar
25/tcp open smtp Postfix smtpd
|_auth-owners: foobar
|_smtp-commands: debian, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8, CHUNKING,
| ssl-cert: Subject: commonName=debian
| Subject Alternative Name: DNS:debian
| Not valid before: 2022-02-22T14:48:42
|_Not valid after: 2032-02-20T14:48:42
|_ssl-date: TLS randomness does not represent time
79/tcp open finger?
|_auth-owners: foobar
|_finger: ERROR: Script execution failed (use -d to debug)
80/tcp open http Apache httpd 2.4.52 ((Debian))
|_auth-owners: foobar
|_http-server-header: Apache/2.4.52 (Debian)
|_http-title: Apache2 Debian Default Page: It works
113/tcp open ident Liedentd (Claimed user: foobar)
|_auth-owners: foobar
631/tcp open ipp CUPS 2.3
|_auth-owners: foobar
| http-robots.txt: 1 disallowed entry
|_/
|_http-server-header: CUPS/2.3 IPP/2.1
|_http-title: Home - CUPS 2.3.3op2
Service Info: Host: debian; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 87.91 seconds
As expected, e.g. the SSH, Apache and Postfix applications are listed. Note that not all applications listen on all IP addresses; since Postfix is only accessible on the lo
loopback interface, it only appears during an analysis of localhost
and not when scanning debian
(which maps to the enp1s0
interface on the same machine).
10.9.3. スニファ、tcpdump
と wireshark
しばしば実際にワイヤを行き来する情報をパケットごとに見る必要がある場合があります。この際に使われるツールは「フレームアナライザ」と呼ばれ、スニファとしても広く知られています。この種のツールは指定したネットワークに到達したすべてのパケットを観察し、ユーザにわかりやすい方法でパケットを表示します。
ネットワークトラフィック解析分野における由緒あるツールが tcpdump
です。tcpdump
は広範囲のプラットフォームで利用できる標準的なツールです。tcpdump
を使うと多くの種類のネットワークトラフィックをキャプチャできますが、tcpdump
のトラフィックの表現は決してわかりやすいものではありません。このため tcpdump
に関しては詳しく説明しません。
より最近の (そしてより現代的な) ツールである wireshark
(wireshark パッケージに含まれます) はキャプチャされたパケットの解析を単純化する多くのデコーディングモジュールのおかげでネットワークトラフィック解析分野における新しい標準的なツールになりつつあります。パケットはプロトコル層に基づいてグラフィカルに表示されます。wireshark
を使うと、ユーザはあるパケットに関わるすべてのプロトコルを可視化することが可能です。たとえば、HTTP リクエストを含むパケットに対して、wireshark
は物理層、イーサネット層、IP パケット情報、TCP 接続パラメータ、最後に HTTP リクエスト自身に関連する情報を別々に表示します。
In our example, the packets traveling over SSH are filtered out (with the !tcp.port == 22
filter). The packet currently displayed was developed at the transport layer of the SSHv2 protocol.