インターネットにつながったサーバ
概要
つぎにインターネットとつながっている構成にしてみる。
インターネットゲートウェイを用いて構成し、対象のec2インスタンスにssh接続してどんな状況なのか調べる。
採用すればインターネット側と接続できるはずなので、対象のec2インスタンスにssh接続していろいろと確認できるはずだ。
確認できた。インターネットにもでられた。しかしまだよくわからないことがある、特にルーティング周りが。なので続きは次。
設定の独自解釈のER図
いきなり登場人物が増える
- VPCはサブネットを複数持つ
- EC2はサブネットを指定する
- インターネットゲートウェイIGNはVPCに1:1でアタッチされる
- インターネットゲートウェイへのルーティングはVPCアタッチ時に自動でできるルートテーブルにて指定する
- ルートテーブルはルートに属し、パケットのルートの宛先としてインターネットゲートウェイを指定する
つまるところ
インターネットゲートウェイ=IGWを採用 = 作成後以下の手順を踏むことで、インターネットにアクセスできるEC2インスタンスを用意することができる
- IGWを作成、VPCにアタッチする
- VPCにアタッチするとルーティングテーブルが自動でできる
- このルーティングテーブルを設定する
- このVPCに接続したEC2インスタンスを作成する
- 作成時、グローバルIPを割り当てる
- 割り当てたグローバルIPでsshログインして調べた
- 自分で作ってないけどDHCPサーバがいて、そこからIPもらってる
-
ip a
したけどグローバルIPをもったNICがいない - リモホがグローバルIPになる
ただ、ここではグローバルIPを割り当てたEC2インスタンス1台なので、ルーティングまわりはまだ調査が必要。次の記事へ。
以下手順
VPC
VPCは Virtual Private Cloudの略で、EC2はこれのうちのどこかに所属することになっている。
VPCを作成
作成画面を出す
- VPCダッシュボードへ行く
- ダッシュボードからサービスを検索「VPC」
- 左のメニューから「お使いのVPC」
- 右上の「VPCを作成」ボタンを押す
パラメータ入力
作成するリソース
あえて「VPCのみ」
名前タグ
わかりにくいとツライのでとかにしておく
learning-{{年月日}}-{{名前}}
実例) learning-250417-kato
IPv4 CIDR ブロック
「IPv4 CIDRの手動入力」を選ぶ
IPv4 CIDR
10.0.0.0/16
とする
IPv6 CIDRブロック
ちょっといったんv6は考えないんで IPv6 CIDR ブロックなし
テナンシー
「デフォルト」
タグ
操作なし
作成
プレビューコードはオススメ
aws ec2 create-vpc --instance-tenancy "default" --cidr-block "10.0.0.0/16" --tag-specifications '{"resourceType":"vpc","tags":[{"key":"Name","value":"learning-20250506"}]}'
確認したら、「VPCを作成」ボタンを押す。
デフォルトだと 5VPC/regionなので、割とすぐ上限がくるので注意。
サブネットの作成
作成したVPCの中に、スイッチングハブを設置した感じで作成する。
サーバー(EC2)を作成する際、どのスイッチングハブに接続するかを指定するのが必須なので、ここで作っておかねばならない。
作成画面を出す
- VPCダッシュボードへ行く
- ダッシュボードからサービスを検索「VPC」
- 左のメニューから「サブネット」
- 右上の「サブネットを作成」ボタンを押す
パラメータ
VPC ID
先ほど作ったものを指定する。
例) learning-250417-kato
サブネットの設定
サブネット名
先ほどのに所属してるのがわかるようにしておく
例) learning-subnet-20250506
アベイラビリティーゾーン
ここでAZを指定できる。
「指定なし」だと、自動になるらしい。
いったん「指定なし」としておく
IPv4 VPC CIDR ブロック & IPv4 サブネット CIDR ブロック
VPC作成時に指定した 10.0.0.0/16
が表示されているが、これより狭いブロックを指定する必要がある。
10.0.0.0/16
(同じ値) とする
サブネットを作成
サブネットを作成ボタンを最後に押す
インターネットゲートウェイの作成
作成画面を出す
- VPCダッシュボードへ行く
- ダッシュボードからサービスを検索「VPC」
- 左のメニューから「インターネットゲートウェイ」
- 右上の「インターネットゲートウェイを作成」ボタンを押す
パラメータ
名前タグしかないので名前をつけておく。
例) learning-igw-20250506
インターネットゲートウェイのアタッチ
アタッチ画面へ進む
- VPCダッシュボードへ行く
- ダッシュボードからサービスを検索「VPC」
- 左のメニューから「インターネットゲートウェイ」
- 先ほど作ったものを選択する
- 進んだ画面の右上の「アクション」から「VPCにアタッチ」を選択する
アタッチ画面のパラメータ
使用可能なVPCに先ほど作成したVPCを指定する。
IDを指定するので難しいが、先ほど入力した名前などで検索できる。
例えば learning-250417-kato
などで検索すればよい。
決定したら「インターネットゲートウェイのアタッチ」ボタンを押して進む。
確認
- VPCダッシュボードへ行く
- ダッシュボードからサービスを検索「VPC」
- 左のメニューから「お使いのVPC」
- 先ほど作ったもののVPC IDをクリックして進む
- 最下段から「リソースマップ」のタブを選択する
ルートテーブルの確認
確認の画像で確認できるとおり、作成した記憶のない「ルートテーブル」というものができており、自動で指定されたサブネットからそれが接続されていることが確認できる。
しかし、先ほど作成したigwとサブネットとルートテーブルが接続されていない。
これはインターネットにでられない。
ルートテーブルの確認と編集
- VPCダッシュボードへ行く
- ダッシュボードからサービスを検索「VPC」
- 左のメニューから「ルートテーブル」
- 自動でできたもののルートテーブルIDを選択する
- このIDがわからない場合、「ルートテーブルの確認」で調べることができる
- 採用されているVPC IDと名前タグがそこにも記載されている
- このリストへのルートテーブル一覧にでないときはリロードも試すこと
- このIDがわからない場合、「ルートテーブルの確認」で調べることができる
ここに「ルート」という項目がでており 10.0.0.0/16
はlocalとなっている。
いったん、ルーティングの設定というのを理解するのはおいといて、この 10.0.0.0/16
以外の通信は先ほど作ったインターネットゲートウェイと通信させればよいので
- 「ルートを編集」ボタンを押す
- 現在の設定が1行だけあるのを確認したら「ルートを追加」ボタンを押す
- 新しい行が追加される
- 送信先には
0.0.0.0/0
を指定 - ターゲットにはインターネットゲートウェイを選択し、先ほど作成したigw idを指定する(マウスで選択すれば選択肢がでてくる)
- 送信先には
- 「変更を保存」ボタンを押す
ルートテーブルの再確認
- VPCダッシュボードへ行く
- ダッシュボードからサービスを検索「VPC」
- 左のメニューから「お使いのVPC」
- 先ほど作ったもののVPC IDをクリックして進む
- 最下段から「リソースマップ」のタブを選択する
先ほどと違い、ルートテーブルとigwが接続されているのが確認できる。
EC2
EC2インスタンスを作成
作成画面を出す
- EC2ダッシュボードへ行く
- ダッシュボードからサービスを検索「EC2」
- 左のメニューから「インスタンス」
- 黄色の「インスタンスを起動」ボタンを押す
パラメータ入力
名前とタグ
learning-ec2-{{日付}}
とでもしておく
例) learning-ec2-20250505
アプリケーションおよびOSイメージ
デフォルトの「Amazon Linux 2023 AMI」でOK
アーキテクチャなどなどもそのまま。
インスタンスタイプ
デフォルトの t2.micro
でOK。
キーペア(ログイン)
「新しいキーペアの作成」で作成する、
名前は learning-vpc-keypair-{{日付}}
とでもしておく。
例) learning-vpc-keypair-25-424
今時はED25519だと思うが、自分のSSHクライアントが対応しているものを選んでおくこと。
とりま、今時のMacなら ED25519 & pem でOK。作成するとダウンロードになる。
ダウンロードしたら chmod og-r
などでアクセス権を良い感じに設定する。
[pharaohkj] $ chmod og-r ~/Downloads/learning-vpc-keypair-25-424.pem
[pharaohkj] $ ls -l ~/Downloads/learning-vpc-keypair-25-424.pem
-rw-------@ 1 pharaohkj staff 387 4 24 18:29 /Users/pharaohkj/Downloads/learning-vpc-keypair-25-424.pem
ネットワーク設定
右の「編集」ボタンをクリックして設定する。以下、クリックすることででてくるメニューにおいて操作する。
VPC
ここでさっき作成したVPCを選択する。
例) learning-20250505
サブネット
さきほど作成したものが入っていることを確認する
learning-subnet-20250506
となっているはず
パブリックIPの自動割り当て
『有効化』 を設定する
ファイアウォール (セキュリティグループ)
これはL4で指定できる。どこからもつながらない予定だが、一応「どこからでもsshはできる」という設定にしておく。(= デフォルト)
セキュリティグループ名
learning-sg-{日付}
とする。
例) 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ダッシュボードへ行く
- ダッシュボードからサービスを検索「EC2」
- 左のメニューから「インスタンス」
-
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/'
OSを確認
/etc/issue
では得られない /proc/version
や uname -a
uname -r
を確認してみるとわかる。
[ec2-user@ip-10-0-105-191 ~]$ cat /proc/version
Linux version 6.1.134-150.224.amzn2023.x86_64 (mockbuild@ip-10-0-33-51) (gcc (GCC) 11.5.0 20240719 (Red Hat 11.5.0-5), GNU ld version 2.41-50.amzn2023.0.3) #1 SMP PREEMPT_DYNAMIC Tue Apr 22 22:24:52 UTC 2025
[ec2-user@ip-10-0-105-191 ~]$ uname -a
Linux ip-10-0-105-191.ec2.internal 6.1.134-150.224.amzn2023.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Apr 22 22:24:52 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
[ec2-user@ip-10-0-105-191 ~]$ uname -r
6.1.134-150.224.amzn2023.x86_64
インターネットにつながるか確認
curl
で試せる。転送されるので -L
付きで。
[ec2-user@ip-10-0-105-191 ~]$ curl -v -L www.amazon.com
* Host www.amazon.com:80 was resolved.
* IPv6: 2600:9000:27c2:c800:7:49a5:5fd4:b121, 2600:9000:27c2:c00:7:49a5:5fd4:b121, 2600:9000:27c2:2000:7:49a5:5fd4:b121, 2600:9000:27c2:7200:7:49a5:5fd4:b121, 2600:9000:27c2:8600:7:49a5:5fd4:b121, 2600:9000:27c2:b600:7:49a5:5fd4:b121, 2600:9000:27c2:bc00:7:49a5:5fd4:b121, 2600:9000:27c2:c400:7:49a5:5fd4:b121
* IPv4: 18.160.11.108
* Trying 18.160.11.108:80...
* Connected to www.amazon.com (18.160.11.108) port 80
> GET / HTTP/1.1
> Host: www.amazon.com
> User-Agent: curl/8.5.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: CloudFront
< Date: Tue, 06 May 2025 13:20:28 GMT
< Content-Type: text/html
< Content-Length: 167
< Connection: keep-alive
< Location: https://www.amazon.com/
< X-Cache: Redirect from cloudfront
< Via: 1.1 68a3b1d5c75429221abc685a453afb60.cloudfront.net (CloudFront)
< X-Amz-Cf-Pop: IAD12-P3
< Alt-Svc: h3=":443"; ma=86400
< X-Amz-Cf-Id: ZX2DghwhtBjJ07X3iLqv6EFZsEW8DL9g0BSyDi4BmONqOhyaixL6pQ==
<
* Ignoring the response-body
* Connection #0 to host www.amazon.com left intact
* Clear auth, redirects to port from 80 to 443
* Issue another request to this URL: 'https://www.amazon.com/'
* Host www.amazon.com:443 was resolved.
* IPv6: 2600:9000:27c2:c400:7:49a5:5fd4:b121, 2600:9000:27c2:c800:7:49a5:5fd4:b121, 2600:9000:27c2:c00:7:49a5:5fd4:b121, 2600:9000:27c2:2000:7:49a5:5fd4:b121, 2600:9000:27c2:7200:7:49a5:5fd4:b121, 2600:9000:27c2:8600:7:49a5:5fd4:b121, 2600:9000:27c2:b600:7:49a5:5fd4:b121, 2600:9000:27c2:bc00:7:49a5:5fd4:b121
* IPv4: 18.160.11.108
* Trying 18.160.11.108:443...
* Connected to www.amazon.com (18.160.11.108) port 443
* ALPN: curl offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
* CApath: none
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_128_GCM_SHA256 / x25519 / RSASSA-PSS
* ALPN: server accepted h2
* Server certificate:
* subject: CN=www.amazon.com
* start date: Sep 13 00:00:00 2024 GMT
* expire date: Aug 23 23:59:59 2025 GMT
* subjectAltName: host "www.amazon.com" matched cert's "www.amazon.com"
* issuer: C=US; O=DigiCert Inc; CN=DigiCert Global CA G2
* SSL certificate verify ok.
* Certificate level 0: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
* Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
* Certificate level 2: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
* using HTTP/2
* [HTTP/2] [1] OPENED stream for https://www.amazon.com/
* [HTTP/2] [1] [:method: GET]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: www.amazon.com]
* [HTTP/2] [1] [:path: /]
* [HTTP/2] [1] [user-agent: curl/8.5.0]
* [HTTP/2] [1] [accept: */*]
> GET / HTTP/2
> Host: www.amazon.com
> User-Agent: curl/8.5.0
> Accept: */*
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
< HTTP/2 503
< content-type: text/html
< server: Server
< date: Tue, 06 May 2025 13:20:28 GMT
< x-amz-rid: S950GGZQW8GZF8C130B8
< vary: Content-Type,Accept-Encoding,User-Agent
< last-modified: Thu, 17 Apr 2025 06:06:47 GMT
< etag: "a6f-632f334f24bc0"
< accept-ranges: bytes
< strict-transport-security: max-age=47474747; includeSubDomains; preload
< x-cache: Error from cloudfront
< via: 1.1 7375f2360b80ec8c602f04aa2cc7a57c.cloudfront.net (CloudFront)
< x-amz-cf-pop: IAD12-P3
< alt-svc: h3=":443"; ma=86400
< x-amz-cf-id: 3l3T28lnZSgnilAVb3F5_-dKiE6amG3Y3ivavHUzMjHgvoiZS5Af1w==
<
<!--
To discuss automated access to Amazon data please contact api-services-support@amazon.com.
For information about migrating to our APIs refer to our Marketplace APIs at https://developer.amazonservices.com/ref=rm_5_sv, or our Product Advertising API at https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html/ref=rm_5_ac for advertising use cases.
-->
<!doctype html>
以下略
リモートホストを調べる
https://checkip.amazonaws.com にアクセスするとリモホがとれる。IGNを経由していないんだね。
[ec2-user@ip-10-0-105-191 ~]$ curl https://checkip.amazonaws.com
54.209.136.14
ネットワーク設定を確認
ip
コマンドで現状のネットワークを確認してみる。
link
[ec2-user@ip-10-0-105-191 ~]$ 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:0a:86:42:c3:d9 brd ff:ff:ff:ff:ff:ff
altname eni-0ea173d906b609c00
altname device-number-0.0
1: lo これについては、今後いったんスルー。
addr
[ec2-user@ip-10-0-105-191 ~]$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
...
2: enX0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000
link/ether 06:0a:86:42:c3:d9 brd ff:ff:ff:ff:ff:ff
altname eni-0ea173d906b609c00
altname device-number-0.0
inet 10.0.105.191/16 metric 512 brd 10.0.255.255 scope global dynamic enX0
valid_lft 3255sec preferred_lft 3255sec
inet6 fe80::40a:86ff:fe42:c3d9/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
ipアドレスは以下のようだ。
inet 10.0.105.191/16
inet6 fe80::40a:86ff:fe42:c3d9/64
割り当て方式が dynamic
となっている。動的だとすると、DHCPサーバーがどこかにいるのだろうか?
DHCPサーバーを探す
とりあえずログからみつける。 10.0.0.1
がいるらしい。作ってないけど。
[ec2-user@ip-10-0-105-191 ~]$ journalctl -u systemd-networkd
May 06 12:51:14 localhost systemd[1]: Started systemd-networkd.service - Network Configuration.
May 06 12:51:14 localhost systemd-networkd[1965]: enX0: Link UP
May 06 12:51:14 localhost systemd-networkd[1965]: enX0: Gained carrier
May 06 12:51:14 localhost systemd-networkd[1965]: enX0: DHCPv4 address 10.0.105.191/16, gateway 10.0.0.1 acquired from 10.0.0.1
May 06 12:51:14 localhost systemd-networkd[1965]: enX0: Gained IPv6LL
pingもかえってくる
[ec2-user@ip-10-0-105-191 ~]$ ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=255 time=0.256 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=255 time=0.287 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=255 time=0.324 ms
64 bytes from 10.0.0.1: icmp_seq=4 ttl=255 time=0.302 ms
^C
--- 10.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3151ms
rtt min/avg/max/mdev = 0.256/0.292/0.324/0.024 ms
DHCPオプションセット
ルートテーブルが自動でできたが、DHCPオプションセットというのも自動できているようだ。
中をみてもよくわからないのでいったんここではスルー。
DHCPサーバを使う設定はどこか
Amazon Linux 2023 では systemd-networkd
が採用されており、以下のファイルを参照せよとのこと。
このネットワーク動作は、/etc/systemd/network ディレクトリにカスタム設定ファイルを配置して、/run/systemd/network に含まれるデフォルトの設定を上書きすることでカスタマイズできます。
[ec2-user@ip-10-0-105-191 ~]$ ls /etc/systemd/network/
[ec2-user@ip-10-0-105-191 ~]$ ls -l /run/systemd/network/70-enX0.network
lrwxrwxrwx. 1 root root 39 May 6 12:51 /run/systemd/network/70-enX0.network -> /usr/lib/systemd/network/80-ec2.network
[ec2-user@ip-10-0-105-191 ~]$ cat /run/systemd/network/70-enX0.network
[Match]
Driver=ena ixgbevf vif
[Link]
MTUBytes=9001
[Network]
DHCP=yes
IPv6DuplicateAddressDetection=0
LLMNR=no
DNSDefaultRoute=yes
[DHCPv4]
UseHostname=no
UseDNS=yes
UseNTP=yes
UseDomains=yes
[DHCPv6]
UseHostname=no
UseDNS=yes
UseNTP=yes
WithoutRA=solicit
なるほど DHCP=yes
が確認できる。
書式などはこのウェブページが見やすいかもしれない。