はい、承知いたしました。Ubuntuでポートを確認する方法について、netstatコマンドとssコマンドの詳細な説明を含む、約5000語の記事を作成します。
Ubuntuでポートを確認する方法徹底解説:netstatとssコマンドの詳細
はじめに
ネットワーク通信において、「ポート」は非常に重要な概念です。サーバー上で特定のサービス(Webサーバー、SSHサーバーなど)が動作しているか確認したり、外部からの接続を受け付けているか確認したり、あるいはシステム内で予期しないプロセスが通信を行っていないか調べたりする際に、ポートの状態を確認することは不可欠です。
特にLinuxベースのOSであるUbuntuにおいては、コマンドラインから効率的にポートの状態を把握するための強力なツールがいくつか存在します。その中でも代表的なものが netstat
コマンドと ss
コマンドです。
かつては netstat
が広く利用されていましたが、近年ではより高速で多機能な ss
コマンドが推奨されています。しかし、両者にはそれぞれ特徴があり、用途に応じて使い分ける、あるいは両方の使い方を知っておくことが役立ちます。
この記事では、Ubuntuにおけるポート確認の基本から、netstat
および ss
コマンドの詳細な使い方、それぞれのオプションや出力の見方、そして実用的な応用例やトラブルシューティングまでを網羅的に解説します。これにより、Ubuntu環境でのネットワーク状態把握能力を飛躍的に向上させることができるでしょう。
ポートとは? ネットワーク通信の基本概念
ポートを確認する前に、まず「ポート」そのものがネットワーク通信においてどのような役割を果たしているのかを理解しておくことが重要です。
IPアドレスとポート番号
インターネット上の通信は、通常、IPアドレスによって特定のデバイス(コンピューターやサーバーなど)を識別します。しかし、一つのデバイス上で複数のアプリケーションやサービスが同時にネットワーク通信を行うことは一般的です。例えば、Webブラウザで複数のウェブサイトを同時に閲覧したり、メールクライアントでメールをチェックしたり、SSHでリモートサーバーに接続したりといった具合です。
IPアドレスだけでは、どのアプリケーションがその通信の相手なのかを区別できません。そこで登場するのが「ポート番号」です。ポート番号は、特定のデバイス内で動作しているアプリケーションやサービスを識別するために使用されます。
例えるなら、IPアドレスが「建物の住所」だとすると、ポート番号は「その建物の中の部屋番号」のようなものです。データは特定のIPアドレス宛てに送信されますが、さらに特定のポート番号を指定することで、「このIPアドレスを持つデバイスの、このポート番号で待ち受けているアプリケーションにデータを届けなさい」という指示が可能になります。
TCPとUDP
ネットワーク通信で最も一般的に使用されるプロトコルに、TCP (Transmission Control Protocol) と UDP (User Datagram Protocol) があります。ポート番号は、これらのプロトコルと組み合わせて使用されます。
- TCP (Transmission Control Protocol): 信頼性の高いコネクション指向のプロトコルです。データを送信する前に、送信元と宛先の間で「コネクション(接続)」を確立します。データの到達確認や再送制御が行われるため、データが失われたり順序が入れ替わったりする心配が少なく、信頼性が求められる通信(Web閲覧、メール、ファイル転送など)に適しています。TCPポートとして識別されます。
- UDP (User Datagram Protocol): コネクションレスのプロトコルです。コネクション確立のオーバーヘッドがなく、データの到達確認や順序保証も行いません。そのため、TCPよりも高速ですが信頼性は低いです。リアルタイム性が求められる通信(音声通話、ビデオ会議、オンラインゲーム、DNSなど)に適しています。UDPポートとして識別されます。
ポート番号は、TCPとUDPで独立しています。つまり、TCPのポート80とUDPのポート80は、技術的には異なるポートとして扱われます。
ポート番号の範囲と種類
ポート番号は0から65535までの整数値です。この範囲は、用途によって大きく以下の3つのカテゴリに分けられます。
- ウェルノウンポート (Well-Known Ports): 0番から1023番までのポートです。特定の一般的なサービスに対してIANA (Internet Assigned Numbers Authority) によって割り当てられています。例えば、HTTP (Web) はTCP 80番、HTTPS (セキュアなWeb) はTCP 443番、SSH (リモートログイン) はTCP 22番、FTP (ファイル転送) はTCP 21番、DNS (ドメイン名解決) はUDP 53番などがよく知られています。これらのポートは、通常、システムプロセスやroot権限を持つプログラムによって使用されます。
- 登録済みポート (Registered Ports): 1024番から49151番までのポートです。特定の企業や組織が、独自のアプリケーションやサービスのためにIANAに登録することができます。ただし、ウェルノウンポートのようにグローバルな標準として広く認識されているわけではありません。
- ダイナミック/プライベートポート (Dynamic/Private Ports): 49152番から65535番までのポートです。一時的なポートとして、クライアントアプリケーションがサーバーと通信する際に動的に割り当てられます。これらのポートは特定のサービスに関連付けられておらず、通信が終了すれば解放され、他の通信に再利用されます。
サーバー側でサービスを提供するアプリケーションは、特定のウェルノウンポートや登録済みポートでクライアントからの接続を「待ち受け(リッスン)」します。クライアント側は、サーバーのIPアドレスと待ち受けポート番号を指定して接続を開始します。クライアント側で使用されるポートは、通常、ダイナミックポートの中から空いているものが選ばれます。
ポート確認の目的
なぜポートの状態を確認する必要があるのでしょうか? 主な目的は以下の通りです。
- サービスの稼働確認: 特定のサービス(Webサーバー、データベースサーバーなど)が正しく起動し、設定されたポートで外部からの接続を待ち受けているかを確認します。例えば、ウェブサイトが表示されない場合、Webサーバー(ApacheやNginxなど)が80番ポートや443番ポートでリッスンしているかを確認します。
- トラブルシューティング: ネットワーク接続の問題が発生した際に、原因を特定する手助けとなります。
- クライアントからサーバーへの接続が拒否される場合、サーバー側のポートが閉じている、あるいはそもそもサービスが起動していない可能性があります。
- 別のアプリケーションが目的のポートを既に占有しているため、サービスが起動できない場合があります。
- 大量の接続が特定の状態(例えばTIME_WAIT)で滞留しており、システムリソースを圧迫している場合があります。
- セキュリティチェック: システム上で意図しないポートが開いていないかを確認します。悪意のあるソフトウェアがバックドアとしてポートを開いたり、不必要なサービスが外部に公開されていたりする可能性があります。定期的にポートの状態をチェックすることは、セキュリティ対策の一環となります。
- パフォーマンス分析: 確立された接続の数や状態(例: TIME_WAIT状態の数)を確認することで、システムのネットワーク負荷やパフォーマンス上のボトルネックに関する情報を得ることができます。
- ファイアウォールの設定確認: ファイアウォールが期待通りにポートを開放またはブロックしているかを確認する際にも役立ちます。
これらの目的を達成するために、netstat
や ss
といったコマンドが活用されます。
Ubuntuでのポート確認ツール:netstatとss
Ubuntuを含む多くのLinuxディストリビューションでは、ネットワークの状態、特にポートの状態を確認するための標準的なコマンドとして netstat
が古くから利用されてきました。しかし、システムの規模が大きくなり、アクティブなネットワーク接続の数が増えるにつれて、netstat
はパフォーマンス上の問題(特に多数の接続がある場合の処理速度低下)を抱えるようになりました。
そこで開発されたのが ss
(socket statistics) コマンドです。ss
は、カーネル内のソケット情報を直接取得するため、netstat
よりも高速に動作します。また、ss
は netstat
にはなかった多くの新しいフィルタリング機能や詳細な情報表示機能を持っています。
現在では、Linux環境、特に接続数が多くなりがちなサーバー環境においては、ss
コマンドの利用が推奨されています。しかし、netstat
も依然として広く利用されており、多くのシステム管理者にとって馴染み深いコマンドであるため、両方の使い方を知っておくことは無駄ではありません。
この記事では、まず伝統的な netstat
コマンドの使い方を詳しく解説し、次に ss
コマンドの使い方、そして両者の比較を行います。
netstatコマンドの詳細
netstat
は、ネットワーク接続、ルーティングテーブル、インターフェース統計情報、マスカレード接続、およびネットワークソケット(TCP、UDP、RAW)に関する情報を表示するコマンドです。ここでは、主にポートに関連するソケット情報の表示に焦点を当てて解説します。
基本的な使い方
オプションを指定せずに netstat
を実行すると、アクティブな(LISTEN状態ではない)ソケットが表示されます。
bash
netstat
出力例:
“`
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:ssh localhost:41620 ESTABLISHED
tcp 0 0 localhost:41620 localhost:ssh ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
… (Unixドメインソケットの情報が表示されます)
“`
この基本的な出力では、TCP/UDP接続のうち、現在アクティブに通信しているもの(ESTABLISHED
状態など)や閉じつつあるものなどが表示されますが、サービスが待ち受けている(LISTEN
状態の)ポートはデフォルトでは表示されません。
主要なオプションと組み合わせ
netstat
の機能のほとんどは、オプションを指定することで有効になります。ポート確認でよく使用される主要なオプションを以下に示します。
-a
(–all): すべての接続と待ち受け(リッスン)ポートを表示します。LISTEN
状態のソケットも表示されるため、サービスが起動しているか確認する際によく使用されます。-t
(–tcp): TCPソケットのみを表示します。-u
(–udp): UDPソケットのみを表示します。-l
(–listening): 待ち受け(リッスン)状態のソケットのみを表示します。サーバープロセスが特定のポートで接続を待っているかを確認するのに非常に便利です。-p
(–programs): そのソケットを使用しているプロセス(プログラム名とPID)を表示します。どのプロセスがどのポートを使用しているかを知るのに役立ちますが、このオプションを使用するにはroot権限が必要です(通常はsudo
を付けて実行します)。-n
(–numeric): ホスト名、ポート番号、およびユーザー名を数値形式で表示します。通常、netstat
はポート番号を対応するサービス名(例: 80 -> http, 22 -> ssh)に解決しようとしますが、-n
オプションを使うと解決を行わないため、表示が速くなり、正確なポート番号を確認できます。ポート番号でフィルタリングする場合にも便利です。-r
(–route): ルーティングテーブルを表示します。ポート確認そのものとは直接関係ありませんが、netstat
の機能の一つです。-s
(–statistics): ネットワークプロトコル(IP, TCP, UDPなど)ごとの統計情報を表示します。これもポート確認そのものとは直接関係ありませんが、ネットワークの問題診断に役立つことがあります。-c
(–continuous): 情報を継続的に表示します。一定間隔(デフォルトでは1秒)で情報を更新して表示するため、リアルタイムでポートや接続の状態を監視するのに便利です。中断するにはCtrl+C
を押します。
これらのオプションは組み合わせて使用することが一般的です。以下にいくつかのよく使われる組み合わせ例を示します。
-
netstat -tuln
: TCP (t
) および UDP (u
) の、待ち受け (l
) 状態にあるすべてのソケットを数値形式 (n
) で表示します。システムで現在どのようなサービスが外部からの接続を待ち受けているかを確認する最も一般的なコマンドの一つです。
bash
netstat -tuln
出力例:
Active Internet connections (only servers)
Proto Local Address Foreign Address State
tcp 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 127.0.0.1:631 0.0.0.0:* LISTEN
tcp6 :::22 :::* LISTEN
tcp6 ::1:631 :::* LISTEN
udp 0.0.0.0:68 0.0.0.0:*
udp 0.0.0.0:631 0.0.0.0:*
udp 127.0.0.1:323 0.0.0.0:*
udp6 :::546 :::*
udp6 ::1:323 :::*
この例では、SSHサーバーがTCP 22番ポート(IPv4とIPv6の両方)で、CUPS (印刷システム) がTCP/UDP 631番ポートで、DHCPクライアントがUDP 68番ポートで、systemd-resolvedがUDP 323番ポートで待ち受けていることがわかります。0.0.0.0
はすべてのIPv4アドレスからの接続を受け付けることを、*
は任意のリモートアドレス/ポートからの接続を受け付けることを意味します。LISTEN
状態は、そのポートでサービスが稼働し、接続待ちであることを示します。 -
netstat -tulnp
: 上記に加えて、プロセス情報 (p
) も表示します。どのプロセスがどのポートを使用しているか確認できます。sudo
が必要です。
bash
sudo netstat -tulnp
出力例:
Active Internet connections (only servers)
Proto Local Address Foreign Address State PID/Program name
tcp 0.0.0.0:22 0.0.0.0:* LISTEN 879/sshd
tcp 127.0.0.1:631 0.0.0.0:* LISTEN 896/cupsd
tcp6 :::22 :::* LISTEN 879/sshd
tcp6 ::1:631 :::* LISTEN 896/cupsd
udp 0.0.0.0:68 0.0.0.0:* 614/systemd-network
udp 0.0.0.0:631 0.0.0.0:* 896/cupsd
udp 127.0.0.1:323 0.0.0.0:* 613/systemd-resolve
udp6 :::546 :::* 614/systemd-network
udp6 ::1:323 :::* 613/systemd-resolve
この例では、TCP 22番ポートはsshd
プロセス (PID 879) が、TCP/UDP 631番ポートはcupsd
プロセス (PID 896) が使用していることが明確にわかります。 -
netstat -an
: すべて (a
) の接続と待ち受けポートを数値形式 (n
) で表示します。LISTEN
状態だけでなく、現在確立されている接続 (ESTABLISHED
) や閉じている最中の接続 (TIME_WAIT
,CLOSE_WAIT
など) もすべて確認できます。
bash
netstat -an
出力例(一部抜粋):
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 192.168.1.100:22 192.168.1.200:51234 ESTABLISHED
tcp 0 0 192.168.1.100:443 192.168.1.201:54321 ESTABLISHED
tcp 0 0 192.168.1.100:80 192.168.1.202:65432 TIME_WAIT
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:41620 127.0.0.1:22 ESTABLISHED
...
この出力から、SSH (:22
) やHTTPS (:443
) で接続が確立されていること、Webサーバーの接続 (:80
) がTIME_WAIT
状態になっているものがあることなどが確認できます。
netstatの出力の見方
netstat -an
や netstat -tuln
のようなコマンドの出力は、通常以下のような列で構成されます。
- Proto: プロトコル (
tcp
,udp
,tcp6
,udp6
,unix
など)。tcp6
やudp6
はIPv6接続を示します。 - Recv-Q: 受信キュー内のバイト数。アプリケーションがまだ読み取っていないデータの量です。通常は0であるべきですが、ここに大きな数値が表示されている場合、受信側アプリケーションの処理が追いついていない可能性があります。
- Send-Q: 送信キュー内のバイト数。リモートホストに送信される準備ができていないデータの量です。通常は0であるべきですが、ここに大きな数値が表示されている場合、送信側アプリケーションやネットワークの問題が考えられます。
- Local Address: ローカル(自ホスト)のIPアドレスとポート番号。IPアドレスが
0.0.0.0
や:::
の場合、そのポートはすべてのネットワークインターフェースからの接続を受け付けていることを意味します。127.0.0.1
や::1
の場合、ローカルホスト内(ループバックインターフェース)からの接続のみを受け付けます。ポート番号は:
の後に続きます。-n
オプションがない場合、ポート番号はサービス名で表示されることがあります(例:localhost:ssh
)。 - Foreign Address: リモート(相手ホスト)のIPアドレスとポート番号。待ち受け状態 (
LISTEN
) の場合は0.0.0.0:*
や:::*
と表示され、任意のリモートホスト/ポートからの接続を受け付けることを意味します。確立された接続の場合は、相手のIPアドレスとポート番号が表示されます(例:192.168.1.200:51234
)。 -
State: TCPソケットの状態。主な状態は以下の通りです。
LISTEN
: ソケットがリモートからの接続を待ち受けている状態です。サーバープロセスが稼働していることを示します。ESTABLISHED
: コネクションが確立され、データ転送が可能な状態です。アクティブな通信を示します。SYN_SENT
: コネクション確立のためにSYNパケットを送信し、相手からの応答を待っている状態です。SYN_RECV
: コネクション確立のためにSYNパケットを受信し、SYN+ACKパケットを送信し、相手からのACKを待っている状態です。FIN_WAIT1
: アクティブクローズ(自ホストから切断を開始)し、FINパケットを送信し、相手からのACKを待っている状態です。FIN_WAIT2
: 相手からのACKを受信し、相手からのFINパケットを待っている状態です。TIME_WAIT
: コネクションを閉じた後、一定時間(通常2分)待機している状態です。これは、ネットワーク上に残存する遅延パケットが新しいコネクションに影響を与えるのを防ぐために必要です。TIME_WAIT
が大量に発生すると、リソースを消費する可能性があります。CLOSE_WAIT
: パッシブクローズ(相手から切断を開始)し、相手からのFINパケットを受信したが、まだ自ホスト側がACKを送信していない状態です。通常、アプリケーションがソケットを閉じ忘れている場合にこの状態が多く見られます。CLOSED
: ソケットが完全に閉じている状態です(通常、netstat
の出力には表示されません)。LAST_ACK
:CLOSE_WAIT
状態から、相手からのACKを待っている状態です。CLOSING
: 稀な状態で、両側が同時に接続を閉じようとしている状態です。
-
PID/Program name: プロセスIDとプログラム名。
-p
オプションを付けた場合に表示されます。どのプロセスがそのソケットを開いているかを特定できます。
フィルタリングと活用例 (grep
との組み合わせ)
netstat
の出力は量が多くなることがあるため、特定の情報だけを表示させたい場合は grep
コマンドと組み合わせてフィルタリングを行うのが一般的です。
-
特定のポートで待ち受けているプロセスを確認する: 例えば、Webサーバー(通常80番または443番ポート)を確認する場合。
bash
sudo netstat -tulnp | grep :80
sudo netstat -tulnp | grep :443
ポート番号の前に:
を付けることで、「Local Address」列のポート番号部分だけを正確にフィルタリングできます。 -
特定のサービス名でフィルタリングする:
-n
オプションを使わない場合、サービス名でフィルタリングすることも可能です。
bash
sudo netstat -tulnp | grep ssh
これにより、SSHサービス (sshd
) が待ち受けているポート(通常22番)が表示されます。 -
特定のIPアドレスとの接続を確認する: 特定のリモートホスト (
192.168.1.200
など) との接続を確認する場合。
bash
netstat -an | grep 192.168.1.200 -
特定の状態の接続を確認する: 例えば、
TIME_WAIT
状態の接続数を数える場合。
bash
netstat -an | grep TIME_WAIT | wc -l
wc -l
は行数をカウントするコマンドです。
netstatの限界とssへの移行
netstat
は長年にわたり広く利用されてきましたが、特に多数の接続を持つ現代のサーバー環境ではいくつかの限界があります。
- 速度: 多数のソケット情報を取得する際に、
netstat
は/proc/net/
以下の様々なファイルを読み込んで処理します。ソケット数が増えると、この処理に時間がかかり、netstat
の実行が遅くなります。 - 情報量:
netstat
は基本的な情報を提供しますが、TCPの輻輳制御の状態やソケットバッファの情報など、より詳細なネットワークスタックに関する情報を取得することはできません。 - フィルタリング:
netstat
自体には高度なフィルタリング機能がなく、複雑な条件で絞り込みたい場合はgrep
などの外部コマンドに頼る必要があります。
これらの理由から、新しいLinuxシステムでは netstat
の代替として ss
コマンドが推奨されています。ss
は iproute2
パッケージの一部であり、カーネル空間のソケットハッシュテーブルを直接利用するため、非常に高速にソケット情報を取得できます。
ssコマンドの詳細
ss
は netstat
の後継として開発された強力なソケット情報表示ツールです。多数の接続があっても高速に動作し、より詳細な情報表示や高度なフィルタリング機能を持っています。
ssコマンドの概要とnetstatからの改善点
ss
コマンドは、Linuxカーネルの内部データ構造を利用してソケット情報を取得します。これにより、netstat
が /proc
ファイルシステムを介して情報を取得するよりもはるかに高速に動作します。特に、数万、数十万といった大量の接続を抱えるサーバー環境では、ss
の速度的なメリットは顕著です。
また、ss
はTCP固有の詳細な情報(Round Trip Time (RTT)、Congestion Window (cwnd)、Advertised Window (awin)、Sackなど)を表示する機能や、netstat
にはない柔軟なフィルタリング構文を持っています。
基本的な使い方
オプションなしで ss
を実行すると、確立済みのTCP接続などが表示されます。これは netstat
のデフォルトの出力に近いものです。
bash
ss
出力例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp ESTAB 0 0 192.168.1.100:ssh 192.168.1.200:51234
tcp ESTAB 0 0 192.168.1.100:https 192.168.1.201:54321
tcp ESTAB 0 0 127.0.0.1:41620 127.0.0.1:ssh
主要なオプションと組み合わせ
ss
コマンドのオプションは netstat
と似ているものが多いですが、一部異なります。また、ss
独自の強力なオプションも存在します。
-a
(–all): すべてのソケット(接続、待ち受け、閉じているものなど)を表示します。-l
(–listening): 待ち受け(リッスン)状態のソケットのみを表示します。-t
(–tcp): TCPソケットのみを表示します。-u
(–udp): UDPソケットのみを表示します。-w
(–raw): RAWソケットのみを表示します。-x
(–unix): Unixドメインソケットのみを表示します。-p
(–processes): そのソケットを使用しているプロセス(プログラム名とPID)を表示します。sudo
が必要です。-n
(–numeric): ホスト名、ポート番号を数値形式で表示します。名前解決を行わないため高速です。-s
(–summary): ソケットのサマリー情報を表示します。プロトコルごと、状態ごとのソケット数が一目でわかります。-o
(–options): ソケット固有のタイマー情報を表示します。-m
(–memory): ソケットのメモリ使用量情報を表示します。-i
(–info): TCPソケットに関する詳細情報(RTT、Congestion Window、Retransmit数など)を表示します。ネットワークパフォーマンスの問題解析に非常に役立ちます。-e
(–extended): より詳細なソケット情報(ユーザーID、inode番号など)を表示します。-r
(–resolve): ポート番号やIPアドレスをサービス名やホスト名に解決して表示します(-n
とは逆の動作)。デフォルトでは有効です。
よく使う組み合わせ例を以下に示します。
-
ss -tuln
: TCP (t
) および UDP (u
) の、待ち受け (l
) 状態にあるすべてのソケットを数値形式 (n
) で表示します。これはnetstat -tuln
に相当し、システムで待ち受けているサービスを確認する最も基本的なss
コマンドです。
bash
ss -tuln
出力例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.1:631 0.0.0.0:*
tcp6 LISTEN 0 128 :::22 :::*
tcp6 LISTEN 0 128 ::1:631 :::*
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
udp UNCONN 0 0 0.0.0.0:631 0.0.0.0:*
udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:*
udp6 UNCONN 0 0 :::546 :::*
udp6 UNCONN 0 0 ::1:323 :::*
LISTEN
状態のTCPソケットと、UNCONN
(Unconnected) 状態のUDPソケットが表示されています。UDPはコネクションレスなのでLISTEN
状態という概念がなく、UNCONN
は「待ち受け可能だがまだ接続されていない」状態を示します。 -
ss -tulnp
: 上記に加えて、プロセス情報 (p
) も表示します。どのプロセスがどのポートを使用しているか確認できます。sudo
が必要です。
bash
sudo ss -tulnp
出力例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=879,fd=3))
tcp LISTEN 0 128 127.0.0.1:631 0.0.0.0:* users:(("cupsd",pid=896,fd=7))
tcp6 LISTEN 0 128 :::22 :::* users:(("sshd",pid=879,fd=4))
tcp6 LISTEN 0 128 ::1:631 :::* users:(("cupsd",pid=896,fd=6))
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:* users:(("systemd-network",pid=614,fd=22))
udp UNCONN 0 0 0.0.0.0:631 0.0.0.0:* users:(("cupsd",pid=896,fd=8))
udp UNCONN 0 0 127.0.0.1:323 0.0.0.0:* users:(("systemd-resolve",pid=613,fd=13))
udp6 UNCONN 0 0 :::546 :::* users:(("systemd-network",pid=614,fd=25))
udp6 UNCONN 0 0 ::1:323 :::* users:(("systemd-resolve",pid=613,fd=15))
Process
列に、ユーザー情報、プログラム名、PID、ファイルディスクリプタ番号が表示されます。 -
ss -an
: すべて (a
) のソケットを数値形式 (n
) で表示します。netstat -an
に相当しますが、ss
の方が高速です。
bash
ss -an
出力例(一部抜粋):
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp ESTAB 0 0 192.168.1.100:22 192.168.1.200:51234
tcp ESTAB 0 0 192.168.1.100:443 192.168.1.201:54321
tcp TIME-WAIT 0 0 192.168.1.100:80 192.168.1.202:65432
tcp LISTEN 0 128 127.0.0.1:631 0.0.0.0:*
tcp ESTAB 0 0 127.0.0.1:41620 127.0.0.1:22
... -
ss -s
: ソケットのサマリー情報を表示します。
bash
ss -s
出力例:
Total: 165 (kernel 193)
TCP: 38 (estab 4, closed 29, orphaned 0, synrecv 0, timewait 29, synsent 0, finwait1 0, finwait2 0, lastack 0, listen 5, closing 0, twpf 0)
UDP: 7
RAW: 0
UNIX: 120 (listener 34, active 86, dgram 35, stream 51)
これにより、現在開かれているTCP、UDP、UNIXドメインソケットなどの合計数や、TCPソケットの状態別の数が一目で把握できます。timewait 29
はTIME_WAIT
状態のソケットが29個あることを示しています。 -
ss -tan state established
: TCP (t
) のすべての (a
) ソケットのうち、ESTABLISHED
状態 (state established
) のものを数値形式 (n
) で表示します。これはss
独自の強力なフィルタリング機能の例です。
bash
ss -tan state established -
ss -i
: TCPソケットの詳細情報(パフォーマンス関連)を表示します。
bash
ss -i
出力例(一部抜粋):
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp ESTAB 0 0 192.168.1.100:ssh 192.168.1.200:51234
cubic wscale:9,7 rto:204 rtt:4.05/3.5 ato:40 mss:1460 rcvmss:1460 advmss:1460 cwnd:10 bytes_acked:451 bytes_received:36 segs_out:11 segs_in:10 data_acked:39 data_sent:39 send 3.9Mbps lastsnd:1 lastrcv:1 lastack:1 pacing_rate 7.8Mbps retrans:0/0 rcv_rtt:2 rcv_space:29200
...
wscale
,rto
,rtt
,cwnd
,retrans
といった項目は、TCP接続の健全性やパフォーマンスを診断する上で非常に重要な情報です。
ssの出力の見方
ss
コマンドの出力列は netstat
と似ていますが、より多くの情報を含めることができます。
- Netid: プロトコル (
tcp
,udp
,raw
,unix
,netlink
など)。 - State: ソケットの状態 (
LISTEN
,ESTAB
(ESTABLISHED),TIME-WAIT
,CLOSE-WAIT
,UNCONN
など)。netstat
とほぼ同じ意味です。 - Recv-Q: 受信キュー内のバイト数またはソケット数。
- Send-Q: 送信キュー内のバイト数またはソケット数。
- Local Address:Port: ローカルのIPアドレスとポート番号。
- Peer Address:Port: リモートのIPアドレスとポート番号。
Peer
は相手を意味します。 - Process:
-p
オプションを付けた場合に表示されるプロセス情報。users:(("program_name",pid=PID,fd=FD_number))
の形式で表示されます。 - その他のオプション情報:
-o
,-m
,-i
,-e
オプションを付けると、その後の行にソケット固有の詳細情報が表示されます。
ssコマンドの強力なフィルタリング機能
ss
の最大の利点の一つは、コマンド自身が高度なフィルタリング構文をサポートしていることです。これにより、grep
を使うよりも効率的かつ柔軟に目的のソケットを絞り込むことができます。フィルタリング条件は、コマンドの最後にオプションとは別に指定します。
フィルタリングは、ソケットの状態、アドレス、ポート番号などを組み合わせて指定できます。構文は以下のようになります。
bash
ss [オプション] [フィルタリング構文]
フィルタリング構文は丸括弧 ()
で囲む必要があります。内部では、比較演算子や論理演算子を使用して条件を記述します。
状態によるフィルタリング:
state
キーワードを使用します。複数の状態を指定する場合は、カンマ区切りでリストを指定します。
bash
ss -tan state established # 確立済み (ESTABLISHED) のTCP接続
ss -an state time-wait # TIME-WAIT 状態のすべてのソケット
ss -s state time-wait # TIME-WAIT 状態のソケット数サマリー
ss -a state listening,established,time-wait # LISTEN, ESTABLISHED, TIME-WAIT のソケット
可能な状態キーワードは以下の通りです (ss -s
の出力のTCPセクションなどに表示されるものと対応します): established
, syn-sent
, syn-recv
, fin-wait-1
, fin-wait-2
, time-wait
, closed
, close-wait
, last-ack
, listening
, closing
, all
, connected
, synchronized
, bucket
, big
.
ポート番号によるフィルタリング:
ローカルポート (sport
– Source Port) またはリモートポート (dport
– Destination Port) でフィルタリングできます。ポート番号は数値またはサービス名(/etc/services
に記載されているもの)で指定できます。特定のポート番号を指定する場合は :ポート番号
の形式で指定します。
bash
ss -tuln sport = :ssh # ローカルポートがssh (22) で待ち受け中のソケット
ss -tan dport = :http # リモートポートがhttp (80) で確立済みのソケット
ss -an sport = :80 or sport = :443 # ローカルポートが80番または443番のすべてのソケット
ss -an dport = :80 or dport = :443 # リモートポートが80番または443番のすべてのソケット
ss -an '( sport >= :10000 and sport <= :20000 )' # ローカルポートが10000~20000の範囲
ss -an '( dport != :ssh )' # リモートポートがssh (22) ではないすべてのソケット
ポート範囲を指定するには、:開始ポート
から :終了ポート
の形式を使用します。例えば sport = :10000-:20000
のようには指定できません。sport >= :10000 and sport <= :20000
のように比較演算子と論理演算子を使用する必要があります。
使用可能な比較演算子: =
, !=
, >
, <
, >=
, <=
.
使用可能な論理演算子: and
, or
.
IPアドレスによるフィルタリング:
ローカルアドレス (src
– Source Address) またはリモートアドレス (dst
– Destination Address) でフィルタリングできます。IPアドレスは CIDR 表記(例: 192.168.1.0/24
)で指定することも可能です。
bash
ss -an src = 192.168.1.100 # ローカルアドレスが 192.168.1.100 のソケット
ss -tan dst = 192.168.1.200 # リモートアドレスが 192.168.1.200 で確立済みのTCPソケット
ss -an dst = 192.168.1.0/24 # リモートアドレスが 192.168.1.0/24 サブネット内のソケット
ss -an '( src = 192.168.1.100 and dport = :ssh )' # ローカル 192.168.1.100 からリモートsshへのソケット
IPアドレスとポートの組み合わせフィルタリング:
IPアドレスとポート番号を組み合わせてフィルタリングできます。IPアドレスとポート番号は :
で区切ります。
bash
ss -an dport = 192.168.1.200:ssh # リモートアドレスが 192.168.1.200 かつリモートポートが ssh (22)
ss -an src = 192.168.1.100:*:* # ローカルアドレスが 192.168.1.100 のすべてのソケット (ポートは任意)
ss -an '( src = 192.168.1.100 and dport = 192.168.1.200:ssh )'
*
は任意の値を示します。
-i
オプションと組み合わせた活用:
ss -i
はTCPの詳細情報を表示しますが、特定の接続だけについてその情報を確認したい場合があります。フィルタリングと組み合わせることで、特定の接続のTCP詳細情報を表示できます。
bash
ss -ti state established '( dport = :https or sport = :https )'
これは、HTTPS接続 (dport
または sport
が :https
) のうち、ESTABLISHED
状態にあるものについて、TCP詳細情報 (-i
) を表示します。
ssコマンドの高度な使い方: Unixドメインソケットの確認
ss
コマンドは、ネットワークソケットだけでなく、同じシステム上のプロセス間通信に使われるUnixドメインソケット (unix
プロトコル) も確認できます。
bash
ss -xap
* -x
: Unixドメインソケットを表示します。
* -a
: すべてのソケット(リスニング状態を含む)を表示します。
* -p
: プロセス情報を表示します(sudo
が必要です)。
出力例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
unix LISTEN 0 128 /run/systemd/journal/stdout 0 * 0 users:(("systemd",pid=1,fd=37))
unix DGRAM 0 0 /run/systemd/journal/dev-log 0 * 0 users:(("systemd-journal",pid=612,fd=5))
unix STREAM ESTAB 0 0 /run/user/1000/bus 34827 * 34828 users:(("systemd",pid=1,fd=66)) users:(("dbus-daemon",pid=917,fd=3))
Unixドメインソケットは、ファイルシステム上のパス(Local Address:Port 列)を介して通信します。これもプロセス間の通信問題のデバッグに役立つことがあります。
Recv-Q / Send-Qの解釈(ssの場合)
ss
の Recv-Q
と Send-Q
列は、デフォルトではキュー内のバイト数を表示します。netstat
と同様に、これらの値が大きい場合は、アプリケーションがデータの読み取り/書き込みに追いついていない、あるいはネットワークが詰まっているなどの問題を示唆している可能性があります。
Unixドメインソケットの場合、Recv-Q
と Send-Q
は通常、キュー内のソケット数を表します。
netstatとssの比較
特徴 | netstat | ss (socket statistics) |
---|---|---|
取得元 | /proc/net/* ファイルの読み込み |
カーネル内のソケットハッシュテーブルを直接参照 |
速度 | 遅い(ソケット数が多いほど顕著) | 高速 |
機能 | 基本的なソケット、ルーティング情報 | より詳細なソケット情報 (TCP詳細など)、ルーティング情報 |
フィルタリング | 限定的(主に外部コマンド grep と連携) |
高度なフィルタリング構文を内蔵 |
出力情報 | 基本的な接続情報、状態、PID/Program名 | 基本情報に加えて、TCP詳細、タイマー、メモリ使用量など |
推奨度 | 非推奨(多くのLinuxディストリビューション) | 推奨(新しい標準) |
パッケージ | net-tools |
iproute2 |
コマンド名 | netstat |
ss |
なぜ ss
が推奨されるのか?
主にその速度と機能の豊富さによります。大規模なサーバーで多数のコネクションが発生している場合、netstat
の実行には数秒から数十秒かかることがありますが、ss
はほぼ瞬時に結果を返します。また、ss -i
で表示されるTCPの詳細情報は、ネットワークの輻輳やパケットロスなどの低レベルな問題を診断する上で非常に価値があります。さらに、内蔵されたフィルタリング機能は、複雑な条件で特定のソケットを探す作業を grep
を使うよりも効率的に行えます。
ただし、netstat
も依然として多くの環境に存在し、簡単な確認には十分高速であるため、その使い方を知っておくことは無駄ではありません。しかし、新しいシステムでネットワークツールを学ぶのであれば、ss
を優先的に習得することをお勧めします。
その他の関連コマンド/ツール
Ubuntuには、ポート確認やネットワーク状態の把握に役立つ他のコマンドもいくつか存在します。
-
lsof -i
:lsof
(list open files) コマンドは、システムが開いているファイルを表示しますが、ネットワーク接続も「ファイル」として扱います。-i
オプションを使うと、ネットワーク接続を開いているプロセスを表示できます。
bash
sudo lsof -i
出力例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 879 root 3u IPv4 21306 0t0 TCP *:ssh (LISTEN)
sshd 879 root 4u IPv6 21308 0t0 TCP *:ssh (LISTEN)
cupsd 896 root 7u IPv4 21390 0t0 TCP 127.0.0.1:ipp (LISTEN)
cupsd 896 root 8u IPv4 21391 0t0 UDP *:ipp
sshd 1234 user1 3u IPv4 25678 0t0 TCP myhost:ssh->otherhost:51234 (ESTABLISHED)
lsof -i
はsudo ss -tunlp
やsudo netstat -tulnp
と似た情報を提供しますが、開いているファイルディスクリプタの列(FD
)も表示される点が異なります。特定のプロセスが開いているソケットを確認したい場合にも使えます(例:lsof -i -p <PID>
)。 -
nmap
: ポートスキャンツールです。ローカルまたはリモートのホストで、どのポートが開いているか(リスニング状態か)を能動的にスキャンして確認します。セキュリティ監査やネットワークマッピングによく使用されます。デフォルトではインストールされていないことが多いです。
“`bash
# インストール (必要であれば)
sudo apt update
sudo apt install nmapローカルホストのスキャン
nmap localhost
特定のIPアドレスのスキャン
nmap 192.168.1.100
特定ポートのみスキャン
nmap -p 20-25,80,443 192.168.1.100
``
nmapは外部から見たポートの状態を確認するツールであり、自ホスト内部でリスニングしているポートを確認する
netstatや
ss` とは用途が少し異なります。 -
nc
(netcat): ネットワーク接続を扱う汎用ツールです。特定のポートに接続を試みたり、特定のポートで待ち受けたりすることができます。ポートが本当に開いているか、外部から接続可能かなどをテストする際に役立ちます。
“`bash
# ローカルホストの特定のポートが接続を受け付けているかテスト (TCP)
nc -zv localhost 80
Connection to localhost 80 port [tcp/http] succeeded!リモートホストの特定のポートが接続を受け付けているかテスト (TCP)
nc -zv 192.168.1.100 22
Connection to 192.168.1.100 22 port [tcp/ssh] succeeded!UDPポートのテスト
nc -zvu 192.168.1.100 53
``
-zオプションはスキャンモードで、接続を試みるだけでデータの送受信はしません。
-vは詳細表示、
-u` はUDPを指定します。 -
fuser
: 特定のファイルやポートを使用しているプロセスを特定するコマンドです。ポートを指定するには-n
オプションとプロトコル、そしてポート番号を使用します。
“`bash
sudo fuser -n tcp 80
# またはサービス名で指定
sudo fuser -n tcp httpPIDとともにプログラム名を表示
sudo fuser -n tcp 80 -v
出力例:
USER PID ACCESS COMMAND
80/tcp: www-data 1234 F…. apache2
``
apache2` プロセスが使用していることを示します。特定のポートが使用中で、他のサービスが起動できない場合に、そのポートを占有しているプロセスを特定するのに非常に便利です。
これは、80番TCPポートをPID 1234の
実用的な応用例
これまでに解説したコマンドを使って、具体的な状況でポートを確認する方法を見ていきましょう。
1. 特定のサービスが待ち受け(リッスン)しているか確認する
例えば、Webサーバー(ApacheやNginx)が正しく起動し、80番ポートで待ち受けているか確認したい場合。
“`bash
ssを使用 (推奨)
ss -tulnp | grep :80
netstatを使用
sudo netstat -tulnp | grep :80
``
-l(listen) オプションを使うことで、待ち受け状態のソケットだけが表示されるため、出力が絞り込まれやすくなります。
-p` オプションでプロセス名も表示することで、どのWebサーバープロセス(apache2やnginxなど)がポートを開いているか確認できます。
2. 特定のプロセスが使用しているポートを確認する
あるプロセス(例えばPIDが1234)がどのポートを開いているか、あるいはどのような接続を確立しているか確認したい場合。
“`bash
ssを使用 (PIDフィルタリングはssの機能としては直接はないため、grepと組み合わせる)
sudo ss -anp | grep 1234
lsofを使用 (lsofの方がプロセス指定が直接的)
sudo lsof -i -p 1234
fuserを使用 (特定のポート/ファイルを使用しているプロセスを逆引き)
これは特定のプロセスが開いている「全ての」ポートではなく、特定のポートを「どのプロセス」が開いているか、という用途に向いています。
例: PID 1234 が 80番ポートを使っているか確認
sudo fuser -n tcp 80 -v | grep 1234
``
ss -anp | grep 1234は、すべてのソケット情報(
-anp)を取得し、その中からPIDが1234を含む行を
grepでフィルタリングします。
lsof -i -p 1234は、PID 1234 のプロセスが開いているネットワーク接続(
-i)を一覧表示します。この用途では
lsof` が最もシンプルかもしれません。
3. 予期しないポートが開いていないか(セキュリティチェック)
システムをスキャンして、必要ないサービスが外部に公開されていないか確認します。特に LISTEN
状態のポートに注意します。
“`bash
すべての待ち受けポートを数値形式で表示 (ss推奨)
ss -tuln
プロセス情報も表示 (ss推奨、root権限が必要)
sudo ss -tulnp
またはnetstat
sudo netstat -tulnp
``
LISTEN
これらのコマンドの出力を確認し、既知の必要なサービス以外のポートで状態になっているものがないかチェックします。例えば、データベースサーバー(MySQL: 3306, PostgreSQL: 5432)が必要なければ、これらのポートが外部からアクセス可能なアドレス (
0.0.0.0` やサーバーの外部IPアドレス) でリスニングしていないか確認します。
4. 確立されている接続を確認する
システムが現在どのようなリモートホストと通信しているか確認します。
“`bash
ssを使用 (ESTABLISHED状態のみをフィルタリング)
ss -tan state established
netstatを使用
netstat -an | grep ESTABLISHED
“`
これにより、現在アクティブな接続が一覧表示されます。見慣れないIPアドレスやポートとの接続がないか確認することで、不正な通信を早期に発見できる可能性があります。
5. TIME_WAIT状態のソケットが多いか確認する
短期間に多数のTCP接続が閉じられるWebサーバーなどでは、TIME_WAIT
状態のソケットが大量に発生することがあります。これが多すぎると、新しい接続を受け付けられなくなったり、メモリを圧迫したりする可能性があります。
“`bash
ssのサマリーで確認
ss -s
ssで詳細を確認
ss -tan state time-wait | wc -l # TIME-WAITの数をカウント
ss -tan state time-wait # TIME-WAITの詳細一覧
``
ss -sのTCPセクションで
timewait` の数を確認するのが最も手軽です。具体的な接続を確認したい場合は、状態フィルタリングで絞り込みます。
6. ネットワークパフォーマンスの問題を診断する
特定の接続でデータの送受信が遅いなど、ネットワークパフォーマンスに問題がある場合、ss -i
オプションが非常に役立ちます。
“`bash
特定のリモートIPアドレスとのESTABLISHED接続のTCP詳細を表示
ss -ti state established dst 192.168.1.200
``
rtt
出力される(Round Trip Time - 往復時間) や
retrans(Retransmission - 再送数)、
cwnd(Congestion Window) といった値は、ネットワークの遅延やパケットロスが発生しているか、輻輳制御が適切に機能しているかなどを判断するための手がかりとなります。例えば、
retrans` の数が多い場合はパケットロスが頻繁に発生していることを示唆します。
トラブルシューティングシナリオ
ポート確認コマンドは、様々なネットワーク関連のトラブルシューティングで活躍します。
シナリオ1: Webサーバーが起動しない
問題: ApacheやNginxを起動しようとしたがエラーになり、起動できない。
考えられる原因: 80番ポートや443番ポートが他のプロセスによって使用されている。
確認方法:
bash
sudo ss -tulnp | grep :80
sudo ss -tulnp | grep :443
結果の解釈: もし出力が表示され、その Process
列に自分が起動しようとしているWebサーバー以外のプロセス名(例えば apache2
を起動しようとしているのに nginx
が表示される、あるいは全く予期しないプロセスが表示される)がある場合、そのプロセスがポートを占有しています。
解決策: ポートを占有しているプロセスを特定し、必要なければ停止させるか、設定を変更して別のポートを使用するようにします。sudo fuser -n tcp 80
や sudo fuser -n tcp 443
もポートを占有しているプロセスを特定するのに便利です。
シナリオ2: 外部からSSH接続できない
問題: リモートからSSHでサーバーに接続しようとしたが、接続が拒否されるかタイムアウトする。
考えられる原因:
1. SSHサーバー (sshd
) が起動していないか、22番ポートで待ち受けていない。
2. ファイアウォールが22番ポートをブロックしている。
3. ネットワーク経路に問題がある。
確認方法:
1. サーバー内部からSSHサーバーが待ち受けているか確認します。
bash
sudo ss -tulnp | grep :22
2. ファイアウォールの設定を確認します(例: UFWの場合)。
bash
sudo ufw status
3. リモート側からサーバーの22番ポートへの疎通を確認します。
bash
# リモートホストから実行
nc -zv <サーバーのIPアドレス> 22
# またはnmap
nmap -p 22 <サーバーのIPアドレス>
結果の解釈:
1. ss
の出力で22番ポートが LISTEN
状態でない場合、sshd
が起動していないか、設定エラーで他のポートをリッスンしている可能性があります。sudo systemctl status sshd
などでサービスの状態を確認します。
2. UFWなどのファイアウォールが allow 22/tcp
となっていない場合、ファイアウォールが原因です。
3. nc
や nmap
で接続に失敗する場合、サーバー側でリッスンしていないか、ネットワーク経路上のファイアウォールやルーターなどがブロックしている可能性があります。サーバー側の LISTEN
が確認できている場合は、ファイアウォールやネットワーク経路を疑います。
シナリオ3: システムのネットワーク負荷が高い
問題: システムのCPUやメモリ使用率が高く、ネットワーク関連のプロセスがリソースを消費している可能性がある。
考えられる原因:
1. 大量の接続(特に ESTABLISHED
状態)が発生している。
2. TIME_WAIT
や CLOSE_WAIT
状態のソケットが大量に滞留している。
3. 特定の接続でデータの送受信が滞っている(Recv-Q
や Send-Q
が大きい)。
確認方法:
1. ソケットサマリーで全体的な数と状態を確認します。
bash
ss -s
2. 特定の状態(TIME_WAIT
, CLOSE_WAIT
, ESTABLISHED
など)のソケット数をカウントします。
bash
ss -tan state time-wait | wc -l
ss -tan state close-wait | wc -l
ss -tan state established | wc -l
3. Recv-Q
や Send-Q
が大きいソケットがないか確認します。
bash
# Recv-Q または Send-Q が 0 より大きい TCP ソケットをフィルタリング (ss のフィルタリング機能ではキューサイズを直接フィルタリングできないため、grep と組み合わせる)
ss -an | awk '$3 > 0 || $4 > 0' # $3=Recv-Q, $4=Send-Q
# ss -anp | awk '$3 > 0 || $4 > 0' # プロセス情報も表示する場合
4. -i
オプションでTCPの詳細情報を確認し、再送が多く発生している接続などを特定します。
bash
ss -ti state established
結果の解釈:
* ss -s
で TIME_WAIT
や CLOSE_WAIT
が異常に多い場合、アプリケーションの設計や設定、あるいは短い接続が頻繁に発生するような運用を見直す必要があるかもしれません。CLOSE_WAIT
が多い場合は、多くの場合、アプリケーションがソケットを適切に閉じていないことが原因です。
* ESTABLISHED
が非常に多い場合は、システムが多数のクライアントからの接続を処理していることを意味します。サービスの負荷分散やスケーリングを検討する必要があるかもしれません。
* Recv-Q
や Send-Q
が常に大きいソケットがある場合、その接続に関わるアプリケーションやネットワークに問題がある可能性があります。
* ss -ti
で再送が多い接続が見つかる場合、ネットワーク品質に問題があるか、相手側の受信バッファに問題があるなどが考えられます。
これらの例からわかるように、ss
コマンド(そして必要に応じて netstat
, lsof
, fuser
など)は、システムのネットワーク状態を深く理解し、様々な問題を診断するための強力なツール群です。
まとめ
この記事では、Ubuntu環境でポートの状態を確認するための主要なコマンドである netstat
と ss
について、その基本的な使い方から詳細なオプション、出力の見方、そして実用的な応用例やトラブルシューティングシナリオまでを網羅的に解説しました。
- ポートは、ネットワーク通信において特定のアプリケーションやサービスを識別する役割を果たし、TCP/UDPと組み合わせて使用されます。ポートの状態を確認することは、サービスの稼働確認、トラブルシューティング、セキュリティチェックなど、多くの目的で不可欠です。
netstat
は古くから利用されているコマンドですが、大規模環境でのパフォーマンスに課題があります。-tulnp
や-an
といったオプションをgrep
と組み合わせて使用するのが一般的です。ss
はnetstat
の後継であり、より高速で多機能な推奨コマンドです。カーネルの内部情報を直接参照するため、多数のソケットがあっても高速に動作します。-tulnp
,-an
,-s
,-i
といったオプションや、state
,sport
,dport
,src
,dst
などのキーワードを使った強力なフィルタリング構文が特徴です。lsof -i
はプロセスとネットワーク接続の関連付けを確認するのに便利であり、fuser
は特定のポートを占有しているプロセスを特定するのに役立ちます。nc
やnmap
は外部からのポート到達性確認に利用できます。
現代のUbuntu環境においては、速度と機能の面で優れる ss
コマンドの習得が最も推奨されます。本記事で解説した様々なオプションやフィルタリング機能を活用することで、システムのネットワーク状態を詳細かつ効率的に把握し、発生しうる問題を迅速に解決できるようになるでしょう。
ポート確認は、Linuxシステム管理における基本的ながら非常に重要なスキルです。本記事が、皆様のUbuntu環境でのネットワーク管理能力向上の一助となれば幸いです。
より詳細な情報は、各コマンドのmanページ(man netstat
, man ss
, man lsof
, man fuser
, man nc
, man nmap
)を参照してください。