[メモ]ネットワーク接続トラブル時の問題切り分け方法


1. pingで接続できるか

$ ping IPアドレス
$ ping ホスト名

pingが成功しない場合
1.同一ネットワーク上の他のマシンに接続できるか確認

$ ping 目的のマシンと同一ネットワークに存在する他のマシンのIPアドレス

2.ネットワーク経路のどこで失敗しているか確認
※tracerouteのデフォルトはUDP接続なので、-IでICMP、-TでTCPもできる

$ traceroute IPアドレス

2.ポートが開いているか

目的のマシン内で

$ netstat -a
# ss -a

もしくは、
クライアントから

$ nc ホスト名 -z ポート番号
Connection to qiita.com port 443 [tcp/https] succeeded!

3.名前解決が適切に行われているか

hostsファイルを確認

$ cat /etc/hosts

もしくは、

$ nslookup ドメイン名
Server:     192.168.100.1・・DNSサーバー名
Address:    192.168.100.1#53・・DNSサーバーのアドレス

Non-authoritative answer:
Name:   qiita.com・・問い合わせたドメイン名
Address: 54.65.107.105・・結果
Name:   qiita.com
Address: 13.112.43.51
Name:   qiita.com
Address: 54.238.18.49

$ dig ドメイン名
(結果エリア)
;; ANSWER SECTION:
qiita.com.      22  IN  A   54.65.107.105
qiita.com.      22  IN  A   54.238.18.49
qiita.com.      22  IN  A   13.112.43.51

その他

・怪しいコネクションを特定して、どのプロセスが使っているか確認する

// tcpコネクションを表示
$ netstat -p tcp

// どのプロセスが使っているか特定
$ lsof -i:58193

・ネットワーク性能が悪い場合は以下を疑う
(「絵で見て分かるOS/ストレージ/ネットワーク[新装版]」P263〜)
1.ボトルネックによる待ち行列
 - DBサーバー、APサーバーなどで待ち行列が発生してないか確認する
2.通信回数が多い
 - 帯域を使い切ってなくてもショートパケットが何回も送られることで処理に時間がかかっていることがある
 - DBの場合データを全て受け取ってからプログラムで処理するのではなくストアドプロシージャでDB側で処理してしまう、などもできる
 - Webサイトの場合閾値を超えたらソーリーページを表示する、などで待ち行列を制限する、などもできる
3.相手の応答を待たなければならない
4.純粋なネットワークのトラブル

参考

・絵で見て分かるOS/ストレージ/ネットワーク[新装版]
Macでネットの通信が遅い時にnetstatとlsofコマンド使って調べてみた