Linuxのnetstatコマンドをマスターする:基本から高度なネットワーク監視まで
はじめに
netstat
(ネットワーク統計)コマンドは、Linuxシステム管理者にとって欠かせないネットワークツールの1つです。この多機能なコマンドラインユーティリティは、ネットワーク接続、ルーティングテーブル、インターフェース統計など、ネットワーク関連の重要な情報を包括的に提供します。
netstatとは?
netstat
は、以下のようなネットワーク関連情報を表示するコマンドラインユーティリティです:
- ネットワーク接続(受信および送信)
- ルーティングテーブル
- ネットワークインターフェースの統計
- マスカレード接続
- マルチキャストメンバーシップ
- プロトコル統計
なぜ重要なのか
システム管理者やネットワークエンジニアは、netstat
を以下のような重要な作業で活用します:
- ネットワーク問題のトラブルシューティング - 接続問題やネットワークボトルネックを迅速に特定
- セキュリティ監視 - 不正なネットワーク接続や疑わしい活動の検出
- パフォーマンス分析 - ネットワークトラフィックパターンやインターフェース統計の監視
- システム監査 - アクティブなサービスや開いているポートの確認
簡単な歴史
netstat
コマンドは、Unixシステムの初期からTCP/IPネットワーキングツールキットの一部として存在しています。BSD Unixで誕生したこのツールは、Linuxを含むさまざまなUnix系オペレーティングシステムで標準ツールとして進化を遂げました。
現在では、新しいツールであるss
コマンドに取って代わられつつありますが、netstat
は以下の理由で広く使用されています:
- システム管理者に馴染みがある
- 多くのUnix系システムで利用可能
- 機能が豊富で詳細な出力オプションがある
- 豊富なドキュメントとコミュニティサポートがある
基本的な構文と使用法
コマンド形式
netstat
コマンドの基本的な構文は以下の通りです:
netstat [options]
### よく使われるオプションとフラグ
以下は、`netstat`コマンドで頻繁に使用されるオプションの一覧です:
<table>
<thead>
<tr>
<th>オプション</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>-a</td>
<td>すべてのリスニングポートとアクティブな接続を表示</td>
</tr>
<tr>
<td>-t</td>
<td>TCP接続を表示</td>
</tr>
<tr>
<td>-u</td>
<td>UDP接続を表示</td>
</tr>
<tr>
<td>-n</td>
<td>ホスト名やポート名を解決せずに数値アドレスを表示</td>
</tr>
<tr>
<td>-l</td>
<td>リスニングソケットのみを表示</td>
</tr>
<tr>
<td>-p</td>
<td>PIDとプログラム名を表示</td>
</tr>
<tr>
<td>-r</td>
<td>ルーティングテーブルを表示</td>
</tr>
<tr>
<td>-i</td>
<td>ネットワークインターフェースの統計情報を表示</td>
</tr>
<tr>
<td>-s</td>
<td>プロトコルの統計情報を表示</td>
</tr>
</tbody>
</table>
### 基本的な例
1. **すべてのアクティブな接続を表示**
```bash
netstat -a
- すべてのTCP接続を表示
netstat -at
- プログラム情報付きでリスニングポートを表示
sudo netstat -tulnp
この組み合わせは特によく使用されます:
-t
: TCP接続-u
: UDP接続-l
: リスニングポートのみ-n
: 数値アドレス-p
: プログラム情報
- ルーティングテーブルを確認
netstat -r
- インターフェース統計情報を表示
netstat -i
出力の理解
典型的なnetstat
出力には、以下のような列が含まれます:
- Proto: プロトコル(TCP, UDP)
- Recv-Q: 受信キューにあるデータ
- Send-Q: 送信キューにあるデータ
- Local Address: 接続のローカルエンドポイント
- Foreign Address: 接続のリモートエンドポイント
- State: 接続の状態(LISTEN, ESTABLISHED など)
netstat -tan
コマンドの出力例:
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 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 192.168.1.5:22 192.168.1.100:52614 ESTABLISHED
表示オプション
すべての接続をリスト表示
- すべてのプロトコルを数値アドレスで表示
netstat -an
- 拡張情報を表示
netstat -ae
- タイマー情報を表示
netstat -o
プロトコル別表示
- TCPのみ
# すべてのTCP接続を表示(リスニングポートを含む)
netstat -at
# リスニング中のTCPポートのみを表示
netstat -lt
- UDPのみ
# すべてのUDP接続を表示
netstat -au
# リスニング中のUDPポートのみを表示
netstat -lu
- Unixドメインソケット
# Unixドメインソケットを表示
netstat -x
出力フォーマットオプション
数値での表示
# 完全な数値出力(名前解決なし)
netstat -n
# 他のオプションと組み合わせ
netstat -ant # TCP接続を数値アドレスで表示
数値表示の利点:
- 実行速度が速い
- DNSルックアップなし
- DNS関連の問題が発生しても信頼性が高い
拡張情報の表示
# プロセス情報を表示
sudo netstat -p
# ユーザーとプロセス情報を表示
sudo netstat -ep
# ネットワークインターフェースの統計情報を拡張表示
netstat -ie
連続的な表示
# 2秒ごとに更新
netstat -c
# 他のオプションと組み合わせて連続監視
netstat -ct # TCP接続の連続監視
統計情報の表示
- プロトコル統計
# すべてのプロトコルの要約統計を表示
netstat -s
# TCP統計のみを表示
netstat -st
# UDP統計のみを表示
netstat -su
- インターフェース統計
# インターフェースの統計を表示
netstat -i
# 拡張インターフェース情報を表示
netstat -ie
インターフェース統計の出力例:
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 158426 0 0 0 88573 0 0 0 BMRU
lo 65536 24846 0 0 0 24846 0 0 0 LRU
項目の説明:
- RX: 受信統計
- TX: 送信統計
- OK: 正常に処理されたパケット数
- ERR: エラーの数
- DRP: ドロップされたパケット
- OVR: オーバーランイベント
一般的なユースケース
ネットワークトラブルシューティング
開いているポートの確認
- システム上のすべてのオープンポートを確認
sudo netstat -tulpn | grep LISTEN
このコマンドで以下を特定可能:
- 実行中のサービス
- 使用中のポート
- ポートを所有するプロセス
- 特定のポートが使用中か確認
sudo netstat -tulpn | grep ":80" # Webサーバーを確認
sudo netstat -tulpn | grep ":3306" # MySQLを確認
アクティブな接続の特定
- 現在の接続を監視
# 確立されたすべての接続を表示
netstat -nat | grep ESTABLISHED
# IPアドレスごとの接続数をカウント
netstat -nat | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c
- 接続状態の追跡
# 接続状態の分布を確認
netstat -ant | awk '{print $6}' | sort | uniq -c
ネットワークトラフィックの監視
- インターフェースのトラフィック分析
# インターフェース統計をリアルタイムで監視
netstat -i
watch -n 1 "netstat -i"
- プロトコル別の監視
# TCPトラフィック統計を監視
netstat -st
# UDPトラフィック統計を監視
netstat -su
セキュリティ分析
不審な接続の特定
- 不審なポートを検出
# 非標準ポートのリスニング状況を一覧表示
sudo netstat -tulpn | grep -v ":22\|:80\|:443"
- 不審な接続パターンを確認
# 想定外のIPアドレスからの接続を確認
netstat -ant | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn
ポートスキャン検出
# 複数回の接続試行を確認
netstat -ant | grep SYN_RECV | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
システム監査
- サービスの検証
# 各プロセスがどのポートでリスニングしているか確認
sudo netstat -tulpn | grep LISTEN | sort -k 4
- 接続のログ作成
# 簡易接続ログの作成
while true; do
date >> connection_log.txt
netstat -ant >> connection_log.txt
sleep 60
done
- リソース使用状況の監視
# サービスごとの接続数を監視
netstat -ant | grep ESTABLISHED | awk '{print $4}' | cut -d: -f2 | sort | uniq -c
よくあるトラブルシューティングのシナリオ
- Webサーバーの問題
# Webサーバー接続を確認
sudo netstat -ant | grep ":80\|:443" | awk '{print $6}' | sort | uniq -c
- データベース接続の問題
# データベース接続を監視(MySQLの例)
sudo netstat -ant | grep :3306 | awk '{print $6}' | sort | uniq -c
- メールサーバーの分析
# メールサーバー接続を確認
sudo netstat -ant | grep ":25\|:465\|:587" | awk '{print $6}' | sort | uniq -c
高度な使い方
他のコマンドとの組み合わせ
grep と awk を使用
- 複雑なフィルタリングと分析
# 状態とポートごとの接続数をカウント
netstat -ant | awk '{print $6, $4}' | sort | uniq -c | sort -rn
# 特定サービスの接続をリアルタイムで監視
watch -n 1 'netstat -ant | grep ":80" | wc -l'
- 高度な接続分析
# 接続サマリーを作成
netstat -ant | \
awk '{ip[$5]++} END {for (i in ip) print ip[i],i}' | \
sort -nr | head -n 10
他ツールへのパイプ処理
# tee を使用したログ出力
netstat -ant | tee network_status.log
# xargs を使用したプロセス管理
netstat -tulpn | grep LISTEN | awk '{print $7}' | cut -d/ -f1 | xargs ps -f
スクリプトと自動化
基本的な監視スクリプト
#!/bin/bash
LOG_FILE="/var/log/network_monitor.log"
monitor_connections() {
echo "=== ネットワーク状態レポート ===" >> $LOG_FILE
date >> $LOG_FILE
echo "アクティブ接続数:" >> $LOG_FILE
netstat -ant | grep ESTABLISHED | wc -l >> $LOG_FILE
echo "リスニングポート:" >> $LOG_FILE
netstat -tulpn | grep LISTEN >> $LOG_FILE
echo "=========================" >> $LOG_FILE
}
# 5分ごとに実行
while true; do
monitor_connections
sleep 300
done
高度な分析スクリプト
#!/bin/bash
analyze_network() {
echo "=== ネットワーク分析 ==="
echo -e "\n接続数トップ10のIPアドレス:"
netstat -ant | grep ESTABLISHED | \
awk '{print $5}' | cut -d: -f1 | \
sort | uniq -c | sort -rn | head -n 10
echo -e "\n接続状態の概要:"
netstat -ant | awk '{print $6}' | \
sort | uniq -c | sort -rn
echo -e "\nポート使用状況:"
netstat -ant | awk '{print $4}' | \
cut -d: -f2 | sort | uniq -c | sort -rn | head -n 10
}
# タイムスタンプ付きでファイルに保存
analyze_network | tee -a "network_analysis_$(date +%Y%m%d_%H%M%S).log"
### パフォーマンスモニタリング
#### リソース使用状況の追跡
1. **CPUとメモリの影響**
```bash
# netstatのリソース使用状況を監視
while true; do
ps aux | grep netstat | grep -v grep
sleep 1
done
- ネットワークインターフェースのパフォーマンス
#!/bin/bash
# インターフェースのスループットを監視
INTERVAL=1
INTERFACE="eth0"
while true; do
R1=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
T1=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes)
sleep $INTERVAL
R2=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
T2=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes)
RBPS=$(( ($R2 - $R1) / $INTERVAL ))
TBPS=$(( ($T2 - $T1) / $INTERVAL ))
echo "インターフェース $INTERFACE:"
echo "受信: $(($RBPS/1024)) KB/s"
echo "送信: $(($TBPS/1024)) KB/s"
echo "------------------------"
done
長期モニタリングソリューション
#!/bin/bash
# 毎時ネットワーク統計レポートを生成
LOGDIR="/var/log/netstat_reports"
mkdir -p $LOGDIR
generate_report() {
TIMESTAMP=$(date +%Y%m%d_%H)
REPORT="$LOGDIR/netstat_report_$TIMESTAMP.log"
echo "ネットワークレポート - $(date)" > $REPORT
echo "=========================" >> $REPORT
echo "接続の概要:" >> $REPORT
netstat -s >> $REPORT
echo "インターフェース統計:" >> $REPORT
netstat -i >> $REPORT
echo "現在の接続:" >> $REPORT
netstat -ant >> $REPORT
}
# レポート生成を実行
generate_report
統合のヒント
- システムモニタリングと組み合わせる
# システムモニタリングスクリプトに追加
if [ $(netstat -ant | grep ESTABLISHED | wc -l) -gt 100 ]; then
echo "接続数が高い状態を検出" | mail -s "ネットワーク警告" [email protected]
fi
- カスタムレポート機能
network_summary() {
local port="$1"
echo "ポート $port 上の接続:"
netstat -ant | grep ":$port" | awk '{print $6}' | sort | uniq -c
}
# 使用例: network_summary 80
netstat の代替ツール
ss コマンド
ss
(Socket Statistics) は、Linuxシステムにおけるnetstatのモダンな代替ツールです。一般的にnetstatより高速で、多機能です。
ss の主な利点
- 多数の接続があるシステムでも高速
- 詳細なソケット情報を提供
- 新しいプロトコルへの対応が優れている
- システムリソースの使用が少ない
netstat との比較
# netstat コマンド vs ss の同等コマンド
# すべての接続を表示
netstat -a
ss
# リスニングTCPポートを表示
netstat -tln
ss -tln
# プロセス情報を表示
netstat -p
ss -p
# 統計を表示
netstat -s
ss -s
ss の使用例
# 詳細なソケット情報を表示
ss -i
# タイマー情報を表示
ss -o
# メモリ使用量を表示
ss -m
# 状態でフィルタリング
ss state established
# ポートでフィルタリング
ss sport = :80
モダンな代替ツール
lsof (List Open Files)
# ネットワーク接続を表示
lsof -i
# リスニングポートを表示
lsof -i -P -n | grep LISTEN
# 確立された接続を表示
lsof -i | grep ESTABLISHED
nmap
# 開いているポートをスキャン
nmap localhost
# 詳細なポートスキャン
nmap -sV localhost
iptraf-ng
- リアルタイムのIPトラフィックモニタリング
- 詳細なプロトコル統計
- インターフェース統計
- LANステーションモニター
適切なツールの選び方
netstat を使う場合:
- 古いシステムで作業する
- クロスプラットフォームの互換性が必要
- 既存のドキュメントに従う
- シンプルなネットワーク診断を実行する
ss を使う場合:
- モダンなLinuxシステムで作業する
- 高速な実行が必要
- 多数の接続を処理する
- 詳細なソケット情報が必要
lsof を使う場合:
- ファイルディスクリプタ情報を確認したい
- ネットワーク接続とプロセスを関連付ける
- アプリケーションの問題をトラブルシュートする
nmap を使う場合:
- セキュリティ監査を実行する
- 詳細なポートスキャンが必要
- ネットワークサービスを分析する
移行ガイド
netstat から ss への移行
netstat コマンド | ss コマンド | 説明 |
---|---|---|
netstat -t | ss -t | TCP接続を表示 |
netstat -u | ss -u | UDP接続を表示 |
netstat -l | ss -l | リスニングソケットを表示 |
netstat -p | ss -p | プロセス情報を表示 |
netstat -n | ss -n | 名前解決を無効化 |
netstat -a | ss | すべてのソケットを表示 |
netstat -r | ip route | ルーティングテーブルを表示 |
スクリプト移行の例
# 旧netstatスクリプト
#!/bin/bash
netstat -tulpn | grep LISTEN > listening_ports.log
# 新しいss相当スクリプト
#!/bin/bash
ss -tulpn | grep LISTEN > listening_ports.log
ツール選択のヒント
- パフォーマンスの考慮
- 大規模システムの場合:
ss
を使用 - 基本的な確認の場合: どちらでも可
- 詳細分析の場合: 複数ツールを組み合わせる
- 互換性の問題
# ss が利用可能かを確認
if command -v ss >/dev/null 2>&1; then
ss -tulpn
else
netstat -tulpn
fi
- 必要な機能に基づいて選択
- 基本的なモニタリング:
netstat
またはss
- セキュリティ分析:
nmap
- プロセス関連付け:
lsof
- リアルタイムモニタリング:
iptraf-ng
ベストプラクティスとヒント
パフォーマンスの考慮
コマンド使用の最適化
- 数値出力を使用
# 遅い (DNS解決あり)
netstat -ta
# 高速 (DNS解決なし)
netstat -tan
- 出力サイズを制限
# すべての接続を表示する代わりに
netstat -a
# 特定の情報をフィルタリング
netstat -an | grep ':80'
- 継続的なポーリングを避ける
# ビジーシステムには非推奨
netstat -c
# より良いアプローチ: 制御された間隔で実行
while true; do
netstat -an | grep ESTABLISHED
sleep 5
done
よくある落とし穴
リソース使用の問題
- 問題: 名前解決中のCPU負荷が高い
# 問題のあるコマンド
watch -n 1 'netstat -ta'
# より良い代替案
watch -n 1 'netstat -tan'
権限の問題
- 問題: プロセス情報が不足
# 情報が不完全になる
netstat -p
# 正しい使用方法
sudo netstat -p
出力の解釈
- 問題: 接続状態の誤解
# TIME_WAITの誤解を防ぐ
netstat -ant | grep TIME_WAIT
# 状態ごとの詳細な分析
netstat -ant | awk '{print $6}' | sort | uniq -c
日常使用のヒント
便利なエイリアスの作成
# ~/.bashrc に追加
alias ns='netstat -tulpn'
alias nsc='netstat -ant | grep ESTABLISHED'
alias nsl='sudo netstat -tulpn | grep LISTEN'
クイックセキュリティチェック
# 異常なリスニングポートを確認
check_ports() {
echo "既知のポート:"
sudo netstat -tulpn | grep -E ':22|:80|:443'
echo -e "\n不明なポート:"
sudo netstat -tulpn | grep -vE ':22|:80|:443'
}
モニタリングテンプレート
# 接続モニタリングテンプレート
monitor_connections() {
local port=$1
local threshold=$2
count=$(netstat -an | grep ":$port" | grep ESTABLISHED | wc -l)
if [ $count -gt $threshold ]; then
echo "警告: ポート$portの接続数$countがしきい値$thresholdを超えました"
fi
}
# 使用例: monitor_connections 80 100
ドキュメントとログ作成
有用なログの作成
#!/bin/bash
# ネットワークステータスロガー
log_network_status() {
local logfile="/var/log/network_status.log"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
{
echo "=== $timestamp 時点のネットワークステータス ==="
echo "リスニングポート:"
netstat -tulpn | grep LISTEN
echo "現在の接続状況:"
netstat -ant | awk '{print $6}' | sort | uniq -c
echo "=================================="
} >> "$logfile"
}
標準運用手順
# 定期チェックテンプレート
daily_network_check() {
echo "1. リスニングポートの確認..."
sudo netstat -tulpn | grep LISTEN
echo "2. 確立された接続の確認..."
netstat -ant | grep ESTABLISHED | wc -l
echo "3. 接続状態の確認..."
netstat -ant | awk '{print $6}' | sort | uniq -c
echo "4. インターフェース統計の確認..."
netstat -i
}
トラブルシューティングガイドライン
- 接続問題
connection_troubleshoot() {
local port=$1
echo "=== ポート$port の接続トラブルシューティング ==="
echo "1. ポートがリスニングしているか確認:"
sudo netstat -tulpn | grep ":$port"
echo "2. アクティブな接続の確認:"
netstat -ant | grep ":$port" | awk '{print $6}' | sort | uniq -c
echo "3. 接続状態の確認:"
netstat -ant | grep ":$port" | awk '{print $6}' | sort | uniq -c
}
- システムリソースモニタリング
resource_check() {
echo "=== システムリソースチェック ==="
echo "1. 総接続数:"
netstat -ant | wc -l
echo "2. IPアドレスごとの接続数:"
netstat -ant | grep ESTABLISHED | \
awk '{print $5}' | cut -d: -f1 | \
sort | uniq -c | sort -nr | head -5
echo "3. ネットワークプロセスのメモリ使用量:"
ps aux | grep -E 'netstat|ss' | grep -v grep
}
よくある質問 (FAQ)
Q: プロセス情報 (PID) が表示されないのはなぜですか?
A: 通常は権限の問題です。コマンドを sudo で実行してください:
sudo netstat -tulpn
-p オプションはプロセス情報を表示するためにルート権限が必要です。
Q: LISTEN と ESTABLISHED の状態の違いは何ですか?
A:
- LISTEN: サービスがポートで接続を待機していることを示します
- ESTABLISHED: アクティブで現在接続中のセッションを表します
Q: 特定のポートの接続を確認するにはどうすればよいですか?
A: grep を使ってポート固有の接続をフィルタリングできます:
# ポート80のすべての接続を確認
netstat -an | grep ":80"
# リスニングポートのみ確認
netstat -tunl | grep ":80"
Q: netstat コマンドが遅いのはなぜですか?
A: 主な原因は次の2つです:
1. DNS解決 - 名前解決を避けるには -n オプションを使用
2. 接続数が多すぎる - フィルタリングを使用するか、ss に切り替える
# 高速なコマンド例
netstat -tan | grep ESTABLISHED
Q: netstat はシステム性能に影響しますか?
A: 頻繁なポーリングは性能に影響を与える可能性があります。ベストプラクティス:
1. ポーリング間隔を増やす
2. 出力をフィルタリングして削減
3. 大規模システムでは ss を検討
4. 忙しいシステムでは連続モード (-c) を避ける
Q: 特定のポートを使用しているアプリケーションを特定するには?
A: 次のコマンドを使用してください:
# ポート80を使用しているプロセスを表示
sudo netstat -tulpn | grep ":80"
# lsof を使った代替方法
sudo lsof -i :80
Q: 接続状態を監視するにはどうすればよいですか?
A: 以下の方法があります:
# 状態ごとの接続数をカウント
netstat -ant | awk '{print $6}' | sort | uniq -c
# 確立された接続をリアルタイムで監視
watch -n 1 'netstat -ant | grep ESTABLISHED | wc -l'
Q: 不審な接続を確認するにはどうすればよいですか?
A: 以下を確認してください:
1. 異常なポート:
netstat -tulpn | grep -vE ':22|:80|:443'
2. 単一のIPからの接続数が多い場合:
netstat -ant | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
Q: ポートスキャンの試みを検出する方法は?
A: SYN_RECV接続を監視します:
netstat -ant | grep SYN_RECV | awk '{print $5}' | cut -d: -f1 | sort | uniq -c
### Q: `-t` オプションと `-u` オプションの違いは何ですか?
```bash
A:
-t : TCP接続のみを表示
-u : UDP接続のみを表示
これらを組み合わせることも可能:
netstat -tu : TCPとUDPの両方を表示
Q: netstatの出力をファイルに保存する方法は?
A: 以下の方法を試してください:
# 基本的な出力をファイルに保存
netstat -ant > network_status.log
# タイムスタンプを含めて保存
(date; netstat -ant) > network_status.log
# 継続的なログ記録
while true; do
netstat -ant >> network_log.txt
sleep 300
done
Q: netstatの出力に「Address already in use」と表示されるのはなぜですか?
A: これは、ポートが別のプロセスによって使用されていることを示します。確認するには以下を実行してください:
sudo netstat -tulpn | grep "<port_number>"
Q: TIME_WAIT接続が多いのはなぜですか?
A: TIME_WAITは、接続終了後に通常発生します。しかし、多すぎる場合は次の原因が考えられます:
1. 接続の回転率が高い
2. ネットワークの問題
3. アプリケーションが接続を再利用していない
監視方法:
netstat -ant | grep TIME_WAIT | wc -l