Linuxで8080ポートの使用状況を確認する方法

Linux

LinuxでWebアプリやテスト用のサーバーを立てるときによく使うのが「8080ポート」です。

Tomcat、Node.js、Django開発サーバー、Jenkins、Docker コンテナなど、多くのツールがデフォルトで8080ポートを使います。しかし、以下のような問題に遭遇することがあります。

  • 「アプリが起動したはずなのに、本当に8080番で待ち受けしてる?」
  • 「8080ポートがすでに使用中エラーが出る。どのプロセスが使ってる?」
  • 「外部からアクセスできない。ポートは開いているの?」
  • 「複数のサービスが同じポートを使おうとして競合している」
  • 「開発環境でポート番号を変更すべきか判断したい」

この記事では、Linuxで8080ポートの使用状況を確認する方法を、初心者から上級者まで理解できるよう詳しく解説します。

ssnetstatlsofという3つの主要ツールを使って、ポートの状況やプロセスを調べる手順を具体例とともに紹介します。

スポンサーリンク

ポート確認が必要な場面

よくあるシナリオ

開発環境でのトラブル

  • Node.jsアプリの起動時に「EADDRINUSE: port 8080 already in use」エラー
  • Docker Composeで複数コンテナが同じポートを使用
  • 開発サーバーが立ち上がらない

本番環境での確認

  • Webアプリケーションが正常に起動しているか確認
  • ロードバランサーからの接続ができているか
  • セキュリティ監査でのポート使用状況調査

トラブルシューティング

  • サービスの応答がない場合の原因調査
  • ファイアウォール設定前の動作確認
  • 予期しないプロセスによるポート占有の調査

ssコマンドで8080ポートを確認する

ssコマンドの特徴

ss(socket statistics)はnetstatの後継ツールで、以下の特徴があります。

  • 高速:大量のコネクションでも素早く表示
  • 標準装備:多くの最新Linuxディストリビューションで標準インストール
  • 豊富な機能:詳細なフィルタリングが可能

基本的な使い方

8080ポートをリッスンしているプロセスを確認

ss -ltn sport = :8080

オプションの説明

  • -l:LISTEN(待ち受け)しているソケットのみ表示
  • -t:TCPプロトコルのみ表示
  • -n:ポート番号を数値で表示(名前解決しない)
  • sport = :8080:サーバー側ポート8080を対象にする

出力例

State    Recv-Q   Send-Q     Local Address:Port      Peer Address:Port
LISTEN   0        50         0.0.0.0:8080           0.0.0.0:*
LISTEN   0        50         [::]:8080              [::]:*

プロセス情報も含めて確認

ss -ltnp sport = :8080

-pオプション追加でプロセス情報も表示されます。

出力例

State    Recv-Q   Send-Q     Local Address:Port      Peer Address:Port    Process
LISTEN   0        50         0.0.0.0:8080           0.0.0.0:*            users:(("java",pid=1234,fd=8))

より詳細な情報を取得

# 8080ポートに関連するすべての接続
ss -atn sport = :8080 or dport = :8080

# プロセス名も含めて grep で絞り込み
ss -ltnp | grep ':8080'

# より読みやすい形式で表示
ss -ltnp sport = :8080 | column -t

IPv4とIPv6の区別

# IPv4のみ
ss -4 -ltn sport = :8080

# IPv6のみ
ss -6 -ltn sport = :8080

netstatコマンドで8080ポートを確認する

netstatコマンドの特徴

netstatは伝統的なネットワーク状態表示ツールで、以下の特徴があります。

  • 実績豊富:長年使われており、多くの文献で参照される
  • 幅広い情報:ルーティングテーブルやインターフェース統計も表示可能
  • 互換性:古いシステムでも利用可能

インストール方法

多くの新しいLinuxディストリビューションではnetstatがデフォルトで入っていません。

Ubuntu/Debian系

sudo apt update
sudo apt install net-tools

CentOS/RHEL/Fedora系

# CentOS 7/RHEL 7
sudo yum install net-tools

# CentOS 8以降/Fedora
sudo dnf install net-tools

Arch Linux

sudo pacman -S net-tools

基本的な使い方

8080ポートの確認

netstat -ltnp | grep ':8080'

オプションの説明

  • -l:LISTENしているポートのみ表示
  • -t:TCPプロトコルのみ表示
  • -n:数値で表示(名前解決しない)
  • -p:プロセスID(PID)とプロセス名を表示

出力例

tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      1234/java
tcp6       0      0 :::8080                 :::*                    LISTEN      1234/java

より詳細な情報の取得

すべてのポート状態を表示

# すべての接続(LISTEN + ESTABLISHED)
netstat -atn | grep ':8080'

# UDPポートも含めて確認
netstat -tulnp | grep ':8080'

統計情報の表示

# ネットワーク統計
netstat -s

# TCPの統計のみ
netstat -st

ルーティングテーブルも確認

# ルーティング情報(ポート疎通問題の調査に有用)
netstat -rn

lsofコマンドで8080ポートを確認する

lsofコマンドの特徴

lsof(list open files)は、開かれているファイル(ネットワークソケット含む)を表示するツールです。

  • プロセス中心:どのプロセスがどのリソースを使用しているかが分かりやすい
  • 詳細情報:ファイルディスクリプタや接続状態の詳細を表示
  • 柔軟な絞り込み:様々な条件でフィルタリング可能

基本的な使い方

8080ポートを使用しているプロセスを表示

lsof -i :8080

出力例

COMMAND  PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
java    1234 root   8u   IPv6   123456      0t0  TCP *:http-alt (LISTEN)

出力項目の説明

  • COMMAND:プロセス名
  • PID:プロセスID
  • USER:実行ユーザー
  • FD:ファイルディスクリプタ(8u = 8番、読み書き可能)
  • TYPE:ソケットタイプ
  • DEVICE:デバイス番号
  • SIZE/OFF:ファイルサイズまたはオフセット
  • NODE:inode番号
  • NAME:接続情報

より詳細な確認

TCPポートのみに絞り込み

lsof -iTCP:8080

特定のプロトコルバージョン

# IPv4のみ
lsof -i4TCP:8080

# IPv6のみ
lsof -i6TCP:8080

LISTEN状態のみ表示

lsof -iTCP:8080 -sTCP:LISTEN

特定ユーザーのプロセスのみ

lsof -i :8080 -u tomcat

プロセス詳細の確認

プロセスツリーを表示

# 見つかったPIDの親子関係を確認
lsof -i :8080 | awk 'NR>1 {print $2}' | xargs pstree -p

プロセスの詳細情報

# プロセス詳細(例:PID 1234の場合)
ps aux | grep 1234
cat /proc/1234/cmdline | tr '\0' ' '

実用的な使用例とトラブルシューティング

よくある確認パターン

開発環境での確認

# 開発サーバーが起動しているか確認
ss -ltnp sport = :8080

# 起動していない場合の原因調査
lsof -i :8080  # 他のプロセスが使用していないか

# プロセス強制終了(必要に応じて)
sudo kill -9 $(lsof -t -i :8080)

本番環境での監視

# サービス状態の確認
systemctl status your-service
ss -ltnp sport = :8080

# 接続数の確認
ss -ant sport = :8080 | wc -l

# 接続元IPの分析
ss -ant sport = :8080 | awk '{print $4}' | cut -d: -f1 | sort | uniq -c

ポート衝突の解決

他のプロセスがポートを使用している場合

# 使用プロセスの特定
lsof -i :8080

# プロセスの詳細確認
ps aux | grep [PID]

# 必要に応じてプロセス停止
sudo systemctl stop [service-name]
# または
sudo kill [PID]

代替ポートの確認

# 8081-8090の範囲で空いているポートを確認
for port in {8081..8090}; do
    if ! ss -ltn sport = :$port | grep -q LISTEN; then
        echo "Port $port is available"
    fi
done

パフォーマンス確認

接続数の監視

# 現在の接続数
ss -ant sport = :8080 | grep ESTAB | wc -l

# 継続的な監視(1秒間隔)
watch -n 1 "ss -ant sport = :8080 | grep ESTAB | wc -l"

リソース使用量の確認

# CPU・メモリ使用量
PID=$(lsof -t -i :8080)
top -p $PID

# ファイルディスクリプタ使用数
lsof -p $PID | wc -l

外部からのアクセス確認

ファイアウォール設定の確認

iptablesでの確認

# 8080ポートの受信ルール確認
sudo iptables -L -n | grep 8080

# 詳細なルール表示
sudo iptables -L INPUT -n --line-numbers | grep 8080

UFW(Ubuntu Firewall)での確認

# UFW状態確認
sudo ufw status

# 8080ポートの状態確認
sudo ufw status | grep 8080

firewalld(CentOS/RHEL)での確認

# ファイアウォール状態
sudo firewall-cmd --state

# 8080ポートの確認
sudo firewall-cmd --list-ports | grep 8080

接続テスト

ローカルからのテスト

# 基本的な接続テスト
telnet localhost 8080

# curlでHTTPテスト
curl -I http://localhost:8080

# ncでの接続テスト
nc -zv localhost 8080

外部からのテスト

# 外部IPからの接続テスト
curl -I http://[server-ip]:8080

# nmapでのポートスキャン
nmap -p 8080 [server-ip]

セキュリティ面での注意点

リスニングアドレスの確認

セキュリティリスク

# 危険:すべてのインターフェースで待ち受け
0.0.0.0:8080

# 安全:ローカルホストのみ
127.0.0.1:8080

設定の確認と変更

# 現在のリスニング状態確認
ss -ltn sport = :8080

# アプリケーション設定でバインドアドレスを変更
# 例:Node.jsの場合
# app.listen(8080, '127.0.0.1')  // ローカルのみ
# app.listen(8080, '0.0.0.0')    // すべてのIF

プロセス権限の確認

# プロセス実行ユーザーの確認
lsof -i :8080 | awk 'NR>1 {print $3}'

# rootで動作している場合は要注意
ps aux | grep $(lsof -t -i :8080)

継続的な監視とスクリプト化

簡単な監視スクリプト

#!/bin/bash
# port_monitor.sh

PORT=8080
LOG_FILE="/var/log/port_monitor.log"

check_port() {
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    local process_info=$(lsof -i :$PORT 2>/dev/null)
    
    if [ -n "$process_info" ]; then
        echo "[$timestamp] Port $PORT is in use:" >> $LOG_FILE
        echo "$process_info" >> $LOG_FILE
    else
        echo "[$timestamp] Port $PORT is available" >> $LOG_FILE
    fi
}

check_port

cron での定期実行

# crontabに追加(5分間隔でチェック)
*/5 * * * * /path/to/port_monitor.sh

アラート機能付きスクリプト

#!/bin/bash
# port_alert.sh

PORT=8080
EXPECTED_PROCESS="java"

current_process=$(lsof -i :$PORT -Fn | grep "^n" | cut -c2-)

if [ -z "$current_process" ]; then
    echo "ALERT: Port $PORT is not in use!"
    # メール送信やSlack通知などの処理
elif [[ "$current_process" != *"$EXPECTED_PROCESS"* ]]; then
    echo "ALERT: Unexpected process using port $PORT: $current_process"
fi

よくある質問と回答

Q: 複数のプロセスが同じポートを使えるの?

A: 基本的には不可能ですが、いくつかの例外があります。

通常の場合

  • 同じIPアドレス・ポート番号の組み合わせは1つのプロセスのみ
  • SO_REUSEPORTオプションを使用した場合は複数プロセス可能(Linux 3.9以降)

確認方法

# 同じポートを使用している全プロセス
lsof -i :8080 | awk 'NR>1 {print $1, $2}' | sort | uniq

Q: ポートは開いているのに接続できない

A: 以下の原因が考えられます。

確認手順

  1. プロセスが実際に動作しているか lsof -i :8080 ps aux | grep [PID]
  2. ファイアウォール設定 sudo iptables -L -n | grep 8080 sudo ufw status | grep 8080
  3. リスニングアドレス # 127.0.0.1のみなら外部から接続不可 ss -ltn sport = :8080
  4. ネットワーク接続 ping [server-ip] traceroute [server-ip]

Q: コマンドが見つからないエラーが出る

A: 必要なパッケージをインストールしてください。

Ubuntu/Debian

# netstat
sudo apt install net-tools

# lsof
sudo apt install lsof

# ss(通常は標準インストール済み)
sudo apt install iproute2

CentOS/RHEL

# netstat
sudo yum install net-tools  # CentOS 7
sudo dnf install net-tools  # CentOS 8以降

# lsof
sudo yum install lsof
sudo dnf install lsof

まとめ:効率的なポート確認を身につけよう

Linuxで8080ポートの使用状況を確認する方法をまとめると:

コマンド別の使い分け

  • ss:高速で最新、推奨ツール
  • netstat:伝統的で詳細、古いシステムとの互換性
  • lsof:プロセス中心の詳細情報

基本的なコマンド

# 最も汎用的な確認方法
ss -ltnp | grep ':8080'
netstat -ltnp | grep ':8080'
lsof -i :8080

トラブルシューティングの流れ

  1. ポートの使用状況確認ss または netstat
  2. プロセス詳細確認lsofps
  3. ファイアウォール確認iptablesufw
  4. 接続テストcurltelnet

実践的なポイント

  • 開発環境では定期的なポート確認を習慣化
  • 本番環境では監視スクリプトで自動化
  • セキュリティ面でリスニングアドレスに注意
  • トラブル時は体系的にチェック

コメント

タイトルとURLをコピーしました