AWSを通して通信の仕組みから知るネットワークの流れとは?

AWSを通して通信の仕組みから知るネットワークの流れとは?

本のまとめ

▼読んだ本は?
■Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版
■ 玉川憲さん, 片山暁雄さん, 今井雄太さん, 大澤文孝さん
http://amzn.asia/d/j9lABiO
▼AWSのデータセンターはどこにある?
■2段階にグルーピングされて存在している

【1】リージョン
└世界16箇所さまざまな地域に分散されたデータセンター
└「バージニアリージョン」「オレゴンリージョン」「東京リージョン」などがある
└基本はレスポンス向上のため、エンドユーザーに近いリージョンを選ぶべき

【2】アベイラビリティゾーン
└1つの「リージョン」を更にいくつかに分割し、物理的距離が相当離れたデータセンター
└基本は耐障害性を高めるため、異なるアベイラビリティゾーンに同じ構成のサーバーを配置して負荷分散する

▼IPアドレスとは?
■ネットワーク上で互いに重複しない、唯一無二の番号
■ネットワーク上の「住所」のようなもの
■「192.168.1.2」など8ビットずつ区切り、10進法に変換した合計32ビットの数値で表現
■8ビットずつピリオドで区切られた数字は「0~255」までで表現
■IPアドレスには2種類ある
└インターネット接続通信に用いられる「パブリックIP(グローバルIP)」
└自分のネットワーク内(ローカル環境)で通信するための「プライベートIP」
■IPアドレスの取得数は必ず「2のn乗個」で取得する必要があり、以下2つがよく使われる
└「192.168.1.0~192.168.1.255」(256個)
└「192.168.0.0~192.168.255.255」(65536個)
■数値として固定となるIPアドレスの前半部分(192.168)を「ネットワーク部」
■数値として変化するIPアドレスの後半部分(1.255)を「ホスト部」と呼ぶ
▼IPアドレスのCIDAR表記とは?
■ネットワーク部として「何ビットまで使うか?」に基づいてIPアドレス範囲を簡単に書く方法
【1】「192.168.1.0~192.168.1.255」(256個)の場合
└CIDAR表記では「192.168.1.0/24」と書く
※最初24ビット分がネットワーク部となり固定となるため「/24」

【2】「192.168.0.0~192.168.255.255」(65536個)の場合
└CIDAR表記では「192.168.1.0/16」と書く
※最初16ビット分がネットワーク部となり固定となるため「/16」

▼VPCとサブネットとは?
【1】VPC
└ユーザーが個別に作れる隔離されたネットワーク領域
└このVPC内で使用するIPアドレス範囲を予め指定
└AWSではVPCとして「16ビット以上(65536個のIPアドレス)が必要

【2】サブネット
└VPCのIPアドレスを更に細かく分割したネットワーク領域
└どちらかのサブネットに障害が発生しても、もう片方は大丈夫にするため
└インターネットに接続するサブネット、インターネットから隔離されたサブネットなどに分割するため

▼NAT(Network Address Translation)とは?
【1】「ローカルネットワークから外部ネットワークへ」の1方向のみでの通信を許可する仕組み
【2】例えばDBサーバーからインターネットへの通信を許可するが、その逆の通信をできない状態にする
【3】サーバーやソフトウェアのアップデートを行う時などに利用する
【4】2つのネットワークインターフェースを持つ
└片方のインターフェースにはパブリックIPを持つ
└もう一方にはプライベートIPを持つ
▼ルートテーブルとは?
【1】ネットワーク環境にデータを流すためには「ルーティング情報」が必要
【2】ルーティング情報を設定するのが「ルートテーブル」と呼ばれる
【3】TCP/IPプロトコルでは、データを細切れにした「パケット」で送受信する
【4】ルートテーブルはパケット内にある「宛先IPアドレス」を見て宛先IPアドレスの近い方のネットワークへデータを運んでいく
【5】ルートテーブルには「宛先IPアドレス(デスティネーション)/流すべき入り口となるルーター名(ターゲット)」の2つを書く
▼インスタンスとは?
【1】Amazonで利用されるサーバーのこと
【2】EC2というサービスを用いてインスタンスを生成できる
【3】ネットワーク上で用意されたプライベートIP範囲から1つのIPアドレスをインスタンスに割り当てる
【4】更にインスタンスをインターネットと接続させる場合、パブリックIPアドレスを紐付ける
【5】SSHプロトコルを利用すれば、インスタンスに外部から接続できるようになる
▼サーバーOSのLinuxでよく使われるコマンドは?
■chmodコマンド
└各ファイルのパーミッションを変更するコマンド

■lsofコマンド
└サーバー上で通信を受け付けているプログラムを一覧化表示するコマンド

■sudoコマンド
└Linuxにおける管理者ユーザー権限でコマンドを実行するためのコマンド

■yumコマンド
└アプリケーションのインストールやアンインストールを行うコマンド

■serviceコマンド
└指定したソフトウェアの「起動(start)/停止(stop)/再起動(restart)」を行うコマンド

■chconfigコマンド
└OSが立ち上がった時の各ソフトウェアの自動起動を「設定(on)/設定解除(off)」を行うコマンド

■psコマンド
└OS上で動いているプログラムを一覧化して確認できるコマンド

■nslookupコマンド
└ドメイン名からIPアドレスを、またその逆を行うコマンド

■pingコマンド
└ICMPというプロトコルを利用して、サーバー間で通信が行われているかを確認するコマンド

■curlコマンド
└HTTPやFTPを利用してファイルのダウンロード/アップロードを行うコマンド

▼ポートとは?
【1】サーバー内部では外部からの通信を受け付けて動くプログラムが多数存在する
【2】そのプログラムに外からアクセスするための「扉」のことをポートと呼び、扉にはそれぞれ番号が付いている
【3】サーバー上でよく使われるポート番号は以下
└SSH=22番
└SMTP=25番
└HTTP=80番
└HTTPS=443番
└MySQL=3306番
▼セキュリティグループとは?
【1】外部からのネットワーク通信を制御するファイアウォールのこと
【2】AWSではインスタンス毎に個別に設定できるファイアウォールを「セキュリティグループ」と呼ぶ
【3】セキュリティグループには2つの方向から設定ができる
└インターネットなど外から中のインスタンスへの通信を制御できる「インバウンド」設定
└中のインスタンスなどから外のインターネットへの通信を制御できる「アウトバウンド」設定
▼DNS(ドメインネームシステム)とは?
【1】ドメイン名とIPアドレスを紐付けるシステムのこと
【2】ドメイン名からIPアドレスを取得することを「正引き」と呼ぶ
【3】IPアドレスからドメイン名を取得することを「逆引き」と呼ぶ
【4】DNSを行うサーバーがたくさんインターネット上に存在しており「DNSサーバー」と呼ぶ
▼HTTPプロトコルのやり取りの流れは?
【1】インターネットを通じた以下2つの通信で成り立つプロトコル
└クライアントPCによるリクエスト(要求)
└サーバーによるレスポンス(応答)

【2】クライアントPC側が「リクエストライン」「ヘッダー」「ボディ」をサーバーに渡す(要求する)
└要求するサイトのホスト名(URL)
└自分のブラウザの種類(User-agent)
└自分が持っているCookieの情報(Cookie)
└直前に見ていたページURL(Referer)
└HTMLフォームを通じたPOST情報

【3】サーバー側が「ステータスライン」「ヘッダー」「ボディ」をクライアントPC側に返す(応答する)
└「200 OK」「404 NOT FOUND」など要求への可否
└HTMLなどコンテンツの種類(Content-Type)
└HTMLなどコンテンツの長さ(Content-Length)
└HTML/画像そのものの情報

▼AWSでインフラを構築する大枠の流れは?
【1】VPCを取得してIPアドレス範囲を指定する
【2】VPCを複数のサブネットに分割することで、IPアドレス範囲をサブネット毎に分割する
【3】例えばWEBサーバーを配置するサブネットを「パブリックサブネット」として作成する
【4】例えばデータベースを配置するサブネットを「プライベートサブネット」として作成する
【5】インターネットゲートウェイを設置してインターネットとパブリックサブネットの通信を開始する
【6】EC2サービスを利用してAMI(サーバーOSなどがインストールされたファイル)を指定した上で、インスタンスを生成する
【7】例えば「WEBサーバーインスタンス」をパブリックサブネットに生成する
【8】例えば「データベースインスタンス」をプライベートサブネットに生成する
【9】WEBサーバーにパブリックIPアドレスを設定する
【10】ルートテーブルを設定して、各サブネット内部でのパケット通信の流れを決める
【11】セキュリティグループを設定して、インターネットからインスタンスへの通信の流れを設定する
【12】NATを構築して、プライベートサブネットから外への通信を可能にする
▼ネットワークとインフラ全体像を把握するには?
■ネットワーク全体のトポロジ(接続形態)を知る
■ネットワークに割り当てられているIPアドレスブロックを知る
■ネットワーク内に存在するサブネットと、サブネットそれぞれのIPアドレスブロックを知る
■各サブネット内に存在するインスタンスを知る
■各インスタンスが持つIPアドレスとパブリックIPアドレスを知る
■それぞれのインスタンス役割と動いているアプリケーション/ソフトウェアを知る
■ルートテーブルの設定を知る
■セキュリティグループやネットワークACLの制御状況を知る
▼ネットワークに接続できない時のテスト順序は?
【1】問題サイト以外のサイトにインターネットから接続する
└クライアント側のインターネット接続のネットワーク環境に問題がないか確認するため

【2】nslookupコマンドで名前解決を行う
└ドメイン名とIPアドレスの名前解決が行えるかにより、DNSの設定やDNSサービス自体に問題がないかを確認するため

【3】pingコマンドでサーバー間の疎通を確認する
└途中のネットワークに問題がないか、またサーバー自体が落ちていないかを確認するため

【4】telnetコマンドでポート80番に接続する
└HTTPのウェルノウンポートに接続することでポートが閉じていたり、Apacheが起動していないかを確認するため

思ったこと

AWSを通じてインフラとネットワーク環境を構築する手順を、「そもそもIPアドレスって何か?」「HTTP通信って何か?」「DNSって何か?」といったネットワーク通信の根幹となる、仕組みやプロトコルを含めてまとめてくれている本でした。

AWSを利用していると、ボタンをポチポチと押していくことで簡単にネットワーク環境や紐付けるIP、また設置するサーバーなどを作成できてしまうため、ともすると何一つネットワークやインフラのことを理解していなくても、なんとなく環境構築ができてしまったりします。

でも、その背後にはHTTP通信に基づいて様々なデータやり取りが行われており、そのデータ通信に受け答えするためにサーバーOSやその上にのっかるソフトウェアなどが動いている構造を理解しないと、何かしら問題が起きてしまった時に、その原因を探り対処することができなくなってしまいます。

そういった意味で「【1】自分の環境の外側にいるDNSを調べる→【2】pingやtelnetで内部のサーバー自体への通信を調べる」という流れでネットワーク上の問題を調べていくテスト順序を知っておくことは、今後自分の持つサーバーに問題が起こった時に、慌てて単純にサーバー再起動を繰り返しちゃう凡ミスとかを、防いでくれるかもしれません。

ありがとうございました!

関連する記事