AWS

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

More than 3 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