ネットワーク診断コマンド集 — 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)を使うのが推奨。

目次

  1. 疎通確認 (ping / mtr / traceroute)
  2. DNS 確認 (dig / nslookup / host)
  3. ポート・接続確認 (ss / netstat / nc / lsof)
  4. HTTP / API 確認 (curl / wget / httpie)
  5. TLS 確認 (openssl / curl --cert)
  6. パケットキャプチャ・経路 (tcpdump / ip / iptables)
  7. 障害切り分けレシピ
  8. 用語集

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 が通らないからといって死亡判定はできない。 代わりに後述する nccurl で 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 / -uTCP / UDP
-lLISTEN 状態のみ
-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
ncBSD 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 の万能ツール

オプション意味
-ssilent(プログレス非表示)
-Ssilent でもエラーは出す
-fHTTP エラー時に exit code を返す(CI で必須)
-iレスポンスヘッダも表示
-IHEAD リクエスト
-Lリダイレクト追跡
-X METHODHTTP メソッド指定
-H 'K: V'ヘッダ追加
-d 'body'POST ボディ(フォーム)
--data-binary @fileファイルから本文送信
-u user:passBasic 認証
-o file出力をファイルへ
-OURL の basename で保存
-w '...'結果フォーマット(時間計測に便利)
-kTLS 検証スキップ(デバッグ用、本番禁止)
--resolve host:port:ipDNS を上書き(DNS 切替前テストに必須)
-x http://proxy:8080プロキシ経由
--http2 / --http3HTTP プロトコル指定

実例 — 基本

# 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 で全体)
-nIP/ポートを名前解決しない
-nnサービス名も解決しない
-c NN パケットで終了
-w file.pcapファイル保存(Wireshark で開ける)
-r file.pcapファイルを読む
-AASCII 表示(HTTP のヘッダ確認)
-XHEX + ASCII 表示
-s 0パケット全体を取る(デフォルトは先頭のみ)
-eL2 ヘッダも表示
# インターフェイス 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 dotracepath で発見できる。
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 neigharp -a でテーブルを確認できる。
DNSSEC
DNS 応答に署名を付けて改ざん検知する拡張。dig +dnssec で確認。
CAA レコード
「このドメインの証明書を発行できる CA」を指定する DNS レコード。ACM 取得時にここでブロックされていることがある。dig CAA example.com で確認。