AWS EC2にpingが飛ばない時に確認すること、やること

こんにちは、ブングアプリ担当の鈴木です。
ブングアプリのpingを同時に8個飛ばしてサブネット単位で迅速に疎通確認するゼンピングは、AWSへの専用回線を変更した時に複数のVPC上にあるAWS EC2の疎通確認をしたかったこともあり作りました。
その当時をふりかえり、はまったところをまとめます。

EC2にpingが飛ばない

コマンドプロンプトからpingを飛ばしていったところ返事が返ってこないサーバーが何台かいました。
RDP(リモートデスクトップ)なりSSHなりで接続できているのでどういうことかな?と、セキュリティグループを確認してみました。

セキュリティグループを確認する

返事をしてくれるサーバーとしてくれないサーバーで比較すると後者はICMP(すべてのプロトコル)の設定が無いことが分かりました。
ではICMPとはなんでしょうか?

おさらい ICMP(Internet Control Message Protocol)とは

Internet Control Message Protocol(インターネット制御通知プロトコル、ICMP)とは、通信処理で使われるプロトコルのひとつで、Internet Protocolのデータグラム処理における誤りの通知や通信に関する情報の通知などのために使用される。ICMPに関するICMP通知は、通知が無限ループに陥るのを防ぐために送られない。

IPv4(Internet Protocol version 4)のための ICMP (ICMPv4) は RFC 792 によって規定され、IPv6(Internet Protocol version 6)のための ICMP (ICMPv6) は RFC 4443 によって規定されている。ICMP は TCP、UDP などと同様にInternet Protocolの上位のプロトコルであるが、Internet Protocolと同様のインターネット層のプロトコルであるかのような特別の処理をされる。

ICMPを利用しているツールにpingやtracerouteなどがある。

Wikipedia(Internet Control Message Protocol)

pingやtracerouteはICMPを使って通信を行っています。
アプリケーションエンジニアの方でも比較的各種サービスのTCPポート番号は知っている方が多いのですが、ICMPについて知らないことが多いかと思います。
私も知りませんでした。

※TCPポート関連でAWS EC2はFTPがはまりがちなので別エントリーでまとめます。

社外ベンダーの方から「pingが飛ばないのでサーバーが落ちてると思います。」と連絡が入ることもあるのですが、AWSに限らずセキュリティーの観点からサーバーサイドでICMPの通信を許可していないことも多いので特に立ち上げ直後のサーバーについては要確認です。


セキュリティーグループでICMPを設定する

あらためてマネジメントコンソールでセキュリティグループを設定していきます。

EC2のコンソールに移動し対象のインスタンスを探す

フィルタリングするなりで該当インスタンスを表示してください。

対象のインスタンスにチェックをつける

対象のインスタンスの左端のチェックボックスにチェックをつけます。

ICMPの設定を追加するセキュリティグループをクリックする

セキュリティタブに移動すると対象インスタンスに設定されているセキュリティグループの一覧が表示されるので、ICMPの設定を追加するセキュリティグループをクリックします。

インバウンドルールを編集する

インバウンドルールタブをクリック、Edit inbound rulesボタンをクリックしインバウンドルールの編集画面へ移動します。

ICMPを許可するルールを追加する

ルールを追加ボタンをクリックすると一番下に入力欄が出てくるのでタイプを「すべてのICMP」、ソースにpingを投げたいサブネットを設定しルールを保存ボタンをクリックすると設定したサブネットからのpingが通るようになります。

AWS EC2へのpingを通す設定は以上となります、お疲れ様でした。


補足 RDSにはpingは飛ばない

ということで社内で聞かれた時も「ICMP許可してあげてー」と伝えるのですがRDSに同様の処置をして「飛びません!」と凄まれることがままあります。
EC2と異なり、RDSはRDS自体がICMPを許可していないのでセキュリティグループを設定しても飛んでくれません、残念。
ではRDSの通信確認はどうしましょう?

対応 PowerShellでTest-NetConnectionを使う

Windows機をご利用の方向けになりますがPowerShellでTest-NetConnectionでポートを指定して疎通確認ができるのでこれを利用します。
カスタマイズしていないWindows機での操作を記載していきます。

PowerShellを起動する

検索ボックスに「PowerShell」と入力するとWindows PowerShellが検索されるのでEnter

起動

立ち上がってきました。

Test-NetConnectionを実行する

対象RDSのエンドポイントを指定してTest-NetConnectionを実行していきます。

Test-NetConnection [エンドポイント] -Port [ポート番号]

待ちます

pingと比較してしばらく時間がかかります。
下のような画面になるので少しお待ちください。

成功したことを確認する

Test-NetConnectionで通信できることが確認できるとTcpTestSucceededがTrueになります。

失敗すると

Test-NetConnectionで通信に失敗するとTcpTestSucceededがFalseになります。

RDSへの通信確認は以上となります、お疲れ様でした。