Help us understand the problem. What is going on with this article?

AWSのセキュリティグループにセキュリティグループを指定した時の落とし穴

More than 5 years have passed since last update.

AWS の Security Group って便利ですよね!って思ってた昨日までの自分を殴りたい。

Summary

  • セキュリティグループにセキュリティグループを指定する場合、その設定が適用される場合と適用されない場合がある。
  • 適用される/されない は、相手のインスタンスのリージョンと接続時のホスト名で変わる。
Region PublicIP PublicDNS PrivateIP
Same ×
Different × × ×

※ ○:適用される/ ×:適用されない

Details

前提

  • AWS で EC2 インスタンスを起動すると PublicIP/PublicDNS/PrivateIP がふられる。
  • PublicIP インターネット(外部)に公開されてるIP。例)54.123.456.78
  • PublicDNS DNSに登録されるホスト名。例)ec2-54-123-456-78.region.compute.amazonaws.com
  • PrivateIP AWSのネットワーク内のみで使えるIP。例) 172.17.123.45
  • 異なるリージョン間では、PrivateIPは使えない。名前解決するとプライベートIP出てくるけど。そんなの関係ない。

きっかけ

EC2のセキュリティグループ設定を、必要最低限のネットワークに限定したい。
セキュリティグループにはIPアドレスも指定できますが、基本的に冗長構成組んでるとサーバ台数増えてくので、IPアドレスをいちいち設定してらんない。

そのためにAWSには素敵な仕組みがあって、セキュリティグループにセキュリティグループを設定できる。

Webサーバ群は、管理サーバ群からのSSH接続を許可します、みたいな。

なので仮に Webサーバ群にEC2を増やしても、そのインスタンスを Webサーバ群のセキュリティグループにさえ紐付ければ、特に気にする必要はないという素敵設定です。

が。落とし穴があった。

何が起きたか?

セキュリティグループを指定しているのに、繋がらない・・・!

仮に接続元サーバAと接続先Bがあって、それぞれにセキュリティグループ SG-ASG-B が設定されているとする。
そして SG-B の Inbound に SG-A の 12345 番を許可してみる。

# A:* => B:12345 via privateIP
$ telnet private-IP-B 12345
Trying private-IP-B ...
Connected to private-IP-B.
Escape character is '^]'.

うん。問題ない。

ところが、privateIP => publicIP に変えてみると

# A:* => B:12345 via publicIP
$ telnet public-IP-B 12345
Trying public-IP-B ...
telnet: Unable to connect to remote host: Connection timed out

通らない。。。
もしや外部に一旦出てる?かと思い名前解決してみる。

$ nslookup public-IP-B

Server:     172.31.0.2
Address:    172.31.0.2#53

Non-authoritative answer:
B-IP-public.in-addr.arpa    name = public-IP-B.ap-northeast-1.compute.amazonaws.com.

Authoritative answers can be found from:

あれ、、なんか変なのでてきた。これは所謂 publicDNS というやつではないか。
更に名前解決してみる。

$ nslookup public-IP-B.ap-northeast-1.compute.amazonaws.com

Server:     172.31.0.2
Address:    172.31.0.2#53

Non-authoritative answer:
Name:   public-IP-B.ap-northeast-1.compute.amazonaws.com
Address: private-IP-B # あれ?

privateIP 引けてんじゃん。。。publicIP だとひけないのに!なんでや!

試しに publicDNS で接続にトライ。

$ telnet public-IP-B.ap-northeast-1.compute.amazonaws.com 12345
Trying public-IP-B.ap-northeast-1.compute.amazonaws.com ...
Connected to public-IP-B.ap-northeast-1.compute.amazonaws.com.
Escape character is '^]'.

どりゃあああ!(ノ`Д´)ノ彡┻━┻
繋がってるじゃねえか。

つまり、 publicIP だと publicDNS までしか変換できず、結果として一旦外に出る模様。
当然のことながら、外に出た場合はセキュリティグループは適用外になってしまう。。。

調べてみた

どうやら、仕様。
https://forums.aws.amazon.com/thread.jspa?threadID=81025
https://forums.aws.amazon.com/thread.jspa?threadID=113766

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away