VPCを学ぶ - グローバルIPアドレスが付与されていないec2

# グローバルIPアドレスが付与されていないec2

## 概要

インターネットゲートウェイが接続されたVPC+ルーティングされたサブネットに接続したec2インスタンスを作成した。

このインスタンスにはグローバルIPをアタッチしたせいか、直接インターネットにでている（気がする）。

そこで、前回作成したマシンと同じサブネットにグローバルIPがアタッチ **されていない** ec2も用意し、それと比較して理解を深める。

試したところ、グローバルIPがアタッチされていないec2はインターネットに接続することはできなかった。

## つまるところ

インターネットに接続するためには以下の条件が必要である。

1. 参加しているサブネットがIGWにルーティングされていること
1. グローバルIPv4がアタッチされていること

ssh接続し、グローバルIPv4がアタッチされている・されていない双方のネットワーク構成を確認しても違いがみられない。

IGWはサブネットに属しているec2をNATしてインターネットへの接続を提供するものではなく、ec2に割り当てられたグローバルIPアドレスを用いてルーティングしているようだ。(これは後日調べる)


# EC2

## EC2インスタンスを作成

### 作成画面を出す

1. EC2ダッシュボードへ行く
    1. ダッシュボードからサービスを検索「EC2」
1. 左のメニューから「インスタンス」
1. 黄色の「インスタンスを起動」ボタンを押す

### パラメータ入力

**名前とタグ**

`learning-ec2-{{日付}}-2nd` とでもしておく
例) `learning-ec2-20250513-2nd`

**アプリケーションおよびOSイメージ**

デフォルトの「Amazon Linux 2023 AMI」でOK

アーキテクチャなどなどもそのまま。

**インスタンスタイプ**

デフォルトの `t2.micro` でOK。

**キーペア(ログイン)**

前回作成したものを指定

例) `learning-vpc-keypair-25-424`


**ネットワーク設定**

右の「編集」ボタンをクリックして設定する。以下、クリックすることででてくるメニューにおいて操作する。

**VPC**

ここで前回作成したVPCを選択する。
例) `learning-20250505`

**サブネット**

さきほど作成したものが入っていることを確認する

`learning-subnet-20250506` となっているはず

**パブリックIPの自動割り当て**

**『無効化』** を設定する

**ファイアウォール (セキュリティグループ)**

前回作成したものを指定しておく

例) `learning-sg-20250505`

**説明**

デフォルトでOK

**インバウンドセキュリティグループのルール**

デフォルトでOK

**高度なネットワーク設定**

とりあえずここでは開かない。もしかしたらここで厳密に指定できるのかも。

**ストレージを設定**

デフォルトでよい。

**高度な詳細**

開かない

**概要**

インスタンス数は1でよい。他、上で入力したパラメータが表示されていることを確認する。

### 作成

「プレビューコード」を押してコマンドをみておくとよい

```
aws ec2 create-security-group --group-name "learning-sg-20250505" --description "launch-wizard-4 created 2025-05-06T12:38:46.696Z" --vpc-id "vpc-0acf6854a7f39ad7c" 
aws ec2 authorize-security-group-ingress --group-id "sg-preview-1" --ip-permissions '{"IpProtocol":"tcp","FromPort":22,"ToPort":22,"IpRanges":[{"CidrIp":"0.0.0.0/0"}]}' 
aws ec2 run-instances --image-id "ami-0f88e80871fd81e91" --instance-type "t2.micro" --key-name "learning-vpc-keypair-25-424" --network-interfaces '{"SubnetId":"subnet-03c395080ea1c0cf5","AssociatePublicIpAddress":true,"DeviceIndex":0,"Groups":["sg-preview-1"]}' --credit-specification '{"CpuCredits":"standard"}' --tag-specifications '{"ResourceType":"instance","Tags":[{"Key":"Name","Value":"learning-ec2-20250505"}]}' --metadata-options '{"HttpEndpoint":"enabled","HttpPutResponseHopLimit":2,"HttpTokens":"required"}' --private-dns-name-options '{"HostnameType":"ip-name","EnableResourceNameDnsARecord":false,"EnableResourceNameDnsAAAARecord":false}' --count "1" 
```

「インスタンスを起動」ボタンを押す。

# sshしていろいろ確認

今回作ったec2インスタンスはグローバルIPアドレスが存在しないので、前回作成したグローバルIPを持つec2インスタンスに入り、さらにそこから入る。

まずは前回接続したものに接続する。

1. EC2ダッシュボードへ行く
    1. ダッシュボードからサービスを検索「EC2」
1. 左のメニューから「インスタンス」
1. 前回作成した `learning-ec2-{{日付}}` を選択する

ネットワーキングタブを選択すると、「パブリックIPv4アドレス」が割り当てられていることが確認できる。

鍵は先ほどダウンロードしたファイルを指定する。

詳細は `-v` で確認しながら、割り当てられたグローバルIPを指定して `ec2-user@54.242.xxx.yyy` で接続を試みる。

このキーはしらんが接続するか？と言われたら yes と答えて進めれば接続することができる。

```
[pharaohkj] $ ssh -i /Users/pharaohkj/Downloads/learning-vpc-keypair-25-424.pem ec2-user@54.242.xxx.yyy
The authenticity of host '54.242.xxx.yyy (54.242.xxx.yyy)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxx.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '54.242.xxx.yyy' (ED25519) to the list of known hosts.
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
```

## 今回作ったIPを確認

1. EC2ダッシュボードへ行く
    1. ダッシュボードからサービスを検索「EC2」
1. 左のメニューから「インスタンス」
1. 前回作成した `learning-ec2-{{日付}}-2nd` を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50220/4dbbac39-60a0-403b-ae0e-624dff518e68.png)

パブリックIPv4アドレスが - になっており、プライベートIPv4アドレスのみになっていることが確認できる。

今回できたものは 10.0.150.119 なので、↑のターミナルからここにアクセスする。

```
[ec2-user@ip-10-0-105-191 ~]$ ssh 10.0.150.119
The authenticity of host '10.0.150.119 (10.0.150.119)' can't be established.
ED25519 key fingerprint is SHA256:339tvdX4dNk4EVNvGPUJuU9JjzyB/YcgQBEdj2hQgqE.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.0.150.119' (ED25519) to the list of known hosts.
ec2-user@10.0.150.119: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```

鍵がなくてつながらない(そりゃそうだ)。

ベストプラクティスはおいといて、前回ダウンロードした秘密鍵をscpしてしまう。

ターミナルをもう一枚開き、ローカルマシンからコピーする。

最初の `-i` のあとは、キーの指定で、再度そのパスが書いてあるのは「このファイルをscpでコピーしているという意味である。


```
$ scp -i /Users/pharaohkj/Downloads/learning-vpc-keypair-25-424.pem  /Users/pharaohkj/Downloads/learning-vpc-keypair-25-424.pem ec2-user@54.209.xxx.yyy:
```

awsにすでにsshしているターミナル側で、この鍵を指定して今回作ったマシンにsshする。 `ec2-user@ip-10-0-105-191` から `ec2-user@ip-10-0-150-119` にプロンプトがかわっているのがわかる。(IPアドレスぽいものに注目)

```
[ec2-user@ip-10-0-105-191 .ssh]$ ssh -i ~/.ssh/learning-vpc-keypair-25-424.pem 10.0.150.119
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
[ec2-user@ip-10-0-150-119 ~]$
```

### インターネットにつながるか確認

`curl` で試せる。転送されるので `-L` 付きで。

```
[ec2-user@ip-10-0-150-119 ~]$ curl -v -4 -L www.amazon.com
* Host www.amazon.com:80 was resolved.
* IPv6: (none)
* IPv4: 3.162.95.220
*   Trying 3.162.95.220:80...
*   
```

**名前は引けるがつながらない**


### リモートホストを調べる

https://checkip.amazonaws.com にアクセスするとリモホがとれる。IGNを経由していないんだね。

といっても、インターネットにつながらない。名前は引けるがつながらない。

```
[ec2-user@ip-10-0-150-119 ~]$ curl -v -4 -L https://checkip.amazonaws.com
* Host checkip.amazonaws.com:443 was resolved.
* IPv6: (none)
* IPv4: 52.201.98.187, 13.219.35.140, 18.206.23.65, 34.200.134.78, 35.173.7.68, 44.215.101.138
*   Trying 52.201.98.187:443...
```

### ネットワーク設定を確認

`ip` コマンドで現状のネットワークを確認してみる。

#### `link`

IPv4がアタッチされたインスタンスと違ったところは特にない。

```
[ec2-user@ip-10-0-150-119 ~]$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enX0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 06:31:1a:72:3a:e1 brd ff:ff:ff:ff:ff:ff
    altname eni-088b47196589351e5
    altname device-number-0.0
```


#### `addr`

```
[ec2-user@ip-10-0-150-119 ~]$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: enX0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000
    link/ether 06:31:1a:72:3a:e1 brd ff:ff:ff:ff:ff:ff
    altname eni-088b47196589351e5
    altname device-number-0.0
    inet 10.0.150.119/16 metric 512 brd 10.0.255.255 scope global dynamic enX0
       valid_lft 3252sec preferred_lft 3252sec
    inet6 fe80::431:1aff:fe72:3ae1/64 scope link proto kernel_ll
       valid_lft forever preferred_lft forever
```

ipアドレスは以下のようだ。

- `inet 10.0.150.119/16`
- `inet6 fe80::431:1aff:fe72:3ae1/64`

割り当て方式が `dynamic` となっている。動的だとすると、DHCPサーバーがどこかにいるのだろうか？

#### DHCPサーバーを探す

前と同じ方法でログからみつける。 `10.0.0.1` がいるらしい。作ってないけど。

```
[ec2-user@ip-10-0-150-119 ~]$ journalctl -u systemd-networkd
May 13 08:40:03 localhost systemd[1]: Starting systemd-networkd.service - Network Configuration...
May 13 08:40:03 localhost systemd-networkd[1965]: lo: Link UP
May 13 08:40:03 localhost systemd-networkd[1965]: lo: Gained carrier
May 13 08:40:03 localhost systemd-networkd[1965]: Enumeration completed
May 13 08:40:03 localhost systemd[1]: Started systemd-networkd.service - Network Configuration.
May 13 08:40:03 localhost systemd-networkd[1965]: enX0: Configuring with /usr/lib/systemd/network/80-ec2.network.
May 13 08:40:03 localhost systemd-networkd[1965]: enX0: Link UP
May 13 08:40:03 localhost systemd-networkd[1965]: enX0: Gained carrier
May 13 08:40:03 localhost systemd-networkd[1965]: enX0: Gained IPv6LL
May 13 08:40:10 localhost systemd-networkd[1965]: enX0: DHCPv4 address 10.0.150.119/16, gateway 10.0.0.1 acquired from 10.0.0.1
```

#### ルートを比較確認する

`ip r` で確認。違いはない。 


グローバルIPがアタッチされているほう

```
[ec2-user@ip-10-0-105-191 ~]$ ip r
default via 10.0.0.1 dev enX0 proto dhcp src 10.0.105.191 metric 512
10.0.0.0/16 dev enX0 proto kernel scope link src 10.0.105.191 metric 512
10.0.0.1 dev enX0 proto dhcp scope link src 10.0.105.191 metric 512
10.0.0.2 dev enX0 proto dhcp scope link src 10.0.105.191 metric 512
```

今回作って試しているアタッチされいないほう

```
[ec2-user@ip-10-0-150-119 ~]$ ip r
default via 10.0.0.1 dev enX0 proto dhcp src 10.0.150.119 metric 512
10.0.0.0/16 dev enX0 proto kernel scope link src 10.0.150.119 metric 512
10.0.0.1 dev enX0 proto dhcp scope link src 10.0.150.119 metric 512
10.0.0.2 dev enX0 proto dhcp scope link src 10.0.150.119 metric 512
```

#### ARPを比較確認する

```
[ec2-user@ip-10-0-105-191 ~]$ ip neigh
10.0.0.1 dev enX0 lladdr 06:18:15:6d:2d:bd REACHABLE
10.0.150.119 dev enX0 lladdr 06:31:1a:72:3a:e1 STALE

[ec2-user@ip-10-0-105-191 ~]$ ip -4 neigh
10.0.0.1 dev enX0 lladdr 06:18:15:6d:2d:bd REACHABLE
10.0.150.119 dev enX0 lladdr 06:31:1a:72:3a:e1 STALE
10.0.0.2 dev enX0 lladdr 06:18:15:6d:2d:bd STALE
```

```
[ec2-user@ip-10-0-150-119 ~]$ ip neigh
10.0.105.191 dev enX0 lladdr 06:0a:86:42:c3:d9 REACHABLE
10.0.0.1 dev enX0 lladdr 06:18:15:6d:2d:bd STALE

[ec2-user@ip-10-0-150-119 ~]$ ip -4 neigh
10.0.105.191 dev enX0 lladdr 06:0a:86:42:c3:d9 DELAY
10.0.0.1 dev enX0 lladdr 06:18:15:6d:2d:bd REACHABLE
```