aws ec2 の同一サーバへのアクセスについて

# はじめに

同一サーバへアクセスする際に、
どのIP/DNSを指定するとどんな動きをするのか、
意外と知らない人がいるなーと思ったので、書いてみました。

多分、ネットワーク経路のイメージができていないと躓く所になるのかなと。

# 前提条件

- 以下のようなセキュリティグループ(以降、SGと表記)のみをアタッチしていること。  
※ソースは『ec2にアクセスするクライアントのIP』のみを指定。  
※つまり同一サーバへのアクセス許可はSGでは行わない

![SG.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353055/ef21595f-03c0-1472-d0a2-dc00b1edc9b9.png)

- /etc/hosts には以下の通り記してあること。  
※Amazon Linux 2 AMIのデフォルトのまま

```bash:/etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost6 localhost6.localdomain6
```

# アクセスしてみよう！

## localhost(127.0.0.1)へアクセス

```bash:localhostへアクセス
[ec2-user@ip-172-31-0-10 ~]$ traceroute localhost
traceroute to localhost (127.0.0.1), 30 hops max, 60 byte packets
 1  localhost (127.0.0.1)  0.022 ms  0.004 ms  0.004 ms
[ec2-user@ip-172-31-0-10 ~]$
```

SGに許可が無くてもアクセスできます。
/etc/hosts にある通り、『ip: 127.0.0.1』に変換してアクセスしています。
イメージ的には:arrow_down:こんな感じ。

![20191110_network_007.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353055/cb125595-45f3-04dc-f43d-6b35317dee40.png)

## プライベートDNSへアクセス

```bash:プライベートDNSへアクセス
[ec2-user@ip-172-31-0-10 ~]$ traceroute ip-172-31-0-10.ap-northeast-1.compute.internal
traceroute to ip-172-31-0-10.ap-northeast-1.compute.internal (172.31.0.10), 30 hops max, 60 byte packets
 1  ip-172-31-0-10.ap-northeast-1.compute.internal (172.31.0.10)  0.019 ms  0.004 ms  0.004 ms
[ec2-user@ip-172-31-0-10 ~]$
```

SGに許可が無くてもアクセスできます。
AWS で予約されたDNSサーバで『プライベートDNS』:arrow_right:『プライベートIP』に変換されています。

次にifconfigでOS上で設定されているネットワークインターフェースの設定を見てみると:arrow_down:

```bash:
[ec2-user@ip-172-31-0-10 ~]$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 9001
        inet 172.31.0.10  netmask 255.255.255.0  broadcast 172.31.0.255
        inet6 fxxx::8xxx:bxxx:fxxx:nnnn  prefixlen 64  scopeid 0x20<link>
        ether 0a:ca:ba:a8:27:94  txqueuelen 1000  (Ethernet)
        RX packets 800  bytes 91217 (89.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 875  bytes 89894 (87.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 64  bytes 4736 (4.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 64  bytes 4736 (4.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[ec2-user@ip-172-31-0-10 ~]$
```

上記の通り、OS内で宛先アドレスが自分だとわかるので、EC2インスタンスから外に出ずにアクセスできます。
そのため、SGを通さないので、アクセスできるのです。
これが別のインスタンスなら必ずSGを通りますので、許可していなければアクセスできないでしょう。

イメージ的には:arrow_down:こんな感じ。

![20191110_network_008.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353055/316d83d6-dd9d-ecdf-6893-dbee01b568f0.png)

## パブリック DNS (IPv4)へアクセス

```bash:パブリックDNS(IPv4)へアクセス
[ec2-user@ip-172-31-0-10 ~]$ traceroute ec2-xx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
traceroute to ec2-xx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com (172.31.0.10), 30 hops max, 60 byte packets
 1  ip-172-31-0-10.ap-northeast-1.compute.internal (172.31.0.10)  0.018 ms  0.005 ms  0.004 ms
[ec2-user@ip-172-31-0-10 ~]$
```

SGに許可が無くてもアクセスできます。
AWS で予約されたDNSサーバで『パブリック DNS (IPv4)』:arrow_right:『プライベートIP』に変換されています。
そのため、『プライベートDNSへアクセス』の時と同様のアクセスルートになります。

## IPv4 パブリック IPへアクセス

```bash:IPv4パブリックIPへアクセス
[ec2-user@ip-172-31-0-10 ~]$ traceroute xx.xxx.xxx.xxx
traceroute to xx.xxx.xxx.xxx (xx.xxx.xxx.xxx), 30 hops max, 60 byte packets
 1  ec2-175-41-192-214.ap-northeast-1.compute.amazonaws.com (175.41.192.214)  18.174 ms ec2-175-41-192-216.ap-northeast-1.compute.amazonaws.com (175.41.192.216)  2.868 ms ec2-175-41-192-220.ap-northeast-1.compute.amazonaws.com (175.41.192.220)  11.470 ms
 2  * * *
 3  * * *
 ~~~~~ 中略 ~~~~~
29  * * *
30  * * *
[ec2-user@ip-172-31-0-10 ~]$
```

SGに許可が無いとアクセスできません。
IPv4 パブリック IPはifconfigで見つからない、かつプライベートIPでもないので、インターネットゲートウェイを通して外に探しに行きます。
しかし、SGでアクセス許可をしていないので、たどり着くことはありません。

イメージ的には:arrow_down:こんな感じ。

![20191111_EC2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353055/0a5a095b-097b-f9bb-7a55-609e36e81057.png)

# まとめ

自分:arrow_right:自分へアクセスする場合、

| IP/DNS | SG許可の要・不要 |備考|
|:-:|:-:|:-:|
|127.0.0.1|不要|ifconfig による|
|localhost|不要|/etc/hosts による|
|プライベートIP|不要|ifconfig による|
|プライベートDNS|不要|プライベートIPと同義|
|IPv4 パブリック IP|要||
|パブリック DNS (IPv4)|不要|プライベートIPと同義|


# 参考URL

- [ネットワークの状態確認(ping, ifconfig, netstatなど)](https://www.wakuwakubank.com/posts/397-linux-network/)
- [AWSのサブネット内で使用できるプライベートIPアドレス](https://qiita.com/wakayama-y/items/a2deff713d14ac755516)
- [IPv4 用の VPC とサブネットのサイズ設定](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Subnets.html#vpc-sizing-ipv4)  
:arrow_right:DNS サーバーの IP アドレスは、常に VPC ネットワークのベースに 2 を付加したものですが、各サブネット範囲のベースに 2 を付加したアドレスも予約されています。
- [セキュリティグループとネットワーク ACL の比較](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Security.html#VPC_Security_Comparison)  
:arrow_right:セキュリティグループ: インスタンスレベルで動作します。
- [パブリック IPv4 アドレスと外部 DNS ホスト名](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-instance-addressing.html#concepts-public-addresses)  
:arrow_right:外部 DNS ホスト名を、VPC の外部からインスタンスのパブリック IP アドレスに解決し、VPC の内部からインスタンスのプライベート IPv4 アドレスに解決します。