LoginSignup
37

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-08-12

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37