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-A
と SG-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