ネットワーク診断コマンド集 — 50+ コマンドを 6 カテゴリで
ネットワーク障害切り分けは「下のレイヤから上に登る」が定石です。 L1/L2 (物理・リンク) → L3 (IP / ICMP) → L4 (TCP/UDP) → L7 (HTTP / TLS / アプリ)。 上から「アプリが動かない」を訴えられても、まず ping 通るか・DNS 引けるか・ポート開いてるか・TLS が張れるかを順に潰していきます。
本記事では切り分けで使う代表的な 50+ コマンドを 6 カテゴリに整理し、最後に「実際の障害切り分けレシピ」を載せました。 AWS でも EC2 / ALB / API Gateway / CloudFront のトラブル時はだいたいこれらでケリがつきます。
動作環境: 一部コマンドは root 権限が必要です(
tcpdump, iptables, ss 一部)。
また Linux ディストリにより net-tools(古い: ifconfig/netstat)と iproute2(新: ip/ss)の両方が混在することがあります。
新環境では iproute2 系(ip / ss)を使うのが推奨。
目次
- 疎通確認 (ping / mtr / traceroute)
- DNS 確認 (dig / nslookup / host)
- ポート・接続確認 (ss / netstat / nc / lsof)
- HTTP / API 確認 (curl / wget / httpie)
- TLS 確認 (openssl / curl --cert)
- パケットキャプチャ・経路 (tcpdump / ip / iptables)
- 障害切り分けレシピ
- 用語集
1. 疎通確認 (ping / mtr / traceroute)
ping — ICMP echo 疎通
ping example.com # 連続 ping (Ctrl+C で停止)
ping -c 4 8.8.8.8 # 4 回だけ
ping -i 0.2 -c 100 host # 0.2 秒間隔で 100 発(負荷確認)
ping -s 1472 -c 1 host # MTU 確認用 (1472+28=1500 byte)
ping -W 2 -c 1 host # タイムアウト 2 秒
ping -I eth0 host # 指定インターフェイスから送信
ping -4 host / ping -6 host # 強制 IPv4/IPv6
ping6 ipv6.google.com # 古い書き方
AWS の Security Group / NACL でデフォルト ICMP は閉じられています。EC2 への ping が通らないからといって死亡判定はできない。
代わりに後述する
nc や curl で TCP 疎通を確認すること。
traceroute / tracepath — 経路追跡
traceroute example.com # 経路ホップを順次表示 (UDP デフォルト)
traceroute -n example.com # IP のみ表示(DNS 逆引きしない、速い)
traceroute -T -p 443 example.com # TCP SYN で 443 ポートに対して traceroute
traceroute -I example.com # ICMP echo で traceroute (Windows tracert 互換)
tracepath example.com # MTU も併せて確認できる
mtr — ping + traceroute の合わせ技(最強)
連続的にホップごとのロス率・RTT が見える。「途中の経路が悪化している」の特定に超強力。
mtr example.com # 対話モード
mtr -r -c 100 example.com # report モード、100 回送信して結果を出す
mtr -T -P 443 example.com # TCP 443 で実施
mtr -n example.com # DNS 逆引き省略
2. DNS 確認 (dig / nslookup / host)
dig — 最も柔軟(DNS デバッグの第一選択)
# 基本: A レコードを引く
dig example.com
# 短縮表示(IP だけ欲しい時)
dig +short example.com
# 特定レコード種別
dig MX example.com
dig AAAA example.com # IPv6
dig TXT iigtn.com # SPF / DKIM / 検証用 TXT
dig NS example.com # 権威 NS サーバ
dig SOA example.com
dig CNAME www.example.com
dig CAA example.com # ACM 取得時に確認
# 公開リゾルバを指定(ローカル DNS 無視)
dig @8.8.8.8 example.com
dig @1.1.1.1 example.com
# 権威サーバへ直接(伝搬確認に必須)
dig @ns-1024.awsdns-00.org example.com
# トレース (ルートからの解決過程)
dig +trace example.com
# 逆引き
dig -x 8.8.8.8
# DNSSEC 確認
dig +dnssec example.com
nslookup — どこでも入っている古典
nslookup example.com
nslookup example.com 8.8.8.8 # サーバ指定
nslookup -type=MX example.com
nslookup -type=TXT example.com
host — シンプルな出力
host example.com # A/AAAA/MX を一発表示
host -t TXT example.com
host -a example.com # ANY 相当(権威サーバ次第)
getent hosts — /etc/nsswitch.conf 経由(hosts ファイルも反映)
getent hosts example.com # OS のリゾルバ設定通りに引く
getent hosts internal.local # /etc/hosts や mDNS の確認に使える
3. ポート・接続確認 (ss / netstat / nc / lsof)
ss — netstat の後継(推奨)
| オプション | 意味 |
|---|---|
-t / -u | TCP / UDP |
-l | LISTEN 状態のみ |
-n | ポート/IP を数値表示(DNS 逆引きしない) |
-p | プロセス名・PID 表示(root 推奨) |
-a | 全状態(LISTEN + ESTABLISHED 等) |
-s | サマリ統計 |
# LISTEN 中の TCP ポート + プロセス
sudo ss -tlnp
# TCP 接続を全て表示
ss -tan
# ESTABLISHED な接続だけ
ss -tan state established
# 特定ポートの接続
ss -tan '( dport = :443 or sport = :443 )'
# 特定 IP との接続
ss -tan dst 10.0.0.5
# サマリ統計
ss -s
netstat — 古典(ss が無い古い環境向け)
netstat -tlnp # LISTEN 中 + プロセス
netstat -an | grep :443 # 443 関連だけ
netstat -i # インターフェイス統計
netstat -rn # ルーティングテーブル(→ 推奨は ip route)
nc (netcat) — TCP/UDP の万能ツール
# 単純なポート疎通確認(一番使う)
nc -zv example.com 443
nc -zv -w 3 host 22 80 443 # 複数ポート、3 秒タイムアウト
# UDP 確認
nc -zuv host 53
# シンプルなクライアント(生 TCP でしゃべる)
echo -e "GET / HTTP/1.0\r\n\r\n" | nc example.com 80
# 一時的なリスナを立てる(テスト用)
nc -l -p 8080 # 8080 で待ち受けて受信内容を表示
nc -l -p 8080 < file.txt # 接続が来たらファイル送信
# ファイル転送(受信側)
nc -l -p 9000 > received.bin
# ファイル転送(送信側)
nc receiver-host 9000 < file.bin
nc は BSD nc, GNU nc, nmap-ncat (ncat) でオプションが微妙に違います。特に
-l と -p の組み合わせ、-z (scan only) はない実装も。困ったら man nc 確認。
lsof — ファイル/ソケット使用一覧
sudo lsof -i # 全ソケット
sudo lsof -i :443 # 443 ポートを使うプロセス
sudo lsof -i tcp # TCP のみ
sudo lsof -i tcp:80 -sTCP:LISTEN # 80 で LISTEN しているプロセス
sudo lsof -p 1234 # PID 1234 が開いている全ファイル/ソケット
sudo lsof +L1 # ファイルが unlink されたが プロセスが掴み続けてる(ディスクが空かない時の犯人)
4. HTTP / API 確認 (curl / wget / httpie)
curl — HTTP の万能ツール
| オプション | 意味 |
|---|---|
-s | silent(プログレス非表示) |
-S | silent でもエラーは出す |
-f | HTTP エラー時に exit code を返す(CI で必須) |
-i | レスポンスヘッダも表示 |
-I | HEAD リクエスト |
-L | リダイレクト追跡 |
-X METHOD | HTTP メソッド指定 |
-H 'K: V' | ヘッダ追加 |
-d 'body' | POST ボディ(フォーム) |
--data-binary @file | ファイルから本文送信 |
-u user:pass | Basic 認証 |
-o file | 出力をファイルへ |
-O | URL の basename で保存 |
-w '...' | 結果フォーマット(時間計測に便利) |
-k | TLS 検証スキップ(デバッグ用、本番禁止) |
--resolve host:port:ip | DNS を上書き(DNS 切替前テストに必須) |
-x http://proxy:8080 | プロキシ経由 |
--http2 / --http3 | HTTP プロトコル指定 |
実例 — 基本
# GET (静かに)
curl -s https://api.example.com/v1/users
# レスポンスヘッダだけ
curl -sI https://lab.iigtn.com/
# ステータスコードだけ取得(CI で死活確認)
curl -s -o /dev/null -w "%{http_code}\n" https://lab.iigtn.com/
# リダイレクト追跡しつつヘッダ表示
curl -sIL http://example.com
# JSON POST
curl -X POST https://api.example.com/v1/items \
-H 'Content-Type: application/json' \
-d '{"name":"foo","value":42}'
# JSON ファイルを送る
curl -X POST https://api.example.com/v1/items \
-H 'Content-Type: application/json' \
--data-binary @payload.json
# レスポンスタイム計測
curl -w "@-" -o /dev/null -s https://lab.iigtn.com/ <<'EOF'
namelookup: %{time_namelookup}s
tcp_connect: %{time_connect}s
tls_handshake: %{time_appconnect}s
first_byte: %{time_starttransfer}s
total: %{time_total}s
EOF
実例 — DNS 切替前テスト(重要)
# DNS を上書きして、特定 IP に対して Host ヘッダ付きでリクエスト
curl -s --resolve lab.iigtn.com:443:1.2.3.4 https://lab.iigtn.com/
# CloudFront の Distribution が出来たけど DNS 未切替の段階で動作確認
curl -sI --resolve lab.iigtn.com:443:d3rc5zjg27rqr1.cloudfront.net \
https://lab.iigtn.com/
# OAC + S3 の状況確認
curl -sI https://lab.iigtn.com/index.html | grep -E 'HTTP|cache|x-cache'
--resolve は ACM 証明書発行直後・DNS 切替前テスト・CloudFront 直接アクセス確認の 必須テクニック。
hosts ファイル書き換えと違って、コマンド単位で限定的に DNS 上書きできる。
wget — ダウンロード特化
wget https://example.com/file.tar.gz # 単純ダウンロード
wget -c https://example.com/big.iso # レジューム (continue)
wget -O save.html https://example.com/ # 出力先指定
wget -q --show-progress url # 静か + プログレスバー
wget --tries=3 --timeout=10 url # リトライ・タイムアウト
wget --mirror -np url # サイトミラー (no-parent)
wget --content-disposition url # サーバが指定するファイル名で保存
HTTPie (http) — 人間に優しい curl 代替
http GET https://api.example.com/users
http POST https://api.example.com/users name=alice age:=30
http -h https://lab.iigtn.com/ # ヘッダだけ
http --auth user:pass https://api.example.com/
5. TLS 確認 (openssl / curl)
openssl s_client — TLS ハンドシェイク詳細
# TLS 接続して証明書詳細を表示
openssl s_client -connect lab.iigtn.com:443 -servername lab.iigtn.com
# 証明書だけ取り出す
openssl s_client -connect lab.iigtn.com:443 -servername lab.iigtn.com < /dev/null \
| openssl x509 -noout -text
# 有効期限だけ確認
echo | openssl s_client -connect lab.iigtn.com:443 -servername lab.iigtn.com 2>/dev/null \
| openssl x509 -noout -dates
# 特定の TLS バージョンで試す
openssl s_client -connect host:443 -tls1_2
openssl s_client -connect host:443 -tls1_3
# CipherSuite 列挙
openssl s_client -connect host:443 -cipher 'ECDHE-RSA-AES256-GCM-SHA384'
# CA バンドル指定
openssl s_client -connect host:443 -CAfile /etc/ssl/cert.pem
openssl x509 — ファイル化された証明書を見る
openssl x509 -in cert.pem -text -noout # 全情報
openssl x509 -in cert.pem -subject -issuer -noout # 主要情報のみ
openssl x509 -in cert.pem -dates -noout # 有効期限
openssl x509 -in cert.pem -fingerprint -sha256 -noout
openssl 鍵関連
# 秘密鍵とCSR生成
openssl req -newkey rsa:2048 -nodes -keyout key.pem -out csr.pem
# 自己署名証明書(テスト用)
openssl req -x509 -newkey rsa:2048 -nodes -keyout key.pem -out cert.pem -days 365
# 鍵と証明書の整合性確認(同じ Modulus か)
openssl x509 -noout -modulus -in cert.pem | openssl md5
openssl rsa -noout -modulus -in key.pem | openssl md5
curl で TLS 確認
curl -v https://lab.iigtn.com/ # ハンドシェイク詳細を見る
curl --tlsv1.2 https://host/ # 強制 TLS バージョン
curl --cert client.pem --key key.pem https://host/ # mTLS クライアント認証
curl --cacert ca.pem https://host/ # 自前 CA 検証
6. パケットキャプチャ・経路 (tcpdump / ip / iptables)
tcpdump — パケットキャプチャ(要 root)
| オプション | 意味 |
|---|---|
-i IFACE | インターフェイス指定(any で全体) |
-n | IP/ポートを名前解決しない |
-nn | サービス名も解決しない |
-c N | N パケットで終了 |
-w file.pcap | ファイル保存(Wireshark で開ける) |
-r file.pcap | ファイルを読む |
-A | ASCII 表示(HTTP のヘッダ確認) |
-X | HEX + ASCII 表示 |
-s 0 | パケット全体を取る(デフォルトは先頭のみ) |
-e | L2 ヘッダも表示 |
# インターフェイス eth0 で全パケット
sudo tcpdump -i eth0 -nn
# ポート 443 のパケット
sudo tcpdump -i any -nn 'port 443'
# 特定ホスト宛の TCP のみ
sudo tcpdump -i any -nn 'tcp and host 10.0.0.5'
# 自分から外への HTTP
sudo tcpdump -i any -nn -A 'tcp port 80 and dst not 127.0.0.1'
# DNS クエリだけ
sudo tcpdump -i any -nn 'udp port 53'
# 大量パケットを 1000 個取って .pcap に
sudo tcpdump -i any -c 1000 -w capture.pcap
# 後で読む
tcpdump -r capture.pcap -nn 'tcp port 443'
tcpdump は本番サーバで動かすと CPU/IO が跳ね上がります。-c で件数制限をかけ、-w でファイル化して短時間で抜く運用に。
JIT 用の -J や時刻表示 -tttt も有用。
ip — iproute2 のメインコマンド
ip a / ip addr # IP アドレス一覧 (= ifconfig)
ip a show eth0 # 特定 IF
ip r / ip route # ルーティングテーブル
ip route get 8.8.8.8 # 8.8.8.8 に到達する時の経路
ip neigh / ip n # ARP テーブル (= arp -a)
ip link # IF の状態 (UP/DOWN)
ip link set eth0 up # IF 起動
ip link set eth0 mtu 9000 # MTU 変更
iptables / nftables — パケットフィルタ確認
sudo iptables -L -n -v # 全 chain を行カウント付きで表示
sudo iptables -L INPUT -n -v # INPUT チェイン
sudo iptables -t nat -L -n -v # NAT テーブル
sudo iptables -S # ルールをコマンド形式で出力(バックアップに)
# 新しい nftables 系
sudo nft list ruleset
sudo nft list table inet filter
arp — ARP テーブル(古い書き方)
arp -a # ARP テーブル全体
arp -d 10.0.0.5 # 特定エントリ削除(ip neigh del もアリ)
障害切り分けレシピ
レシピ 1 — 「サイトが見えない」と言われた時
# Step 1: DNS 引けるか
dig +short lab.iigtn.com
dig +short lab.iigtn.com @8.8.8.8 # ローカル DNS の問題切り分け
# Step 2: ネットワーク到達性 (TCP)
nc -zv lab.iigtn.com 443
# Step 3: HTTP レスポンスとレイテンシ
curl -sI -w "tt: %{time_total}\n" https://lab.iigtn.com/
# Step 4: 経路上の問題か
mtr -r -c 50 lab.iigtn.com
# Step 5: TLS の問題か
echo | openssl s_client -connect lab.iigtn.com:443 -servername lab.iigtn.com 2>&1 \
| grep -E 'subject|issuer|Verify return'
レシピ 2 — 「API がたまに 5xx を返す」
# 高頻度で叩いて再現性を見る
for i in $(seq 1 100); do
curl -s -o /dev/null -w "%{http_code}\n" https://api.example.com/health
done | sort | uniq -c
# レスポンスタイムも一緒に
for i in $(seq 1 50); do
curl -s -o /dev/null -w "%{http_code} %{time_total}\n" https://api.example.com/v1/x
done
# ALB / CloudFront のキャッシュ判定
curl -sI https://api.example.com/v1/x | grep -E 'x-cache|x-amz|cf-'
レシピ 3 — 「特定サーバへの接続が遅い」
# 経路ごとのロス・RTT を計測
mtr -r -c 100 -T -P 443 host
# TCP の往復だけを見る
ping -c 20 host # ICMP が通るなら
# 帯域・rtt を実測(要 iperf3 入れる)
iperf3 -c iperf-server.example.com
# 実際の TCP 接続にかかった時間内訳
curl -w "@-" -o /dev/null -s https://host/ <<'EOF'
DNS: %{time_namelookup}
TCP: %{time_connect}
TLS: %{time_appconnect}
TTFB: %{time_starttransfer}
TOTAL: %{time_total}
EOF
レシピ 4 — 「証明書の有効期限が近い」
# 全管理ドメインの有効期限を一括取得(cron で監視可)
for d in iigtn.com lab.iigtn.com www.iigtn.com; do
date=$(echo | openssl s_client -connect "${d}:443" -servername "$d" 2>/dev/null \
| openssl x509 -noout -enddate \
| cut -d= -f2)
echo "$d $date"
done
レシピ 5 — 「DNS 伝搬が完了したか」
# 公開リゾルバ複数で確認
for ns in 8.8.8.8 1.1.1.1 9.9.9.9 208.67.222.222; do
printf "%-15s " "$ns"
dig @"$ns" +short lab.iigtn.com
done
# 権威サーバに直接問い合わせ(最速で正確)
dig +short NS iigtn.com
dig @ns-1024.awsdns-00.org +short lab.iigtn.com
用語集
- L1〜L7 (OSI 参照モデル)
- L1 物理 / L2 データリンク / L3 ネットワーク (IP) / L4 トランスポート (TCP/UDP) / L5 セッション / L6 プレゼンテーション / L7 アプリケーション (HTTP/TLS)。障害切り分けは下から潰すのが定石。
- ICMP
- IP 層の制御メッセージ。
pingが使う echo request/reply、tracerouteの TTL 超過通知など。AWS Security Group ではデフォルト閉じている。 - TTL (Time To Live)
- IP パケットが許される最大ホップ数。
tracerouteはこれを 1 から増やしながら送って経路を炙り出す。DNS の TTL は別概念で「キャッシュ寿命(秒)」。 - MTU
- 1 パケットで送れる最大サイズ(典型 1500 byte)。VPN や AWS などで小さくなっている時、
ping -s+-M doやtracepathで発見できる。 - iproute2 vs net-tools
- iproute2 (
ip,ss) が新世代、net-tools (ifconfig,netstat) が旧世代。新環境は iproute2 系のみ入っていることも多い。 - SNI (Server Name Indication)
- TLS ハンドシェイク時にクライアントが「どのドメイン宛か」を伝える拡張。1 IP で複数証明書を出し分けるのに必須。
openssl s_client -servernameで明示できる。 - mTLS (Mutual TLS)
- サーバ証明書に加えてクライアント証明書も検証する相互認証。
curl --cert ... --key ...でクライアント側を指定できる。 - DNS 権威サーバ vs リゾルバ
- 権威サーバ = ドメイン本来の正解を持つサーバ(例: AWS Route 53)。リゾルバ = それを問い合わせて返す中継(例: 8.8.8.8 / 1.1.1.1)。伝搬確認は権威に直接
dig @NSが最速。 - --resolve (curl)
- DNS を一時的に上書きして、特定 IP に Host ヘッダ付きで HTTPS リクエストを送るオプション。DNS 切替前のテスト・CloudFront 直接アクセスに必須。
- HEAD リクエスト
- ボディを返さずヘッダだけ返す HTTP メソッド。
curl -Iで叩ける。死活確認・キャッシュヘッダ確認に使う。 - pcap
- tcpdump / Wireshark が使うパケットキャプチャファイル形式。tcpdump で
-w指定すると保存、Wireshark で GUI 解析できる。 - BPF (Berkeley Packet Filter)
- tcpdump のフィルタ式 (
'tcp and port 443') を解釈するカーネル内仕組み。eBPF は その拡張版で観測 / セキュリティ ツールの基盤。 - NAT (Network Address Translation)
- プライベート IP と外向き IP を変換する仕組み。
iptables -t natで確認できる。 - ARP (Address Resolution Protocol)
- 同一 LAN 内で IP → MAC アドレスを解決する L2 プロトコル。
ip neighやarp -aでテーブルを確認できる。 - DNSSEC
- DNS 応答に署名を付けて改ざん検知する拡張。
dig +dnssecで確認。 - CAA レコード
- 「このドメインの証明書を発行できる CA」を指定する DNS レコード。ACM 取得時にここでブロックされていることがある。
dig CAA example.comで確認。