この記事は
ネットワークの疎通確認を行いたい時に知っていると得するコマンドを記します。
紹介するコマンドの実行結果は原因の切り分けに役立ちますし、基盤構築を行うなら知っていて損しないはず!
実行環境に「ping
やcurl
も無いのですが!」という場合もありますので、事前にwhich 〇〇〇
などを使ってコマンドが使える状態であることのご確認をお願いします。
実行環境
- Linux環境
こういう場合に
- Webサーバーにブラウザで接続できない
- RDS(DB)のGUIクライアントやコマンドで接続できない
- SSHクライアントやリモートデスクトップ接続できない
- プロキシサーバーを経由して外部のネットワークに接続できない
- コンテナイメージを取得しようとしても外部ネットワークに出られない
これをしてみる
ping [IPアドレスまたはホスト名]
まずはこれ、と教えられるやつです。
「今までは応答が返って来ていたけれど、今は返って来ない」といった場合は接続先サーバーに何かが起きたか接続経路に問題が起きている可能性が有ります。
ファイアウォールやセキュリティーグループの設定でICMPが許可されていないとconnection timed out
になってしまいます。
そもそも接続先サーバーが起動していない...なんてこともあり得ます。
これだけでは原因特定に至らないので別のコマンドと併せて使うことをおすすめします。
curl -v [IPアドレスまたはホスト名]:[接続ポート番号]
nginxやIISなどWebサーバーにHTTPリクエスト送信します。
返ってくるHTTPステータスコードが200なら接続できているので、ブラウザの設定に問題を抱えている可能性が有ります。HTTPステータスコードが500系なら接続できているけれど、接続先サーバーの設定が正しくないか何かしら別の問題が発生しています。
次のページで各ステータスコードの意味が確認できるので参考にしてみてください。
mdn web docs
HTTPヘッダーを付与したい場合は、-H "Host: [FQDN]"
のように -Hオプションを付けて指定することもできます。
echo "" | /dev/tcp/[IPアドレスまたはホスト名]/[接続ポート番号]
自分の中で使うことの多いコマンドです。
応答がない場合はファイアウォールやセキュリティグループで対象ポートへの接続が許可されていない可能性が有りますし、サービスがダウンしている可能性も考えられるので、別のコマンドと併用して細かく切り分けをする時に用いています。
また、echo "" | /dev/udp/[IPアドレスまたはホスト名]/接続先ポート番号
にするとUDPで疎通確認を行えます。
もう少し解説すると、接続先ポートに到達できていればコマンドの返り値が0
。到達できていなければ0以外
が返ってきます。
誰かに実行してもらう場合には次の形式にすると良いかもです。
echo "" | /dev/tcp/[IPアドレス]/[接続ポート番号] && echo "OK" || echo "NG"
こうすることで接続先ポートに到達できた場合は標準出力に「OK」が、到達できない場合は「NG」が表示されます。
あとは、サービスを提供しているデフォルトのポート番号を覚えておくと楽ができます。
traceroute [IPアドレスまたはホスト名]
pingの次に教えてもらうモノですね。
コマンド実行元から接続先サーバーまでに経由するロードバランサーやサーバーから応答が返ってくるので、「どこまで届いていて、どこで止まっているのか」を確認できます。
ただし、pingと同様にICMPに分類されるためセキュリティグループで許可されていない場合はタイムアウトします。
接続先サーバーまでの道中でタイムアウトするならば、タイムアウトが発生する手前のネットワークから向こう側のネットワークへのルーティング設定に問題があったり、そもそも向こう側のネットワークでアクセスを拒否されている可能性が有ります。
nslookup [IPアドレス]
ホスト名で接続できないよ!って時に使います。
DNSサーバーに接続できないのか、接続先サーバーの名前がDNSレコードとして存在しないのかを切り分けられます。
接続元サーバーの設定確認
必ずしも自分以外の設定がおかしいとは限りません。
例えばyumを使ってパッケージをインストールしようにも接続失敗する!という時はyumとして持つプロキシ設定が有効になっていないなど、接続の前提となる設定が欠けている事もあります。
シェルの環境変数にHTTP_PROXY
やNO_PROXY
が無かっただけでした...お騒がせしました...、なーんてこともあります。
各コマンドがどの設定を元に動作するかを一度確認するのも有りです。
おわりに
疎通確認に使用できるコマンドとして覚えておくと得をすることが多いコマンドを紹介しました。
AWSなどクラウド環境を前提に書いてしまいましたが、オンプレミス環境でも使える良いコマンドたちです。
頻繁にトラブルシューティングを行う機会があるなら、上記コマンドに加えてnc
やredis-cli
、psql
、sqlplus
、tcpdump
などを詰め込んだコンテナイメージをdockerhubや会社のプライベートリポジトリにpushしておくと作業が捗ります。
最後に、ネットワークが不通の時こそ落ち着いて一つずつ被疑箇所を潰していきましょう。
どこからどこまで何の通信が通って、何が通らないのかを整理して自分のできる範囲で無理せずやっていきましょう。
以上です。ありがとうございました。