セキュリティグループIDを指定してEC2同士の接続制御をする時のポート番号の指定は必要？

こんにちは、ふくちと申します。

今回は友人からふと言われた、
**「セキュリティグループIDを指定してEC2同士の接続制御をする時に、ポート番号の指定って必要なんやっけ？」**
という疑問について検証してみました！

# そもそもEC2の接続制御って何を使うべき？
これは**セキュリティグループを用いるのがベストプラクティス**です。ネットワークACLでも接続制御はできますが、ベストプラクティスはセキュリティグループの利用です。
下記の公式ドキュメントに明記されています。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-best-practices.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/9bb0cf7f-c1b5-4826-c816-3b181408c3fc.png)

ベストプラクティスに従い、セキュリティグループを用いて接続制御を行っていきます。

# EC2同士で接続する際、セキュリティグループ(以下SG)をどのように設定するべき？
大きく分けて3つの手段があります。
## 1.通信相手となるEC2インスタンスのIPアドレスを指定する
1つ目は通信相手となるEC2インスタンスのIPアドレスを指定する方法です。
わかりやすくオーソドックスである反面、通信相手のIPアドレスが変化するケースや、膨大な通信相手がいるケースに対応するのが難しいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/78663783-afe2-d419-bd8f-8569e171683d.png)

## 2.通信先VPCやサブネットのIPアドレス・CIDRブロックを指定する
2つ目はVPCやサブネットのIPアドレスもしくはCIDRブロックを指定する方法です。
VPCピアリングをしている時などに使えそうです。
また、[1つ以上のCIDRブロックのセットから成る、プレフィックスリスト](https://docs.aws.amazon.com/vpc/latest/userguide/managed-prefix-lists.html)を用いることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/79c83fef-b91e-f84a-5932-46035dd99903.png)

## 3.通信相手となるEC2インスタンスのセキュリティグループIDを指定する
そして3つ目は通信相手のSGを指定する方法です。
SGの設定において、別のSGを指定できる、という形になります。
複数のEC2インスタンスに同一SGをアタッチしていた場合、そのSGを指定するだけで該当するすべてのEC2と通信することができるようになります。1.と比べると、設定の手間が大きく減らせます。
また、同じSGがアタッチされたEC2を後から増やしたとしても、そのEC2にはすぐさま通信可能になります。すなわち、運用の手間が大きく省けるということです。
以上より、通信相手のSGを指定することで、設定・運用の手間を大きく無くすことができます。
今回はこの3.を用いて接続制御した際のお話です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/abb2c747-4cf4-e760-fdf1-ee96706481f8.png)

# 検証してみた！
疑問に基づき、大きく2パターンで検証します。
**①ポートを全開放した状態での接続制御パターン**
**②ポートを指定した状態での接続制御パターン**
※どちらも同一VPC内での通信を想定しています。VPCピアリングでの検証は下記の記事をご参照ください。

https://dev.classmethod.jp/articles/security-group-effective-range/

## 1.VPCを作成する
今回はプライベートサブネットのEC2インスタンスから、プライベートサブネットのEC2インスタンスへ接続を試みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/f6f89dbb-8779-dc6f-0de4-cff7b574cf45.png)

## 2.セキュリティグループ(以下SG)を作成する
ここでは、接続元SGのアウトバウンドルールを0.0.0.0/0にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/5631ecc1-ac3c-7584-9b94-46022076f293.png)

一方で接続先SGのインバウンドルールを無しにしておきます(アウトバウンドルールはデフォルトのまま)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/432fbb83-4f64-d4f3-8991-adbb9f3d26de.png)

## 3.EC2を2つ作成し、それぞれに先ほど作成したSGをアタッチする
接続元EC2を作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/2c8bb658-6086-7bcf-4b13-11be6bc9597e.png)


続いて接続先EC2を作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/47c1fb2f-1cf4-0941-5a0d-057de67eafa4.png)

>※接続先EC2に、Apacheをインストールしておきます。下記のようにコマンドを実行します。
>>パッケージを最新に更新する
`sudo yum update -y`
>
>>Apacheのインストール
`sudo yum install httpd -y`
>
>>Apacheの起動
`sudo systemctl start httpd.service`
>
>>Apacheが起動されていることを確認
`sudo systemctl status httpd.service`
>
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/fb5b587c-bd59-6742-f4e4-cd5a7d661d34.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/b6ee7d5b-4bfe-db75-8ade-8e3e134be24c.png)


## 4.接続元EC2から接続先EC2にアクセスができないことを確認する。
接続元EC2から、接続先EC2のプライベートIPアドレス宛にcurlコマンドを投げます。
しかし、現在は接続先EC2のインバウンドルールが存在しないため、一切のアクセスが許可されていません。したがって、接続元EC2から発信したcurlコマンドは、接続先EC2に届かず、返ってくることもありません。
また、pingコマンドを投げても届きません。
現在は一切接続できない状況だとわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/f8d1fa1f-adc7-f9e2-1daf-482123b931d3.png)

## 5.接続先SGのインバウンドルールに、接続元SGを指定する
接続元SGからのhttp通信を許可し、ソースに接続元SGを指定します。**この時、httpのポート80を指定します。**
また、pingはICMPプロトコルを使用するので、接続元SGからのICMP通信も許可しておきます。**この時、ポート範囲を「すべて」としています。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/61688b62-ace8-0cd7-e5a0-6a82629ba47d.png)


## 6.接続元EC2から接続先EC2にアクセスできることを確認する。
再び接続元EC2から、接続先EC2のプライベートIPアドレス宛にcurlコマンドとpingコマンドを投げます。
すると今度は応答が確認され、無事EC2インスタンス同士の接続が確認できました！
また、この検証によって、**ポート番号の指定があってもなくても問題ない**ことも確認できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/68238615-6089-5bdd-2e99-968790f7b2bf.png)

# 結論
**通信相手のセキュリティグループIDを指定してEC2同士の通信制御をする場合、ポート番号の指定はあってもなくても大丈夫！**

どなたかのお役に立てば幸いです。