Linux管理・運用の基本
システム管理者のための実践ガイド
システム管理者のための実践ガイド
Linuxシステムでアプリケーションを起動したのに、外部から接続できない…そんな経験はありませんか?多くの場合、原因はポートにあります。ポートは、ネットワーク通信における「窓口」のようなもので、適切なポートが開いていないと、通信は成立しません。
この記事では、Linuxにおけるポートの確認方法に焦点を当て、ss、netstat、lsofという3つの主要なコマンドを使って、システム内の通信状況を把握する方法を解説します。これらのコマンドを使いこなせば、ネットワークトラブルの原因究明や、サービスの状態確認がスムーズに行えるようになります。
ss
コマンドによる高速なポート確認方法netstat
コマンドによる詳細なネットワーク情報表示lsof
コマンドによるプロセスとポートの紐付け確認ウェブサーバーやデータベースサーバーなど、何らかのサービスを起動したのに、クライアントから接続できない場合、まず疑うべきはポートの状況です。目的のポートが他のアプリケーションによって使用されていないか、あるいは正しくリッスン(接続待機)されているかを確認する必要があります。
ss
コマンドでポートの利用状況を高速確認ss
(socket statistics)コマンドは、現在アクティブなソケット情報を表示する、比較的新しいコマンドです。netstat
よりも高速に動作し、大量の接続があるシステムでの利用に適しています。
※近年のLinuxディストリビューションでは、netstat
は非推奨となり、ss
が推奨されています(net-tools
パッケージが入っていない場合も)。新規のスクリプトや運用ではss
の利用をおすすめします。
コマンド例:
ss -ltn
意味と使い方:
-l
: リッスン状態のソケットのみを表示します。-t
: TCPソケットを表示します。-n
: サービス名を解決せず、ポート番号で表示します。実行結果の例:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 127.0.0.1:25 0.0.0.0:*
LISTEN 0 128 :::80 :::*
この出力から、TCPポートの22番(SSH)、25番(SMTP)、80番(HTTP)がリッスン状態であることがわかります。特に「State」がLISTEN
になっていることを確認しましょう。
特定のポートが開いているか確認したい場合:
ss -ltn | grep :80
上記はポート80番がリッスン状態にあるかを確認する例です。何も表示されなければ、そのポートはリッスンされていません。
netstat
コマンドでネットワーク接続の詳細を把握するnetstat
(network statistics)コマンドは、ネットワーク接続、ルーティングテーブル、インターフェース統計などを表示する伝統的なコマンドです。ss
よりも多機能ですが、大規模なシステムでは表示に時間がかかることがあります。
コマンド例:
netstat -tunlp
意味と使い方:
-t
: TCP接続を表示します。-u
: UDP接続を表示します。-n
: ホスト名、サービス名を解決せず、IPアドレスとポート番号で表示します。-l
: リッスン状態のソケットのみを表示します。-p
: そのソケットを使用しているプログラム名とPIDを表示します(要root権限)。実行結果の例:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN -
tcp6 0 0 :::80 :::* LISTEN -
ss
と同様に、LISTEN
状態のポートと、それを利用しているローカルアドレス、ポートが確認できます。-p
オプションを使うことで、どのプロセスがそのポートを使用しているかまで特定できるため、ポートの競合調査に非常に役立ちます。
※UDPポートの利用状況を確認したい場合は、ss -lun
やnetstat -lun
のように-u
オプションを付けます。
lsof
コマンドでファイルとプロセス、ポートを関連付けるlsof
(list open files)コマンドは、システム上で開かれているすべてのファイルを表示します。Linuxでは、ネットワーク接続もファイルとして扱われるため、ポートの使用状況を確認する際にも利用できます。
コマンド例:
lsof -i :80
意味と使い方:
-i
: ネットワークファイル(ソケット)を表示します。:80
: 特定のポート番号を指定して表示します。実行結果の例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
apache2 12345 www-data 4u IPv6 67890 0t0 TCP *:http (LISTEN)
この例では、ポート80番をapache2
プロセスが使用しており、そのPIDが12345
であることがわかります。特定のポートをどのプロセスが占有しているか知りたい場合に非常に強力なコマンドです。
特定のプロセスが使用しているポートを知りたい場合:
lsof -i -p <PID>
<PID>
にはプロセスのIDを指定します。これにより、そのプロセスが開いているすべてのネットワーク接続を確認できます。
ss
コマンドは多くの環境で標準搭載ですが、netstat
(net-tools
)やlsof
が入っていない場合は、次のようにインストールできます。
# Ubuntu/Debian
sudo apt update
sudo apt install net-tools lsof
# CentOS/RHEL
sudo yum install net-tools lsof
コマンド | 特徴 | 主な用途 |
---|---|---|
ss |
高速、netstat の後継、大量の接続に適している |
ポートのリスニング状態、既存接続の素早い確認 |
netstat |
多機能、ルーティングや統計情報も表示可能 | ネットワーク全体の詳細な状態把握、プロセスとの紐付け |
lsof |
あらゆるファイル、プロセスとポートの関連付け | 特定のポートを占有しているプロセス特定、詳細調査 |
ポートがLISTEN
状態になっているのに、外部から接続できない場合、原因はポートの占有だけではありません。最もよくあるケースは、ファイアウォールの設定によって接続がブロックされている場合です。
※ポートがLISTEN状態でも、ファイアウォール設定(ufw, firewalld, iptables等)によって外部からの接続が遮断されている場合があります。ポート開放の際は、ファイアウォール設定も併せて確認しましょう。
例えば、firewalld
やufw
を使っている場合は以下のように設定を確認できます。
# firewalldを使用している場合
sudo firewall-cmd --list-all --zone=public
# ufwを使用している場合
sudo ufw status verbose
また、SELinuxが有効なシステムでは、ポリシー違反によって通信がブロックされることもあります。ログやaudit情報を確認することも重要です。
「ウェブサーバー(ApacheやNginx)を起動しようとしたらエラーで起動できない!」という場合、多くはポートの重複利用が原因です。例えば、既に他のウェブサーバープロセスが80番ポートを占有していると、新しいプロセスはそのポートを使用できません。
この場合、lsof -i :80
やnetstat -tunlp | grep :80
で、どのプロセスが80番ポートを使用しているかを確認し、そのプロセスを停止するか、別のポートを使用するように設定を変更する必要があります。
Linuxにおけるポート確認は、ネットワークトラブルシューティングやサービスの状態監視において不可欠なスキルです。ssコマンドで素早くリッスンポートを確認し、netstatでより詳細なネットワーク接続情報を取得し、そしてlsofでプロセスとポートの関連性を特定することで、どのような状況でも適切な対応が可能になります。
また、ポートがLISTEN状態でも外部から接続できない場合は、ファイアウォールの設定も確認することが重要です。これらの知識とコマンドを組み合わせることで、ネットワークに関する「困った」を迅速に解決できるでしょう。
この記事が、あなたのLinux環境におけるポートの理解を深める一助となれば幸いです。ご覧いただきありがとうございました。