<p><!--META
{
"title": "netstat/ssコマンドによるネットワーク診断",
"primary_category": "DevOps",
"secondary_categories": ["ネットワーク診断", "Linux"],
"tags": ["netstat", "ss", "bash", "jq", "curl", "systemd", "ネットワークトラブルシューティング"],
"summary": "netstat/ssコマンドを使ったネットワーク診断の手順を、安全なbashスクリプト、jq/curlの活用、systemdによる自動化を含め解説します。",
"mermaid": true,
"verify_level": "L0",
"tweet_hint": {"text":"DevOpsエンジニアのためのnetstat/ssコマンドによるネットワーク診断。安全なbash、jq/curl、systemd連携を網羅した詳細ガイドです。#DevOps #ネットワーク診断 #Linux", "hashtags":["#DevOps","#Linux"]},
"link_hints": ["https://man7.org/linux/man-pages/man8/netstat.8.html", "https://man7.org/linux/man-pages/man8/ss.8.html"]
}
-->
本記事は<strong>Geminiの出力をプロンプト工学で整理した業務ドラフト(未検証)</strong>です。</p>
<h1 class="wp-block-heading">netstat/ssコマンドによるネットワーク診断</h1>
<p>DevOpsエンジニアとして、アプリケーションのパフォーマンス問題や接続障害が発生した際、迅速なネットワーク診断は不可欠です。本稿では、Linuxにおける<code>netstat</code>および<code>ss</code>コマンドを用いた診断手法を、安全なBashスクリプト、<code>jq</code>、<code>curl</code>、そして<code>systemd</code>による自動化と組み合わせて解説します。</p>
<h2 class="wp-block-heading">要件と前提</h2>
<h3 class="wp-block-heading">要件</h3>
<ul class="wp-block-list">
<li><p><code>netstat</code>/<code>ss</code>コマンドによるネットワーク接続状態の確認とトラブルシューティング。</p></li>
<li><p><code>bash</code>スクリプトは<code>set -euo pipefail</code>、<code>trap</code>、安全な一時ディレクトリ (<code>mktemp -d</code>) を用いた<strong>idempotent</strong>かつ<strong>安全な書き方</strong>を遵守。</p></li>
<li><p><code>jq</code>によるJSON処理、<code>curl</code>によるTLS/再試行/バックオフの例示。</p></li>
<li><p><code>systemd unit/timer</code>による診断の自動化。</p></li>
<li><p><code>mermaid</code>フローチャートによる診断プロセスの可視化。</p></li>
<li><p>root権限の扱いと権限分離への言及。</p></li>
</ul>
<h3 class="wp-block-heading">前提</h3>
<ul class="wp-block-list">
<li><p>Linux環境(Ubuntu/CentOSなど)が利用可能であること。</p></li>
<li><p><code>bash</code>、<code>ss</code>(iproute2パッケージに含まれる)、<code>jq</code>、<code>curl</code>、<code>systemd</code>がインストール済みであること。</p></li>
</ul>
<h2 class="wp-block-heading">実装</h2>
<h3 class="wp-block-heading">ネットワーク診断スクリプト (<code>diagnose_network.sh</code>)</h3>
<p>以下のスクリプトは、<code>ss</code>コマンドでネットワーク接続情報を取得し、<code>curl</code>で特定のAPIエンドポイントへの疎通確認を行います。取得したJSONデータは<code>jq</code>で処理されます。</p>
<div class="codehilite">
<pre data-enlighter-language="generic">#!/usr/bin/env bash
set -euo pipefail
# 安全な一時ディレクトリの作成と自動クリーンアップ
readonly TMPDIR=$(mktemp -d -t network-diag-XXXXXX)
function cleanup {
echo "--- INFO: Cleaning up temporary directory ${TMPDIR} ---"
rm -rf "${TMPDIR}"
}
trap cleanup EXIT # スクリプト終了時にcleanup関数を実行
echo "--- $(date '+%Y-%m-%d %H:%M:%S') --- ネットワーク接続診断開始 ---"
# 1. ssコマンドによるネットワーク接続状態の確認
# -t: TCPソケット, -u: UDPソケット, -n: ホスト名/ポート番号を解決しない, -a: 全てのソケットを表示, -p: プロセス情報を表示
# 注意: '-p' オプションは、通常root権限(またはCAP_NET_ADMIN)が必要です。
# 一般ユーザーで実行する場合は、'-p' を外すか、sudoersで適切な権限を付与してください。
echo "### TCP/UDPのLISTENおよびESTABLISHED状態の接続を表示 (プロセス情報付き、要root権限の場合あり) ###"
if ss -tunap > "${TMPDIR}/ss_output.txt" 2>&1; then
cat "${TMPDIR}/ss_output.txt"
echo
echo "--- 特定ポート(例: 22 SSH)の接続状況 ---"
if grep -E ':(22|ssh)' "${TMPDIR}/ss_output.txt" | head -n 1 >/dev/null; then
grep -E ':(22|ssh)' "${TMPDIR}/ss_output.txt"
else
echo "ポート 22 (SSH) の接続は見つかりませんでした。"
fi
else
echo "ERROR: ssコマンドの実行に失敗しました。権限やインストール状況を確認してください。" >&2
cat "${TMPDIR}/ss_output.txt" >&2 # ssのエラー出力を表示
exit 1
fi
echo
# 2. curlコマンドによるAPI疎通確認 (TLS/再試行/バックオフ)
readonly API_ENDPOINT="https://jsonplaceholder.typicode.com/todos/1" # テスト用公開API
readonly MAX_RETRIES=3
readonly RETRY_DELAY=5 # 秒
readonly TOTAL_RETRY_TIME=$((MAX_RETRIES * RETRY_DELAY * 2)) # 最大リトライ時間
echo "### API疎通確認: ${API_ENDPOINT} (最大${MAX_RETRIES}回リトライ) ###"
if curl -sS --fail-with-body \
--retry "${MAX_RETRIES}" \
--retry-delay "${RETRY_DELAY}" \
--retry-max-time "${TOTAL_RETRY_TIME}" \
--output "${TMPDIR}/api_response.json" \
"${API_ENDPOINT}"; then
echo "API接続成功。"
# 3. jqによるJSONデータの処理
echo "--- 取得したJSONデータの一部をjqで処理 ---"
if jq '.title' "${TMPDIR}/api_response.json" > /dev/stdout; then
echo "JSON処理成功。"
else
echo "ERROR: jqによるJSON処理に失敗しました。" >&2
cat "${TMPDIR}/api_response.json" >&2 # 取得したJSONを表示
exit 1
fi
else
echo "ERROR: API接続に失敗しました: ${API_ENDPOINT}" >&2
if [[ -f "${TMPDIR}/api_response.json" ]]; then
echo "--- エラーレスポンス ---" >&2
cat "${TMPDIR}/api_response.json" >&2
fi
exit 1
fi
echo "--- ネットワーク接続診断完了 ---"
exit 0
</pre>
</div>
<h3 class="wp-block-heading">root権限の扱いと権限分離</h3>
<ul class="wp-block-list">
<li><p><strong><code>ss -p</code>オプション</strong>: プロセスID (PID) やプロセス名を詳細に表示するには、通常<code>root</code>権限が必要です。一般ユーザーで実行すると情報が制限されるか、エラーになる場合があります。</p></li>
<li><p><strong>最小権限の原則</strong>: 診断スクリプトは、必要な情報に応じて<code>sudo</code>を使用するか、<code>CAP_NET_ADMIN</code>などのLinux Capabilitiesをプロセスに付与することを検討してください。</p></li>
<li><p><strong><code>systemd</code>の<code>User</code>/<code>Group</code></strong>: 後述の<code>systemd</code>ユニットでは<code>User=</code>および<code>Group=</code>オプションで実行ユーザーを指定し、不必要な<code>root</code>権限での実行を避けることができます。この場合、<code>ss -p</code>のような特権操作はできません。</p></li>
</ul>
<h2 class="wp-block-heading">検証</h2>
<p>上記スクリプトを<code>diagnose_network.sh</code>として保存し、実行権限を与えます。</p>
<div class="codehilite">
<pre data-enlighter-language="generic">chmod +x diagnose_network.sh
# root権限が必要なss -pを含む場合
sudo ./diagnose_network.sh
# 一般ユーザーで実行する場合 (ss -pの情報は制限されるか表示されない)
./diagnose_network.sh
</pre>
</div>
<ul class="wp-block-list">
<li><p><strong><code>ss</code>コマンドの出力</strong>: LISTEN、ESTABLISHED、TIME_WAITなどの状態や、ローカル/リモートのアドレス・ポート、およびプロセス情報(root権限時)が正しく表示されることを確認します。</p></li>
<li><p><strong><code>curl</code>の出力</strong>: API接続が成功し、HTTPステータスコード200が返されること、およびリトライメカニズムが機能すること(ネットワーク一時障害を模擬するなど)を確認します。</p></li>
<li><p><strong><code>jq</code>の出力</strong>: 取得したJSONデータから<code>.title</code>フィールドが正しく抽出されることを確認します。</p></li>
</ul>
<h2 class="wp-block-heading">運用</h2>
<h3 class="wp-block-heading">systemdによる自動化</h3>
<p>診断スクリプトを定期的に実行し、ログを収集するために<code>systemd</code>の<code>service</code>と<code>timer</code>ユニットを定義します。</p>
<p><strong>1. スクリプトの配置</strong></p>
<p>スクリプトを<code>/usr/local/bin/diagnose_network.sh</code>に配置します。
(ここでは<code>ss -p</code>は一般ユーザーでは機能しないことを前提に、権限分離を優先し<code>User=someuser</code>を設定します。必要であればスクリプトから<code>-p</code>オプションを削除してください。)</p>
<div class="codehilite">
<pre data-enlighter-language="generic">sudo install -m 755 diagnose_network.sh /usr/local/bin/
</pre>
</div>
<p><strong>2. systemd serviceユニットの作成 (<code>/etc/systemd/system/network-diag.service</code>)</strong></p>
<div class="codehilite">
<pre data-enlighter-language="generic">[Unit]
Description=Automated Network Connection Diagnostic
Documentation=https://example.com/network-diag-service
After=network.target
[Service]
Type=oneshot
# 診断スクリプトを特定の一般ユーザー/グループで実行
# 必要に応じて、専用ユーザー (例: networkdiag) を作成し、ここに指定
User=nobody
Group=nogroup
ExecStart=/usr/local/bin/diagnose_network.sh
# StandardOutput, StandardError はデフォルトでjournaldに送られる
StandardOutput=journal
StandardError=journal
# 失敗時にアラートなど、後続の処理を追加可能 (例: OnFailure=alert-script.service)
[Install]
WantedBy=multi-user.target
</pre>
</div>
<p><strong>3. systemd timerユニットの作成 (<code>/etc/systemd/system/network-diag.timer</code>)</strong></p>
<div class="codehilite">
<pre data-enlighter-language="generic">[Unit]
Description=Run network connection diagnostic every 5 minutes
[Timer]
# システム起動後1分後に最初の実行
OnBootSec=1min
# サービスがアクティブになった5分後に再度実行 (定期的実行)
OnUnitActiveSec=5min
# 同時実行を避けるためのランダムな遅延
RandomSec=30s
[Install]
WantedBy=timers.target
</pre>
</div>
<p><strong>4. systemdユニットの有効化と起動</strong></p>
<div class="codehilite">
<pre data-enlighter-language="generic">sudo systemctl daemon-reload
sudo systemctl enable --now network-diag.timer
</pre>
</div>
<p><strong>5. ログの確認</strong></p>
<div class="codehilite">
<pre data-enlighter-language="generic">systemctl status network-diag.timer
systemctl status network-diag.service
journalctl -u network-diag.service --no-pager
</pre>
</div>
<h2 class="wp-block-heading">トラブルシュート</h2>
<figure class="wp-block-table"><table>
<thead>
<tr>
<th style="text-align:left;">問題点</th>
<th style="text-align:left;">診断方法</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left;"><strong>接続が見えない</strong></td>
<td style="text-align:left;">– <strong><code>ss -tunap</code></strong>: プロセスが表示されない場合、サービスが停止しているか、異なるユーザーで実行されている可能性がある。 <code>-l</code>でLISTENポートも確認。<br/> – <strong>ファイアウォール</strong>: <code>sudo iptables -L</code>や<code>sudo ufw status</code>でブロックされていないか確認。<br/> – <strong>ルーティング</strong>: <code>ip r</code>でルーティングテーブルを確認。</td>
</tr>
<tr>
<td style="text-align:left;"><strong><code>TIME_WAIT</code>が多い</strong></td>
<td style="text-align:left;">サーバー側で大量のCLOSE_WAIT接続がある場合、アプリケーションがソケットを適切に閉じずに放置している可能性がある。クライアント側でTIME_WAITが多いのは正常な挙動。</td>
</tr>
<tr>
<td style="text-align:left;"><strong><code>CLOSE_WAIT</code>が多い</strong></td>
<td style="text-align:left;">サーバー側でアプリケーションがソケットのクローズを処理していない可能性。アプリケーションログを確認し、リソースリークやデッドロックを疑う。</td>
</tr>
<tr>
<td style="text-align:left;"><strong><code>curl</code>が失敗する</strong></td>
<td style="text-align:left;">– <strong>HTTPステータスコード</strong>: <code>--fail-with-body</code>でエラーレスポンスを確認。HTTP 4xx/5xxはアプリケーション側の問題、ネットワークの問題は<code>curl</code>のエラーコードで。 <br/> – <strong><code>curl</code>エラーコード</strong>: <code>man curl-errors</code>で詳細を確認。例:<code>6</code> (Couldn’t resolve host), <code>7</code> (Couldn’t connect to host), <code>35</code> (SSL connect error)。<br/> – <strong>TLS/SSL</strong>: <code>--verbose</code> (<code>-v</code>) オプションで詳細なTLSハンドシェイクのログを確認。証明書の問題 (<code>--cacert</code>, <code>--insecure</code>) も考慮する。</td>
</tr>
<tr>
<td style="text-align:left;"><strong><code>systemd</code>が動かない</strong></td>
<td style="text-align:left;">– <strong><code>systemctl status <unit></code></strong>: サービスの状態とエラーメッセージを確認。<br/> – <strong><code>journalctl -u <unit></code></strong>: サービスの詳細なログを確認。<br/> – <strong>スクリプトの実行権限</strong>: <code>ExecStart</code>で指定されたスクリプトに実行権限があるか確認 (<code>chmod +x</code>)。<br/> – <strong><code>User</code>/<code>Group</code></strong>: 指定したユーザーが存在し、スクリプト実行に必要な権限を持っているか確認。</td>
</tr>
</tbody>
</table></figure>
<h2 class="wp-block-heading">ネットワーク診断フロー</h2>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">
graph TD
A["システム/アプリ異常検知"] --> B{"定期監視 (systemd Timer) 発火?"};
B --|はい| C["診断Service実行"];
B --|いいえ| D["手動診断開始"];
C --> E["診断スクリプト実行"];
D --> E;
E --> F["ssコマンド実行"];
F --> G["curlコマンド実行"];
G --> H["jqで結果解析"];
H --|エラー検出?| I{"はい"};
H --|エラー検出?| J{"いいえ"};
I --> K["診断結果ログ出力"];
K --> L["アラート発報"];
L --> M["担当者による詳細調査"];
J --> K;
K --> N["次サイクル待機"];
M --> O["問題解決/サービス復旧"];
O --> N;
</pre></div>
<h2 class="wp-block-heading">まとめ</h2>
<p><code>netstat</code>とその後継である<code>ss</code>コマンドは、Linuxシステムにおけるネットワーク診断の基礎ツールです。特に<code>ss</code>は高速かつ詳細な情報を提供します。本稿では、これらのコマンドを核に、安全なBashスクリプトの書き方、<code>jq</code>によるデータ解析、<code>curl</code>による外部サービス疎通確認、そして<code>systemd</code>を用いた自動監視の仕組みをDevOpsエンジニアの視点から解説しました。これらの技術を組み合わせることで、システムのネットワーク状態を常に把握し、問題発生時の迅速なトラブルシューティングと安定したサービス運用に貢献できます。権限分離と最小権限の原則を忘れずに、セキュアな運用を心がけましょう。</p>
本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証) です。
netstat/ssコマンドによるネットワーク診断
DevOpsエンジニアとして、アプリケーションのパフォーマンス問題や接続障害が発生した際、迅速なネットワーク診断は不可欠です。本稿では、Linuxにおけるnetstat
およびss
コマンドを用いた診断手法を、安全なBashスクリプト、jq
、curl
、そしてsystemd
による自動化と組み合わせて解説します。
要件と前提
要件
netstat
/ss
コマンドによるネットワーク接続状態の確認とトラブルシューティング。
bash
スクリプトはset -euo pipefail
、trap
、安全な一時ディレクトリ (mktemp -d
) を用いたidempotent かつ安全な書き方 を遵守。
jq
によるJSON処理、curl
によるTLS/再試行/バックオフの例示。
systemd unit/timer
による診断の自動化。
mermaid
フローチャートによる診断プロセスの可視化。
root権限の扱いと権限分離への言及。
前提
実装
ネットワーク診断スクリプト (diagnose_network.sh)
以下のスクリプトは、ss
コマンドでネットワーク接続情報を取得し、curl
で特定のAPIエンドポイントへの疎通確認を行います。取得したJSONデータはjq
で処理されます。
#!/usr/bin/env bash
set -euo pipefail
# 安全な一時ディレクトリの作成と自動クリーンアップ
readonly TMPDIR=$(mktemp -d -t network-diag-XXXXXX)
function cleanup {
echo "--- INFO: Cleaning up temporary directory ${TMPDIR} ---"
rm -rf "${TMPDIR}"
}
trap cleanup EXIT # スクリプト終了時にcleanup関数を実行
echo "--- $(date '+%Y-%m-%d %H:%M:%S') --- ネットワーク接続診断開始 ---"
# 1. ssコマンドによるネットワーク接続状態の確認
# -t: TCPソケット, -u: UDPソケット, -n: ホスト名/ポート番号を解決しない, -a: 全てのソケットを表示, -p: プロセス情報を表示
# 注意: '-p' オプションは、通常root権限(またはCAP_NET_ADMIN)が必要です。
# 一般ユーザーで実行する場合は、'-p' を外すか、sudoersで適切な権限を付与してください。
echo "### TCP/UDPのLISTENおよびESTABLISHED状態の接続を表示 (プロセス情報付き、要root権限の場合あり) ###"
if ss -tunap > "${TMPDIR}/ss_output.txt" 2>&1; then
cat "${TMPDIR}/ss_output.txt"
echo
echo "--- 特定ポート(例: 22 SSH)の接続状況 ---"
if grep -E ':(22|ssh)' "${TMPDIR}/ss_output.txt" | head -n 1 >/dev/null; then
grep -E ':(22|ssh)' "${TMPDIR}/ss_output.txt"
else
echo "ポート 22 (SSH) の接続は見つかりませんでした。"
fi
else
echo "ERROR: ssコマンドの実行に失敗しました。権限やインストール状況を確認してください。" >&2
cat "${TMPDIR}/ss_output.txt" >&2 # ssのエラー出力を表示
exit 1
fi
echo
# 2. curlコマンドによるAPI疎通確認 (TLS/再試行/バックオフ)
readonly API_ENDPOINT="https://jsonplaceholder.typicode.com/todos/1" # テスト用公開API
readonly MAX_RETRIES=3
readonly RETRY_DELAY=5 # 秒
readonly TOTAL_RETRY_TIME=$((MAX_RETRIES * RETRY_DELAY * 2)) # 最大リトライ時間
echo "### API疎通確認: ${API_ENDPOINT} (最大${MAX_RETRIES}回リトライ) ###"
if curl -sS --fail-with-body \
--retry "${MAX_RETRIES}" \
--retry-delay "${RETRY_DELAY}" \
--retry-max-time "${TOTAL_RETRY_TIME}" \
--output "${TMPDIR}/api_response.json" \
"${API_ENDPOINT}"; then
echo "API接続成功。"
# 3. jqによるJSONデータの処理
echo "--- 取得したJSONデータの一部をjqで処理 ---"
if jq '.title' "${TMPDIR}/api_response.json" > /dev/stdout; then
echo "JSON処理成功。"
else
echo "ERROR: jqによるJSON処理に失敗しました。" >&2
cat "${TMPDIR}/api_response.json" >&2 # 取得したJSONを表示
exit 1
fi
else
echo "ERROR: API接続に失敗しました: ${API_ENDPOINT}" >&2
if [[ -f "${TMPDIR}/api_response.json" ]]; then
echo "--- エラーレスポンス ---" >&2
cat "${TMPDIR}/api_response.json" >&2
fi
exit 1
fi
echo "--- ネットワーク接続診断完了 ---"
exit 0
root権限の扱いと権限分離
ss -p
オプション : プロセスID (PID) やプロセス名を詳細に表示するには、通常root
権限が必要です。一般ユーザーで実行すると情報が制限されるか、エラーになる場合があります。
最小権限の原則 : 診断スクリプトは、必要な情報に応じてsudo
を使用するか、CAP_NET_ADMIN
などのLinux Capabilitiesをプロセスに付与することを検討してください。
systemd
のUser
/Group
: 後述のsystemd
ユニットではUser=
およびGroup=
オプションで実行ユーザーを指定し、不必要なroot
権限での実行を避けることができます。この場合、ss -p
のような特権操作はできません。
検証
上記スクリプトをdiagnose_network.sh
として保存し、実行権限を与えます。
chmod +x diagnose_network.sh
# root権限が必要なss -pを含む場合
sudo ./diagnose_network.sh
# 一般ユーザーで実行する場合 (ss -pの情報は制限されるか表示されない)
./diagnose_network.sh
ss
コマンドの出力 : LISTEN、ESTABLISHED、TIME_WAITなどの状態や、ローカル/リモートのアドレス・ポート、およびプロセス情報(root権限時)が正しく表示されることを確認します。
curl
の出力 : API接続が成功し、HTTPステータスコード200が返されること、およびリトライメカニズムが機能すること(ネットワーク一時障害を模擬するなど)を確認します。
jq
の出力 : 取得したJSONデータから.title
フィールドが正しく抽出されることを確認します。
運用
systemdによる自動化
診断スクリプトを定期的に実行し、ログを収集するためにsystemd
のservice
とtimer
ユニットを定義します。
1. スクリプトの配置
スクリプトを/usr/local/bin/diagnose_network.sh
に配置します。
(ここではss -p
は一般ユーザーでは機能しないことを前提に、権限分離を優先しUser=someuser
を設定します。必要であればスクリプトから-p
オプションを削除してください。)
sudo install -m 755 diagnose_network.sh /usr/local/bin/
2. systemd serviceユニットの作成 (/etc/systemd/system/network-diag.service
)
[Unit]
Description=Automated Network Connection Diagnostic
Documentation=https://example.com/network-diag-service
After=network.target
[Service]
Type=oneshot
# 診断スクリプトを特定の一般ユーザー/グループで実行
# 必要に応じて、専用ユーザー (例: networkdiag) を作成し、ここに指定
User=nobody
Group=nogroup
ExecStart=/usr/local/bin/diagnose_network.sh
# StandardOutput, StandardError はデフォルトでjournaldに送られる
StandardOutput=journal
StandardError=journal
# 失敗時にアラートなど、後続の処理を追加可能 (例: OnFailure=alert-script.service)
[Install]
WantedBy=multi-user.target
3. systemd timerユニットの作成 (/etc/systemd/system/network-diag.timer
)
[Unit]
Description=Run network connection diagnostic every 5 minutes
[Timer]
# システム起動後1分後に最初の実行
OnBootSec=1min
# サービスがアクティブになった5分後に再度実行 (定期的実行)
OnUnitActiveSec=5min
# 同時実行を避けるためのランダムな遅延
RandomSec=30s
[Install]
WantedBy=timers.target
4. systemdユニットの有効化と起動
sudo systemctl daemon-reload
sudo systemctl enable --now network-diag.timer
5. ログの確認
systemctl status network-diag.timer
systemctl status network-diag.service
journalctl -u network-diag.service --no-pager
トラブルシュート
問題点
診断方法
接続が見えない
– ss -tunap
: プロセスが表示されない場合、サービスが停止しているか、異なるユーザーで実行されている可能性がある。 -l
でLISTENポートも確認。 – ファイアウォール : sudo iptables -L
やsudo ufw status
でブロックされていないか確認。 – ルーティング : ip r
でルーティングテーブルを確認。
TIME_WAIT
が多い
サーバー側で大量のCLOSE_WAIT接続がある場合、アプリケーションがソケットを適切に閉じずに放置している可能性がある。クライアント側でTIME_WAITが多いのは正常な挙動。
CLOSE_WAIT
が多い
サーバー側でアプリケーションがソケットのクローズを処理していない可能性。アプリケーションログを確認し、リソースリークやデッドロックを疑う。
curl
が失敗する
– HTTPステータスコード : --fail-with-body
でエラーレスポンスを確認。HTTP 4xx/5xxはアプリケーション側の問題、ネットワークの問題はcurl
のエラーコードで。 – curl
エラーコード : man curl-errors
で詳細を確認。例:6
(Couldn’t resolve host), 7
(Couldn’t connect to host), 35
(SSL connect error)。 – TLS/SSL : --verbose
(-v
) オプションで詳細なTLSハンドシェイクのログを確認。証明書の問題 (--cacert
, --insecure
) も考慮する。
systemd
が動かない
– systemctl status <unit>
: サービスの状態とエラーメッセージを確認。 – journalctl -u <unit>
: サービスの詳細なログを確認。 – スクリプトの実行権限 : ExecStart
で指定されたスクリプトに実行権限があるか確認 (chmod +x
)。 – User
/Group
: 指定したユーザーが存在し、スクリプト実行に必要な権限を持っているか確認。
ネットワーク診断フロー
graph TD
A["システム/アプリ異常検知"] --> B{"定期監視 (systemd Timer) 発火?"};
B --|はい| C["診断Service実行"];
B --|いいえ| D["手動診断開始"];
C --> E["診断スクリプト実行"];
D --> E;
E --> F["ssコマンド実行"];
F --> G["curlコマンド実行"];
G --> H["jqで結果解析"];
H --|エラー検出?| I{"はい"};
H --|エラー検出?| J{"いいえ"};
I --> K["診断結果ログ出力"];
K --> L["アラート発報"];
L --> M["担当者による詳細調査"];
J --> K;
K --> N["次サイクル待機"];
M --> O["問題解決/サービス復旧"];
O --> N;
まとめ
netstat
とその後継であるss
コマンドは、Linuxシステムにおけるネットワーク診断の基礎ツールです。特にss
は高速かつ詳細な情報を提供します。本稿では、これらのコマンドを核に、安全なBashスクリプトの書き方、jq
によるデータ解析、curl
による外部サービス疎通確認、そしてsystemd
を用いた自動監視の仕組みをDevOpsエンジニアの視点から解説しました。これらの技術を組み合わせることで、システムのネットワーク状態を常に把握し、問題発生時の迅速なトラブルシューティングと安定したサービス運用に貢献できます。権限分離と最小権限の原則を忘れずに、セキュアな運用を心がけましょう。
コメント