EC2インスタンスのポートに対して疎通確認をしてみよう


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

お久しぶりです。株式会社協栄情報システム3部所属の寺尾です。

AWSでEC2インスタンスの作成やセキュリティグループの更新を実施すると疎通確認が必要になる事がありますよね

ですので今回は疎通確認の一連の流れについて書いていきたいと思います。

構成図と前提条件

以下の構成図のような環境をAWSクラウド上に構築しました。

file

「test_con_target」内でapacheを起動し、HelloWorldページだけ準備しています。
また、以下の内容のセキュリティグループを設定しています。

対象インスタンス アタッチしたセキュリティグループ インバウンドルール
test_con_target test_con_target_SG すべてのICMP – IPv4(0.0.0.0/0)
test_con_linux
test_con_windows
test_con_SG SSH(MYIP)
RDP(MYIP)

※アウトバウンドルールは初期設定のすべて許可のまま変更していません。

全体の流れ

今回はセキュリティグループに新たな疎通先が追加される場合を想定し、以下のような流れで疎通確認を実施していきます。

  1. 現在の「test_con_target_SG」設定を取得する
  2. 「test_con_linux」及び「test_con_windows」から「test_con_target」への疎通確認を実施する(失敗)
  3. 現在の「test_con_target_SG」のインバウンドルールに「test_con_linux」及び「test_con_windows」からの通信設定を追加する
  4. 現在の「test_con_target_SG」設定を取得する
  5. 「test_con_linux」及び「test_con_windows」から「test_con_target」への疎通確認を実施する(成功)

疎通確認

1. 現在の「test_con_target_SG」設定を取得する

以下のコマンドをローカルwindowsのPowerShellから実行して「test_con_target_SG」の設定を「test_con_target_SG_before.txt」として取得します。
sg-xxxxxxxxxxxxxxxxxには「test_con_target_SG」のセキュリティグループIDを入力しましょう。

aws ec2 describe-security-group-rules `
--filters 'Name=group-id,Values=sg-xxxxxxxxxxxxxxxxx' `
--query 'SecurityGroupRules[*].{GroupId: GroupId,IsEgress: IsEgress,IpProtocol: IpProtocol,FromPort: FromPort,ToPort: ToPort,CidrIpv4: CidrIpv4,ReferencedGroupInfoGroupId: ReferencedGroupInfo.GroupId}' `
--output table >test_con_target_SG_before.txt

詳細についてはCLIを利用して特定のSGに紐づいたEC2一覧とSGルール内容一覧を作成するをご確認ください。

2. 「test_con_linux」及び「test_con_windows」から「test_con_target」への疎通確認を実施する(失敗)

「test_con_linux」からの疎通確認

「test_con_linux」にログインし、
curl -v -m 5 telnet://10.0.3.4:80を使って80番ポートに対する疎通確認を実施していきます。

  • -v :詳細を出力する
  • -m :タイムアウト時間を指定する
  • telnet:// :プロトコル
  • 10.0.3.4:80 :疎通確認対象IP:ポート

実行結果は以下になります。
インバウンドルールで許可していませんのでタイムアウトになりました。

[ec2-user@ip-10-0-1-4 ~]$ curl -v -m 5 telnet://10.0.3.4:80
*   Trying 10.0.3.4:80...
* Connection timed out after 5000 milliseconds
* Closing connection 0
curl: (28) Connection timed out after 5000 milliseconds

一応pingも確認します。

[ec2-user@ip-10-0-1-4 ~]$ ping -c 4 10.0.3.4
PING 10.0.3.4 (10.0.3.4) 56(84) bytes of data.
64 bytes from 10.0.3.4: icmp_seq=1 ttl=64 time=0.420 ms
64 bytes from 10.0.3.4: icmp_seq=2 ttl=64 time=0.476 ms
64 bytes from 10.0.3.4: icmp_seq=3 ttl=64 time=0.465 ms
64 bytes from 10.0.3.4: icmp_seq=4 ttl=64 time=0.410 ms

--- 10.0.3.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3058ms
rtt min/avg/max/mdev = 0.410/0.442/0.476/0.038 ms
  • -c :回数を指定する

こちらは許可していますので問題なく通りますね。

「test_con_windows」からの疎通確認

「test_con_windows」にログインし、
Test-NetConnection 10.0.3.4 -port 80を使って80番ポートに対する疎通確認を実施していきます。

  • 10.0.3.4 :疎通確認対象IP
  • -port :対象ポート

実行結果は以下になります。
インバウンドルールで許可していませんのでfailedになりました。

PS C:\Users\Administrator> Test-NetConnection 10.0.3.4 -port 80
WARNING: TCP connect to (10.0.3.4 : 80) failed

ComputerName           : 10.0.3.4
RemoteAddress          : 10.0.3.4
RemotePort             : 80
InterfaceAlias         : Ethernet
SourceAddress          : 10.0.1.5
PingSucceeded          : True
PingReplyDetails (RTT) : 0 ms
TcpTestSucceeded       : False

PingSucceededはTrueになっていますのでpingは通っていますが、80番ポートは開いていないようです。
想定通りですね。

3. 現在の「test_con_target_SG」のインバウンドルールに「test_con_linux」及び「test_con_windows」からの通信設定を追加する

「test_con_target_SG」のインバウンドルールに「test_con_SG」からの80番ポート(HTTP)への通信を許可します。

対象インスタンス アタッチしたセキュリティグループ インバウンドルール
test_con_target test_con_target_SG すべてのICMP – IPv4(0.0.0.0/0)
HTTP(test_con_SG)

これで「test_con_linux」及び「test_con_windows」からの疎通が可能なはずですね。

4. 現在の「test_con_target_SG」設定を取得する

先ほどと同じく以下のコマンドをローカルwindowsのPowerShellから実行して「test_con_target_SG」の設定を「test_con_target_SG_after.txt」として取得します。

aws ec2 describe-security-group-rules `
--filters 'Name=group-id,Values=sg-xxxxxxxxxxxxxxxxx' `
--query 'SecurityGroupRules[*].{GroupId: GroupId,IsEgress: IsEgress,IpProtocol: IpProtocol,FromPort: FromPort,ToPort: ToPort,CidrIpv4: CidrIpv4,ReferencedGroupInfoGroupId: ReferencedGroupInfo.GroupId}' `
--output table >test_con_target_SG_after.txt

こうすることで想定した通りの変更ができたかどうかをテキストベースで比較や記録することができます。

5. 「test_con_linux」及び「test_con_windows」から「test_con_target」への疎通確認を実施する(成功)

「test_con_linux」からの疎通確認

再度「test_con_linux」から疎通確認を実施しました。

[ec2-user@ip-10-0-1-4 ~]$ curl -v -m 5 telnet://10.0.3.4:80
*   Trying 10.0.3.4:80...
* Connected to 10.0.3.4 (10.0.3.4) port 80 (#0)

確かにConnectedになっていますので無事成功したようです。

※ このコマンドは待っても終わらないのでCtrl+Cで抜けましょう

「test_con_windows」からの疎通確認

再度「test_con_windows」から疎通確認を実施しました。

PS C:\Users\Administrator> Test-NetConnection 10.0.3.4 -port 80

ComputerName     : 10.0.3.4
RemoteAddress    : 10.0.3.4
RemotePort       : 80
InterfaceAlias   : Ethernet
SourceAddress    : 10.0.1.5
TcpTestSucceeded : True

こちらもTcpTestSucceededがTrueになっていますので無事成功したようです。
これでセキュリティグループの変更が正常にできたことを網羅的に確認できました!

参考

EC2セキュリティグループポート通信確認

おわりに

ここまで読んでいただきありがとうございました。
疎通確認はインフラを触るうえで大変重要な業務なので自分のためにも作業フローを整理しました。
この記事が誰かの助けとなれば幸いです。
それではまた!

Last modified: 2022-03-03

Author