「Amazon Web Services基礎からのネットワーク&サーバー構築」記録
内容
「Amazon Web Services基礎からのネットワーク&サーバー構築」を読むので、その記録。
目的
AWS上でサーバー構築できるようになること。
方針
読んでためになったこと、疑問に思ったことをメモしてく。
調査にはchat-gptを使用しているところもある。
chat-gptで生成されたものなので間違えている可能性もあるが、間違えよりも解答の速さを優先して使用している。。
また、体感chat-gptが間違えてる確率は結構低い(と思っている)
Chapter1 システム構築をインフラから始めるには
機能を提供するソフトウェアをインストールしたものがサーバーになる
Webサーバーやデータベースサーバは必ずしも別サーバーであるわけではなく、同一のサーバー内にWebサーバーとデータベースサーバを立てることもできる。
対応する機能のソフトウェアを入れさえすれば、そのサーバーになれる。
なので、1つのサーバがWebサーバとデータベースサーバーの役割を担うことができる。
NATとは?
DBはプライペートサブネットに構築されるが、このままだとインターネット通信ができない。
それを可能にするのがNAT(Network Address Translation)。
DB → インターネッtの接続は許可し、インターネット → DBの通信は許可しない。
Chapter2 ネットワーク構築する
パブリックIPアドレスとプライベートIPアドレスの違いは?
- パブリックIPアドレス
- インターネット上で一意に識別される
- ISPによって割り当て。(ICANNが大元でIPアドレスを管理してるが、その在庫がもうないらしい。)
- セキュリティ対策必要
- プライベートIPアドレス
- ローカルのみで使用される。インターネット上では一位ではない
- ネットワーク管理者やルータによってローカルネットワーク内で割り当て
パブリックIPアドレスとプライベートIPアドレスが重複することはない?
重複しない。
プライベートIPアドレスの範囲は、192.168.x.x, 10.x.x.x, 172.16.x.x ~ 172.31.x.xなど。
パブリックIPアドレスは、プライベートアドレス範囲外のアドレスになっている。
また、プライベートIPアドレスが固定である場合、ネットワーク内の他のデバイスはそのデバイスのIPアドレスを事前に知ってるため、DNSに問い合わせしなくて済む。
ネットワーク部とホスト部
192.168.0.0 ~ 192.168.255.255がIPアドレス範囲の場合
「 192.168」をネットワーク部、「0.0~.255.255」をホスト部と呼ぶ。
またこの表記は長いので、CIDR表記かサブネットマスク表記が使用される。
CIDR表記では、上のアドレス範囲は「192.168.0.0/16」で表記される。
サブネット表記では、上のアドレス範囲は「192.168.0.0/255.255.0.0」で表記される。
サブネット表記だとどこか固定なのかぱっと見でわかるからいいかも。
CIDRの単位
/24はあくまで一例であり、/28, /20でもいい。
さらには、/16で区切ったものを/24で区切るみたいなこともしてもいい。
サブネットって、複数のAZに属せる気がしたのだけどそんなことない?
そんなことない。
各サブネットは単一のAZに属する。
他のAZでも同じ環境が必要であれば、同じ構成でサブネットを作成する必要がある。
AWSの試験を勉強しててそんな気になってたけど、自分の勘違い。
TCP/IPでは「ルータ」がIPアドレスを見てより近いネットワークへとパケット転送させる
そんなことができるのか。でも聞いたことがある。
というか、それなら、それぞれのパケットが別ルートを通りながら最終地点に到着することがあり得るのか。
またここで言ってる「ルータ」は、家庭用のWifiルータのようなものではなく、より高度で専門的なネットワーク管理とデータルーティングが行えるもの。
Wifiルータがルーティング判定なんて高度なことできるのかなと思っていたけど、案の定できないらしい。
また、より近いルータを判定するために、ルートテーブルが存在する。
「IPアドレスの値が幾つの時に、どのネットワークに流すべきか」の情報をkey value形式で保持する。
そして、このルートテーブルはルーティングプロトコルを使用して、ルータ同士で情報を交換し作成される。
P.50 VPCとサブネットのルートテーブルが存在することに注意。
それぞれのルートテーブルは別物。
あるサブネットのルートテーブルのみを変更したいのであれば、新しくルートテーブルを作成して変更する。
P.50 ルートテーブルの読み方について
この送信先とかの話は、ルーター内部から外へ通信する際に用いられる。
この場合だと内部からの通信は基本インターネットゲートウェイに流れ、10.0.0.0/16は内部のサブネットで処理される。
Chapter3 サーバーを構築する
p56 インスタンスのIPアドレス
「VPC内で通信するためのプライベートIPアドレス」と「インターネットで通信するためのパブリックIPアドレス」が存在する。
インスタンスに直接パプリックIPアドレスを紐づけるのか。まあ、じゃないと直接通信できないか...?
いや、でもALBで受診してそれをプロキシみたいにする方法もあるよな。だから別にインスタンスに必ずパブリックIPアドレス必要ないんじゃないかと思ってきた。
p59 EC2の設定値
- AMI: テンプレートのようなもの。ここでOSなどの設定が入ってる。探せばたくさんある。
- インスタンスタイプ: サーバーの性能を決める
- キーペア: インスタンスにログインする際に必要となる鍵
- ネットワーク設定
- VPCとサブネット
- セキュリティグループ
p60 インスタンスにログインする時になぜキーペアが必要なのか?
シンプルsshログインするため。
これによりパスワードよりも安全にログインすることができる。
また通信内容も暗号化される。
ただ、キーペアが必要ない設定もあった気がする。IAMロールを割り当てればよかった気がする...?
p60 .pemとは?
SSL/TLS証明書や秘密鍵、公開鍵などの暗号化関連の情報を格納するためのファイル形式。
「Privacy Enhanced Mail」の略。
今回は、秘密鍵が格納されていた。
p74 sshログインの警告
The authenticity of host '3.112.45.165 (3.112.45.165)' can't be established.
ED25519 key fingerprint is SHA256:gI2uxRH8mvebJmgIuhHe/J87q0huZxQrxoMwdE8enPA.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
が出た。
これはsshで初めてリモートサーバーにアクセスする際に表示されるワーニング
初めて接続するサーバーだと、それが正しいサーバーなのか判別することができない。
そのため接続使用してるサーバーの公開鍵のFIngerPrintを指定することで、意図通りのサーバーにアクセスしてることを保証する。
yesと答えた場合、fingerPrintを確認せず、接続する。
p79 ルーティングプロトコル
ISPやAWSなどある程度大きいネットワークは、そのネットワークを管理する「AS番号」を持つ
EGPというプロトコルでは、このAS番号をやりとりして、どのネットワークがどこに存在するかをやりとりする。
IGPというプロトコルでは、内部ルータ同士で詳細の情報を交換する。
EGPで大まかな情報(郵便で言うと日本、東京)やりとりし、IGPで詳細情報(各地域)を交換する
sshdと呼ばれるプログラムのおかげでssh接続できる。
サーバー上でsshdプログラムが動いている。
サーバー上の特定のポートで通信を待ち受ける。
[ec2-user@ip-10-0-1-10 ~]$ sudo lsof -i -n -P
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd-n 1960 systemd-network 17u IPv4 27756 0t0 UDP 10.0.1.10:68
systemd-n 1960 systemd-network 19u IPv6 16674 0t0 UDP [fe80::417:f8ff:fe4a:984d]:546
sshd 2160 root 5u IPv4 17281 0t0 TCP *:22 (LISTEN)
sshd 2160 root 7u IPv6 17283 0t0 TCP *:22 (LISTEN)
chronyd 2189 chrony 7u IPv4 17467 0t0 UDP 127.0.0.1:323
chronyd 2189 chrony 8u IPv6 17468 0t0 UDP [::1]:323
sshd 2488 root 5u IPv4 19031 0t0 TCP 10.0.1.10:22->124.142.34.222:58818 (ESTABLISHED)
sshd 2506 ec2-user 5u IPv4 19031 0t0 TCP 10.0.1.10:22->124.142.34.222:58818 (ESTABLISHED)
sshdいるわ。
複数いるけどなんでだろう...?->接続中のものが表示されているのか。
sshd 2160 root 5u IPv4 17281 0t0 TCP *:22 (LISTEN)
sshd 2160 root 7u IPv6 17283 0t0 TCP *:22 (LISTEN)
そして上にIPv4とIPv6で待ち受けている。*は全てのIPアドレス受け入れてる意味。ポートは22。
サーバー上でどのプログラムがどのポートで待ち受けているのかわかるとセキュリティ上の問題があるので、sudoコマンドじゃないと表示できないようになっている。
ウェルノーンポート
0~1023まではウェルノーンポートと呼ばれ、代表的なアプリケーションが使うポート番号。
sshは22、httpは80、httpsは443
ポートを指定しない場合、デフォルトのこのウェルノーンポートが使われる。
ちなみに、複数のアプリで同一のポート番号を使用することはできない。
ポート番号はサーバー上の特定のプロセスまたはサービスに一意にバインドされるため。
複数のHTTPS対応アプリケーションを動かす場合下記の選択肢がある
- 仮想ホスティング: 同じIPアドレスとポート番号を使用し、ヘッダーなっどでルーティングする。
- リバースプロキシ: 一回普通に受け取り、情報によってリクエストを転送する
- 異なるIPアドレスを使用する
エフェメラルポート
クライアントからサーバーへ通信する時に使用されるポート。
クライアント側でもポートが必要。
エフェラメラレルポートは、サーバと接続してる時だけ使われる。
OSによって動的に割り当てられる。
ファイアウォールとは?
「通して良いデータだけを通して、それ以外を遮断する機能」の総称。
簡単な構造のものがパケットフィルタリング。
IPアドレスや、ポート番号、通信種別(TCP, UDP)などで判別することができる。
AWSではセキュリティグループがこの役割を担う。
p90 インスタンスへのアクセエス方法
ターミナルでsshログインする以外にも、AWSのコンソールからいじる方法もある
Chapter4 Webサーバソフトをインストールする
コマンド説明
sudo dnf -y install httpd
dnfはパッケージマネージャー。YUMの後継
sudo systemctl start httpd.serviced
systemctlhはシステムおよびアプリケーションサービス(デーモンとも呼ばれる)を起動停止再起動するコマンド。
デーモンとは、プロセスの一種で、バッググランドで実行されるプログラムやサービスのこと。
デーモンは、ファイル転送、メール配信、システム監視、ログ記録など、特定のタスクを自動的に実行するために用いられる
ユーザのインタラクションが存在しない。
sshdのデーモンが動いてるから、sshログインできる。
sudo systemctl enable httpd.service
enableにすることで、サーバー再起動もhttpdのデーモンが動く
ps -ax
- -a全てのプロセス。-xは他の端末に紐づけられてるプロセスも表示
nslookup google.com
dig google.com
--- nslookup google.com
Server: ここはルータの情報
Address: ここはルータの情報#53 <- DNSのウェルノーンポート。
Non-authoritative answer:
Name: google.com
Address: 142.251.42.206
Name: google.com
Address: 2404:6800:4004:822::200e
---
dnsの動きを見るためのコマンド。
digの方が新しい。
DNSは最初はUDPで通信されていたが、近年はTCPになりつつある。
DNS
トップレベルドメインから順々に解決する。
VPCに、VPN内の名前解決をするオプション機能が存在する。するとインスタンスにDNS名が設定されるようになる。
ec2-x-x-x-xap-northeast-1.compute.amazonaws.com
感じでアクセスできる。
なるほど、どうやってDNSサーバーに登録するのだろうと思っていたのだけど、AWSのドメインを間借りしてる感じなのか。
自分のカスタムドメインを割り当てる場合は、DNSに登録するなどの作業が必要になるんだろうな。Route53でそこ辺の設定をすることができる。
現在の設定だとDNSは毎回ランダムに割り当てられるが、Elastic IPアドレスを使用すると固定化される。
Chapter5 HTTPの動きを確認する
httpでアクセしたユーザにhttpsへリダイレクトさせる
なるほど、確かに大事そう。
http://www.google.com/ でアクセスすると、httpsにリダイレクトされるわ
http 1.xと2の違い
http 1.xでは、1つのコンテンツをやり取りする際に、マイカチ接続をし直すやり方で受信していた
http/2は1つの接続で複数のコンテンツを並行してやり取りする方式。
擬似ヘッダーなどの新しい概念が存在している。
Content-Typeヘッダーの付与
Apacheなどの多くのWebサーバは、静的コンテンツを返すときに、そのファイルの拡張子によって、適切なContent-Typeヘッダーをつけることが多い
Cookie
ヘッダーにログイン情報などを付与することでユーザの状態を保持する。
set-cookiesが付与されるとブラウザはその情報をローカルに保存する。
保存してるcookieを後続のリクエストで使用することにより、状態を保持する。
Cookieで保持される情報は、セッションIDが多い。
基本的にサーバー側でユーザの状態を保持しておき、それをセッションIDで引くスタイル。
talnet
プロセス間の通信プロトコル。リモートコンピュータと通信できる。暗号化のないssh。
単純にテキストを流すだけ。
接続先はtalnetサーバーか、ポートを変更すれば任意のサービスに接続できる。
自身で起動してるapacheサーバーにアクセスできるんだな。
$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1
Host: localhost
HTTP/1.1 403 Forbidden
Date: Sat, 18 Nov 2023 22:32:16 GMT
Server: Apache/2.4.58 (Amazon Linux)
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Content-Type: text/html; charset=UTF-8
<html><body><h1>It works!</h1></body></html>
Connection closed by foreign host.
ユーザの権限によって使えるポートと使えないポートが存在
1023番以下はrootユーザしか使えない。
1024以上は一般ユーザでも使える。
だから一般ユーザとして試すときは、portを8080とかでhttpサーバーを立てる。
またポートを指定してサービスを立ち上げることができるので、1台のサーバーで複数のWebサーバーを構築できることがわかる。
ただし、ポートの競合だったりセキュリティだったりを気をつけないといけない。
簡単にサーバー構築できた
const http = require('http');
const server = http.createServer((req, res) => {
// GETメソッドのリクエストのみを処理する
if (req.method === 'GET') {
const userAgent = req.headers['user-agent']; // ユーザエージェントを取得
// 応答のヘッダを設定(Content-Typeをapplication/jsonにする)
res.writeHead(200, { 'Content-Type': 'application/json' });
// ユーザエージェント情報を含むJSONオブジェクトを作成
const responseObject = {
message: 'Hello, World!',
userAgent: userAgent
};
// JSONオブジェクトを文字列に変換して送信
res.end(JSON.stringify(responseObject));
} else {
// GETメソッド以外のリクエストには404を返す
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('Not Found');
}
});
const PORT = 8080;
server.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
意外と簡単にサーバーって構築できるんだな。
Chapter6 プライベートサブネットを構築する
サブネットは別のAZに存在しても問題なく通信できる
できるんだ…。でもこれやったらパブリックとプライベート間の通信はどうなるのだろう?ネットにプライベートサブネットのIPアドレスを公開してないと、通信できなくない…?そんなことはないのかな?
→ プライベートIPアドレスを使用できるので問題ない。
また、異なるAZはシンプル動作が遅くなるのでお勧めされていない
ルートテーブルについて
ルートテーブルに送信先しか設定しないのはなぜ?受信についての設定はしなくていいの?
→ 受信の制御は、セキュリティグループやACLで行う。
そもそも、ルートテーブルは、ネットワークトラフィックが送信される先のルーティングを行う設定。サブネット内から外に向かうときにどこをみればいいをいじるもの。
受診については、DNSからIPアドレスがわかり自動的にルーティングされるので、ルーティングルールが不要。ただ、このIPアドレスの通信は拒否したい みたいなケースが見られるので、そのときはセキュリティグループやACLを使用する。
セキュリティグループのソースにセキュリティグループを設定できる
例えばプライベートサブネットへの通信は、パブリックサブネットしか許可しない。みたいな設定できる。
これいいな。やりたいことは直感的にこれだもんな。仮にIPアドレスの範囲が変わっても問題なく通信できると言うことになるし。
Ping
pingはICMPプロトコルを使用している。
そのため、通信するにはセキュリティグループでICMPプロトコルを許可する設定をする必要がある。
pingが失敗する=サーバー停止 みたいに思われるが、シンプルにICMPの許可をし忘れてるだけだったりすることに注意。
踏み台サーバー
ローカルからDBサーバーに直接通信することはできない。
一方Webサーバーは、DBサーバにアクセスすることができる。
そのため、ローカルからDBサーバーにアクセスする際には、一旦Webサーバにログインし、そこからDBサーバーにログインする。
SCP(Secure Copy) SFTP(Secure File Transfer Protocol)
WebサーバーからDBサーバーにログインするには秘密鍵が必要。
そのために、Webサーバに秘密鍵を送る必要があり、それに使用されるのがSCPやSFTP。
scp -i a.pem a.pem ec2-user@x.x.x.x:~/
scp便利だ。こんな簡単にファイルを送ることができるのか。
github actionsで何かを送るときも、こんな感じでやればいいのだろうな。
SSHポートフォワード
Webサーバーを経由してるものの、直接接続してるように見える。
WebサーバでSSHで任意のポートを受信状態にして、それを別サーバーに転送する方法。
とりあえず単語だけ覚えおこう。
Chapter7 NATを構築する
NATとは?
プライベートサブネットからのインターネットに接続を可能にするもの。
プライベートサブネットにあるサーバーはインターネット通信できない。
そのためサーバーのアップデートやソフトウェアのアップデートができない。
踏み台サーバーからscpコマンドで移すこともできるが、大変すぎる。
それを解決するのがNAT。
NATは、IPアドレスを変換する装置。
2つのネットワークインターフェースを持ち、1つはパブリックIPアドレス、もう1つはプライベートIPアドレス。
DBからインターネットへ通信する際は、NAT側で送信元をパブリックIPアドレスに上書きして通信する。
そして、帰ってきたパケットをそのままプライベートIPアドレスに流す。
プロキシの動きをする。
インターネットからプライベートIPアドレスへの通信はできないので、セキュリティ的に安全。
NATには、「IPアドレスだけを置換するもの」と「IPアドレスとポート番号をの両方を置換するものがある」。
後者の場合、1つのパブリックIPアドレスを複数ホストで共有できる。NAPTと呼ばれる。
ルーターもNATの形式になっている。プロバイダーから割り当てされるのが1つのIPアドレスのため。
NATの導入方法
- NATインスタンス
- NATソフトウェアがインストールされたEC2インスタンス。
- NATゲートウェイ
- NAT専用に構成された仮想的なコンポーネント
- サブネットを選択するだけで構成できるし、自動でスケールアップ。マネージドサービスってやつか。
NATゲートウェイにElastic IPアドレスを割り当てる理由は?
Elastic IPアドレスは、IPアドレスが固定になるもの。というか必須項目になってる。
NATゲートウェイのIPアドレスが変わらないようにするために設定するのかな?
NATゲートウェイの接続タイプにPrivateがあるけどこれは何?
インターネット接続じゃなくて、他のサービスにアクセスしたい時の話なのかな
• Private (プライベート) - プライベートサブネットのインスタンスは、プライベート NAT ゲートウェイを介して他の VPC またはオンプレミスのネットワークに接続できます。この場合、NAT ゲートウェイからのトラフィックを Transit Gateway または仮想プライベートゲートウェイ経由でルーティングできます。elastic IP アドレスをプライベート NAT ゲートウェイに関連付けることはできません。プライベート NAT ゲートウェイを使用して VPC にインターネットゲートウェイをアタッチできますが、プライベート NAT ゲートウェイからインターネットゲートウェイにトラフィックをルーティングすると、インターネットゲートウェイによってトラフィックがドロップされます。
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-nat-gateway.html
他のVPCやオンプレミスの環境にアクセスするための設定なのか。
ルートテーブルはVPCに紐づく?それともサブネット?
基本的にはサブネット。
しかし、VPC全体に影響を与える要素も存在する。
VPCにはデフォルトのルートテーブルを持っており、サブセットが作成された際このルートテーブルが適用される。
サブネットに別のルートテーブルを関連付けることで、VPC内の特定のサブネットのトラフィックルーティング変更できる。
サブネット固有の設定をする際は、毎回ルートテーブル作成して、新しく紐付けした方がいいな。
NATゲートウェイとElastic IPアドレスは料金かかるから気をつけて
毎回削除するのを忘れないように
Chapter8 DBを用いたブログシステムの構築
DBもバックグラウンドサービスなんだな
sudo systemctl start mariadb
これで起動する
$ ps -ax | grep db
1957 ? Ss 0:00 /usr/bin/dbus-broker-launch --scope system --audit
1972 ? S 0:00 dbus-broker --log 4 --controller 9 --machine-id ab697e395c964543a73d7c4dfa81282f --max-bytes 536870912 --max-fds 4096 --max-matches 16384 --audit
3390 ? Ss 0:00 /usr/lib/systemd/systemd-userdbd
29012 ? Ssl 0:00 /usr/libexec/mariadbd --basedir=/usr
29106 pts/0 R+ 0:00 grep --color=auto db
mariadbdいるね。
ログイン方法
mysql -u root -p
-u root:ユーザ名指定してる。rootユーザにログイン。
-p: MySQLサーバーに接続する際にパスワードの入力を要求します。逆にこれつけないとパスワードはどこで入力するんだ? → ERROR 1698 (28000): Access denied for user 'root'@'localhost’
と表示された。つけないといけないらしい。
DBの作業怖そう…こいつが消えたら終わってしまう…
DBサーバーにアクセスするには、シンプルにmysqlコマンドを叩くだけ
mysql -h 10.0.2.10 -u wordpress -p
しかも、ログインすることができるのか、別サーバから。
-h 10.0.2.10
: このオプションはMySQLサーバーのホストアドレスを指定します。
tar
tar xzvf latest-ja.tar.gz
-
tar
: これはファイルアーカイビング(グルーピング)および圧縮・展開のための標準的なUnixツールです。 -
x
: これは「extract」の略で、ファイルをアーカイブから展開することを意味します。 -
z
: これはgzip圧縮を使用しているアーカイブを処理するためのオプションです。.tar.gz
や.tgz
形式のファイルを展開する際に用います。 -
v
: 「verbose」の略で、詳細な出力を表示するオプションです。このオプションを使用すると、アーカイブから展開されるファイルのリストが表示されます。 -
f
: これは「file」の略で、次に続く文字列が処理するファイルの名前であることを示します。
/var/www/html
apachで表示するファイルはここにいる。
ここがapacheにおいてのデフォルトのドキュメントルートであり、ウィ部コンテンツを提供するために使用する基本的なデイレクトり。
ブラウザを通じてアクセス可能。
Aacheの設定ファイルでここのpathが設定されている。異なるディレクトリを使用することも可能。
webサーバガ直接アクセスできるファイルのみを置くべき。重要なファイルを置いてはいけない。そしてchmodもちゃんとするべき
sudo chown apache:apache /var/www/html -R
sudo chown apache:apache /var/www/html -R
-
sudo
: 「Super User DO」の略で、このコマンドをrootユーザーの権限で実行することを意味します。多くのシステム管理コマンドは、高い権限を必要とするため、**sudo
**を使用して実行されます。 -
chown
: 「Change Owner」の略で、ファイルやディレクトリの所有者(オーナー)とグループを変更するコマンドです。 -
apache:apache
: この部分は「ユーザー名:グループ名」の形式で、所有者とグループを指定しています。ここでは、ユーザーもグループも「apache」と指定されています。これは、Apache Webサーバーが実行されるユーザーとグループの両方を指します。- このユーザ名グループ名はどこで定義されてるもの?OSかな?
- → OSのユーザ、グループの機能を利用。apacheを入れた際に自動でapacheユーザ、グループが作成される。
- → ユーザ一覧は、cat /etc/passwd、グループはcat /etc/groupで見れる。プロセスごとに作成されていることがわかる。いつの間にそんなことをしていたのか
-
/var/www/html
: このパスは、所有権を変更する対象のディレクトリを指します。この場合、Apacheのデフォルトのドキュメントルートディレクトリです。 -
R
: このオプションは「recursive」の略で、指定されたディレクトリとその中のすべてのファイルおよびサブディレクトリに対して、指定された所有権の変更を適用します。
Chapter9 TCP/IPによる通信の仕組みを理解する
TCP / IP
- アプリケーション層: 送るデータ
- トランスポート層: ポート番号の指定、データ長
- インターネット層(またはネットワーク層): IPアドレスの指定、データ長、生存期間
- ネットワークインターフェース層(またはリンク層): MACアドレスの指定、ヘッダー&分割
MACアドレスヘッダー
TCP/IPでは最終的にネットワークインターフェース層でMACアドレスでラップされる。
この時、MACアドレスしかない状態で送信先にデータを届けないといけないように見えるが、どのようにしているのか?
→ ARPというプロトコルで解決している。
このIPアドレスのホストのMACアドレスは何ですか?(ARP要求)と聞き、
このMACアドレスはこれですと返す(ARP応答)を返す。
これにより、MACアドレスとIPアドレスの対応表を作ることができる。
その情報をルータでもつ。
ちなみに、ARPの処理は実際にクライアントとサーバー間で直接行われているわけではなく、各ルータで実行される。そのため対応表は各ルータで保持することになる。そして2回目以降はMACアドレスとIPアドレスの対応表から通信を行う。=ARPの対応表はサブネット内にとどまる。
MACアドレス
パソコンやサーバ、各種ネットワーク機器には、唯一無二の「MACアドレス」が付与されている。
工場出荷時に重複がないようにしている。(そんなことができるのか?)
MACアドレス重複ないようにする方法
MACアドレスは通常、48ビット(6バイト)の長さで、ハードウェア製造時にネットワークインターフェースカード(NIC)に割り当て
最初の3バイトはOUI**(Organizationally Unique Identifier)と呼ばれ、製造元を識別する個別IDになっている。この部分は**IEEE(Institute of Electrical and Electronics Engineers)によって管理され、各ハードウェア製造業者にユニークなOUIが割り当て
残りの3バイトは製造元でユニークなナンバーになっている
3バイトって、256^3=16,777,216だから意外と少なくない?
→ 大きな会社は複数のOUIを取得するらしい。
けど、今度はOUIのほうが足りなくなる気がする…?
→ 19,148らしい。「MAC Address Block Large (MA-L)」に記載されているらしい。
意外と使用されてないんだな。工場を持つような大きな会社がそこまでないのか。まあ確かに言われてみればそんなにないのか。
また、MACアドレスはローカルネットワークでしか使用されないので、そもそもかぶることが少ないよね、みたいな意見もある https://jp.quora.com/なぜ業界の人は-IP4アドレスの枯渇は気にするのに-MACアド
DNSについて
毎回通信する時に、DNS名前解決のための通信を走らせているんだな。
DNSもサーバーだろうから、落ちたりするのだろうか?
DDoS攻撃を受けることがあったらしい、、そこのプロバイダー使ってたTwitterとかSpotifyが使えなくなる。。
なるほど、プロバイダーが運用してるから、対応もプロバイダーがやらないといけないのか、大変だ。。
UDPとTCP
UDPは送りっぱなしのプロトコル。
相手が受け取ったのかを確認しない。パケットの到着順序も保証されない。
単純なぶん高速に送ることができる
TCP(Transmission Control Protcol)は、双方向の通信を行う。
通信相手とコネクションを繋ぎ、SYN(クライアント) → ACK/SYN(サーバー) → ACK(クライアント)と、通信状態を確認し合う。これを3ウェイハンドシェークと呼ぶ。この後に通信を行う。
各パケットにシーケンス番号振ってあり、これで順序保証したり、データ通信できない際は再送信を求めたりする。
ファイアウォール
自分からの通信は通したいけど、相手からの通信は拒否したいケースがある。
この時は、TCP/IPの3way handshakeの仕組みを利用して、「SYNがついたパッケージ」は通さないという設定にする
Appendix A パケットキャプチャで通信を覗いてみる
DNSサーバーのIPアドレスはどうやってわかるの?
OSの中に入ってるらしい。ルータにも。
...
resolver #5
domain : 9.e.f.ip6.arpa
options : mdns
timeout : 5
flags : Request A records
reach : 0x00000000 (Not Reachable)
order : 300600
resolver #6
domain : a.e.f.ip6.arpa
options : mdns
timeout : 5
flags : Request A records
reach : 0x00000000 (Not Reachable)
order : 300800
resolver #7
...
scutil --dns
で確認できる。優先順位とかもあるんだな。
OSやルータに入ってるのだとしたら、その更新はどうするのだろう?
→ 手動で追加するらしい。ここは手動なのか、まあそんな更新されることもないだろうしなって感じなのか。
Appendix B ネットワークの管理運用とトラブルシューティング
トポロジとは?
通信ネットワーク上にコンピュータや制御機器、および各種端末機器(以下、これらをすべて端末と総称します)がどのような形態で接続されるかを表す用語
https://www.m-system.co.jp/mstoday/plan/mame/b_network/0208/index.html#:~:text=「ネットワークトポロジ」とは、,リング型」などがあります。
なるほど、よくある全体設計みたいな図のことか。
Chef,Puppet,Ansible
テキスト形式で記述した設定ファイルの通りにサーバーの設定やソフトウェアのインストールをしてくれる。
CloudFormationとはまた違いそうだな。これはサーバーに入れるソフトウェアとかの話をしてるわ。
OpsWorksがこのChefとかをいい感じに使えるようにしたもの。資格勉強してた時にあったわ。。
情報まとめてくれている
「AWS OpsWorks ”サービス終了”」らしい。
代替は、自前のChefサーバーを構築するか、Chef Saasを使う感じにある
pingはICMPプロトコル
pingはICMPプロトコルを使用して通信する。
インターネットそうに当たる。
TCPやUDPとは別概念で、ポートの概念がない。
セキュリティグループで明示的にしていてあげないといけない。
traceroute コマンド
tracerouteによって、通信がどの経路を通って通信したのかわかる。
pingは通ってるけど、想定外ルートを通ってるとかの確認のために使用。
でも想定外のルートってどうやって判別すればいいのだ?
→ ちゃんとNAT経由で通信が走ってるかなどの確認に使用する。
telnet
pingでネットワークの通信を確認できるが、ポートの確認はできない。つまり特定のアプリケーションが動いてるかは確認できない。
確認する方法としてtelnetが存在する。
感想
シンプルに、良書だった。
インフラのことの全体感をなんとなく知りたい。サーバ、クライアント、もしくは非エンジニアの方におすすめの本。
どの説明も簡潔でわかりやすく、かといって簡単なことをしてるわけではなく、ちゃんとAWS上でサーバを構築してWordPressを動かすことができる。
また、本の内容がちゃんと更新されているので、最新(2023/11/19)のAWSの設定と表示が異なる場所がなく、実際と違って困ることもなかった。
自分はモバイルアプリエンジニアからバックエンドエンジニアへ転職しようとしてるのだが、この本によってなんとなくインフラ構築の流れ、全体像みたいなものを捉えることができてよかった。
これをCloudFormationで構築してみたいな。
でも同じような本を買ったので。そっちで構築してみようかな