基礎からのネットワーク&サーバ構築　改訂版　まとめ


こちらの記事でまとめを書いた書籍の改訂版が出ていたので、まとめ直したものです。
http://qiita.com/chrischris0801/items/7987982bb1d895493d36

# 参考
[Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版](https://www.amazon.co.jp/dp/4822237443/)


AWSを借りてWordpressのブログを作成するという例を用いて、

* ネットワークの基本
* ネットワークに関連するLinuxコマンド
* AWSによるサーバーの構築
* アプリケーションの設定

などを解説している書籍。


# 項目
* IPアドレス
* VPC領域とサブネット
* 仮想サーバー
* SSH
* EGPとIGP
* ポート番号
* ファイアウォール
* WEBサーバーの構築
* ドメイン
* HTTP
* プライベートサブネット
* NATサーバー
* MySQLのインストール
* 通信の復習
* TCP/IP


# 概要

### サーバー
サーバーとはLinuxやWindows Serverなどサーバー用のOSをインストールしたコンピュータのこと。
そのコンピュータにWebの機能を提供するソフトウェアをインストールすればWebサーバー、データベース機能を提供するソフトウェアをインストールすればDBサーバー、メールの送受信機能を提供するソフトウェアをインストールすればメールサーバーとなる。

### ネットワーク
IPアドレスは機器間で重複しないピリオドで区切られた4つの数字でありサーバー同士の通信に必要になる。
各サーバーはルーターと呼ばれる機器にデータを流して通信する。
IPアドレスにはドメインという人間が理解しやすい名前を付けて使い、そのためにはDNSサーバーが必要になる。

### サブネット
ネットワークは大きくパブリックサブネットとプライベートサブネットの2つに分かれる。
パブリックサブネットはインターネットに接続し公開されており、Webサーバーをなどを配置することが多い。プライベートサブネットはインターネットと直接は接続せず、DBサーバーなどを配置することが多い。

### NAT
NATとはサブネット内部だけで通用するアドレスを外部とも通信できるアドレスに変換する技術である。NATを利用することで、プライベートサブネットに配置したDBサーバーがインターネットに接続し、ソフトウェアのアップデート等を行うことができるようになる。

### ネットワークとAmazon VPC
使用するIPアドレスの範囲を指定することでAmazon VPCを作れる。Amazon VPCをさらに分割することでサブネットを作ることが出来る。サブネットの中にサーバー(インスタンス)を作る。


# IPアドレス
IPアドレスはネットワーク上で互いに重複しない32ビットで構成された唯一無二の番号で、住所に相当する。IPアドレスにはパブリックIPアドレスとプライベートIPアドレスの2種類がある。

### パブリックIPアドレス
パブリックIPアドレスはインターネットに接続するために使う。重複すると正しく通信できないため自由に設定することはできず、ICANNという団体が一括管理している。

### プライベートIPアドレス
プライベートIPアドレスはインターネットでは使用しない。以下の範囲のIPアドレスは、インターネット上でパブリックIPアドレスとしては使われず、サブネット内での通信などで利用する。

|IPアドレス範囲|
|:---|
|10.0.0.0 ~ 10.255.255.255|
|172.16.0.0 ~ 172.31.255.255|
|192.168.0.0 ~ 192.168.255.255|

### IPアドレスの範囲
ネットワークを構築する際は、使用するIPアドレスの範囲を定める。その範囲は5個とか10個とか好きな数で区切ることは出来ず「2のn乗個(nビット単位)で区切る」という決まりがある。
具体的には、256個または65536個で区切ることが多い。例えば「192.168.1.0 ~ 192.168.1.255」は256個で区切った一例で、「192.168.1.0 ~ 192.168.255.255」は65536個で区切った一例である。

### ネットワーク部とホスト部
256個で区切った「192.168.1.0 ~ 192.168.1.255」というIPアドレスにおいて、「192.168.1」までの24ビット分まではネットワーク内では固定で、最後の8ビット分がネットワーク内の各サーバーに割り当てる。最初の24ビットの固定部分をネットワーク部、最後の8ビットの部分をホスト部を言う。

### CIDR表記
CIDR表記は、IPアドレスの範囲をネットワーク部のビット長を使って表記する方法である。
例えば「192.168.1.0 ~ 192.168.1.255」であればネットワーク部のビット長(プレフィクス)は24ビットなので、「192.168.1.0/24」と表記する。「192.168.1.0 ~ 192.168.255.255」であればネットワーク部のビット/プレフィクスは16ビットなので、「192.168.1.0/16」と表記する。

### サブネットマスク表記
サブネットマスク表記は、IPアドレスの範囲をプレフィクスのビット数だけ2進数の1を並べ、残りは0を記述した表記である。
例えば「192.168.1.0 ~ 192.168.1.255」であれば、「192.168.1.0/255.255.255.0」と表記する。「192.168.1.0 ~ 192.168.255.255」であれば「192.168.1.0/255.255.0.0」と表記する。


# VPC領域とサブネット

### VPC領域
VPCとは仮想上に構成するネットワーク領域のことで、使用するIPアドレスの範囲を指定することで作成できる。具体的にはAWSコンソールから以下の項目を選択して作成する。

* IPアドレスの範囲(例.「10.0.0.0/16」)
* リージョン(例. アジアパシフィック)

VPC領域は「Production環境のVPC」、「Staging環境のVPC」のような粒度で作成する。

### サブネット
VPCに割り当たれたIPアドレスをさらに細分化してサブネットを作成できる。例えば、インターネットと通信するパブリックサブネットと通信しないプライベートサブネットに分割する。

* パブリックサブネットのIPアドレスの範囲:「10.0.1.0/24」
* プライベートサブネットのIPアドレスの範囲:「10.0.2.0/24」

例えば、ロードバランサで負荷分散するためにサーバーを複数用意するときにも、別々のアベイラビリティゾーンに別々のサブネットを作る。

### インターネットゲートウェイ
あるサブネットをインターネットに接続するためにはインターネットゲートウェイを使用する。AWSコンソールでインターネットゲートウェイを作成し、VPCと結び付ければ良い。

### ルートテーブル
「宛先IPアドレスがいくつの時にどのネットワークに流すか」という設定のことをルートテーブルという。各ネットワークにはルーターの役割を果たすソフトウェアが動いている。

例えば「10.0.0.0/16」のVPC領域でのデフォルトでのルートテーブルは以下のようになっている。これは、同じVPC領域内のIPアドレスに送信する際は、VPCのルーター(ローカルルーター)にパケットを送信することを意味している。

|宛先IPアドレス|ターゲット|
|:---|:---|
|10.0.0.0/16|local|

次に「10.0.1.0/24」のサブネットをパブリックサブネットとしたい場合、ルートテーブルを作成し、以下のように設定する。これは、同じVPC内に関しては上述の通りであり、それ以外のIPアドレスであればインターネットゲートウェイにパケットを送信することを意味している。

|宛先IPアドレス|ターゲット|
|:---|:---|
|10.0.0.0/16|local|
|0.0.0.0/0|インターネットゲートウェイ|


# 仮想サーバー
作成したサブネットの中に、仮想サーバーを構築する。AWSでは、EC2(Elastic Compute Cloud)という仮想サーバーがあるので、これを利用する。作成の際には以下の項目を設定する。

* リージョン
* AMI: Amazon Linux AMIなど
* インスタンスタイプ: 仮想マシンのスペック
* VPCとサブネット: パブリックサブネットに配置
* パブリックIPアドレス: 外部からのアクセスのために必要
* プライベートIPアドレス: VPC内での通信に使用
* ストレージ: 外付けハードディスク
* インスタンスの名前
* セキュリティグループ
* キーペアの作成

インスタンスに割り当てられるパブリックIPアドレスは、デフォルトでは起動・停止するたびに別のIPアドレスが割り当てられる(動的IPアドレス)。固定化したい場合にはElastic IPを用いれば良い。
また、ロードバランサとしてELBを使用する場合にはパブリックIPアドレスは設定しなくて良い。代わりにELBにパブリックIPアドレスを付与する必要がある。


# SSH
SSH(Secret SHell)は仮想サーバーにアクセスすることができるプロトコルのkとで、MacではターミナルからSSHクライアントを起動することができる。

### キーペア
EC2インスタンスを作成するときに、キーペアを作成し「my-key.pem」というファイルがダウンロードする(なお、これを紛失するとインスタンスにログインできなくなる)。SSHは秘密鍵と公開鍵によって接続する方法であるが、この「my-key.pem」は秘密鍵に相当する。

### 接続
接続するときは以下のコマンドで接続する。接続に成功すると、接続先サーバーで各種コマンドを実行することができる。

```bash
$ ssh -i my-key.pem ec2-user@54.199.208.105
```

* -i ... 秘密鍵のパスを指定するオプション
* my-key.pem ... ダウンロードした秘密鍵
* ec2-user ... 接続するユーザー名
* 54.199.208.105 ... 接続先のサーバーのIPアドレス


# EGPとIGP
インターネットは無数のルーターで接続されており、ルーター同士はルートテーブルの情報をやりとりする。ネットワークの情報は刻一刻と変更されるため、ルーター同士は情報をやり取りして自動的に更新する。そのための代表的な方法がEGPとIGPである。
EGPは大きなネットワークでネットワークを管理する「AS番号」を使ってやりとりに使われる。一方、IGPはEGP内部のルーター同士でのやりとりに使われる。


# ポート番号

### ポート番号
ポートは、TCP/IPで通信するサーバーなどの機器にある「他のコンピュータと、データを送受信するための出入り口」のことで、0から65535まである。ポートによって、1つのIPアドレスに対して、複数のアプリケーションが同時に通信できる。ポートにはTCPとUDPの2種類がある。

### ポート番号の確認
どのポート番号でどのプログラムが待ち受けているのかを確認するためにはlsofコマンドを使う。

```bash
$ sudo lsof -i -n -p
```

### ウェルノウンポート
ウェルノウンポート番号は代表的なアプリケーションが使うポート番号のことで、あらかじめ番号が定められている。例えばSSHはポート22番であるため、特にポート番号を入力せずともsshコマンドにより22番ポートに接続できる。

|プロトコル名|番号|用途|
|:---|:---|:---|
|SSH|22|仮想サーバーに接続する|
|SMTP|25|電子メールを転送する|
|HTTP|80|WEB上で通信する|
|HTTPS|443|セキュリティの高いHTTP|
|MySQL|3306|代表的なデータベース|


# ファイアウォール
ファイアウォールとは通して良いデータだけを通しそれ以外を遮断する機能の総称である。その最も簡単な構造のものがパケットフィルタリングである。

### パケットフィルタリング
流れるパケットを見て通過の可否を決める仕組みのこと。パケットにはIPアドレスのほか、ポート番号も含まれるため、これらの情報から通過の可否を決める。
例えばMySQLはポート3306番で待ち受けているが、データベースにアクセスできるようにするのは好ましくないので、ポート番号3306番のパケットを除外するように構成する。逆にsshdはポート22番なので、これは除外しないようにする。

### セキュリティグループ
AWSのインスタンスでは「セキュリティグループ」でパケットフィルタリングを設定できる。デフォルトでは「ポート22に対して、すべての通信（0.0.0.0/0）を許可する」という設定となっている。

デフォルトの設定ではWebサーバーソフトをインストールしても阻まれて通信できない(ポート22以外の通信が許可されていない)ので、必要に応じてセキュリティグループを変更する必要がある。

---

セキュリティグループの設定は以下の記事が参考になる。
http://qiita.com/kenjiszk/items/b1c0bfb75a2c44253cd6


# WEBサーバーの構築
サーバーをWebサーバーとして機能させるには、Webサーバーソフトをインストールする。Webブラウザなどからのリクエストを受け取り、サーバー上のコンテンツを返したりサーバー上でWebアプリケーションを実行できるようになる。Apacheは世界で最も多く利用されているオープンソースのWebサーバーソフトである。

### Apacheの設定
Apacheをインストールするには、SSHでインスタンスにログインして、以下のコマンドを実行する。

```bash
$ sudo yum -y install httpd # Apacheのインストール
$ sudo service httpd start # Apacheを起動する
$ sudo chkconfig httpd on # サーバーの起動時に自動的に起動するようにする
```

### プロセスの確認
psコマンドは実行中のプロセスを確認するLinuxコマンド。

```bash
$ ps -ax
$ ps -ax | grep httpd # httpdを含む行のみ抽出
```

またこの状態でlsofコマンドでポートを確認すると、Apacheがポート80番で待ち受けていることが確認できる。

### ファイアウォールの設定
ポート80番（HTTPのウェルノウンポート）がファイアウォールにブロックされているため、Apacheをインストールしてプロセスを起動しても、そのままではWEBブラウザからアクセスできない。そのためポート80番を開けるよう、ファイアウォールを設定する。

---

実際のアプリケーションの運用を行うときには、メモリやCPUの使用状況といったリソース監視が必要になる。
http://www.very-cute.net/wp/web-access-memory/


# ドメイン

### ドメイン名
ドメインは覚えにくいIPアドレスに、名前をつけるもの（ドメイン名）。ドメイン名はIPアドレスとともにICANNが統括管理しており、さらにトップレベルのドメインごとにそれぞれの事業者が管理している。例えば「com」や「net」はVerisign、「jp」はJPPSが管理している。

### DNSサーバー
IPアドレスとドメイン名を変換する（名前解決）のはDNSサーバーである。DNSサーバーは世界中に分散しており、それぞれのDNSサーバーは自分の担当する範囲のIPアドレスとドメインの変換を行う。

### Route53
AWSにおいて独自のドメイン名を使用したい場合はRoute53というサービスを使用する。なお53はDNSのウェルノウンポートである。

### nslookコマンド
DNSによる名前解決の様子を見るためにはnslookコマンドを使用する。以下は日経BPのURLを参照すると、「192.168.179.1」というアドレスを持つDNSサーバーによって名前解決を行っており、IPアドレスは「202.238.142.229」であることを示している。53はDNSのウェルノウンポートである。

```bash
$ nslookup www.nikkeibp.co.jp

Server:		192.168.179.1
Address:	192.168.179.1#53

Non-authoritative answer:
Name:	www.nikkeibp.co.jp
Address: 202.238.142.229
```


# HTTP

### HTTPリクエストとレスポンス
リクエストは以下の項目が必要。

|項目|例|
|:---|:---|
|リクエストライン|GET/HTTP/1.1|
|ヘッダー|Host:exmaple.com|
|ボディ(オプション)|...|

レスポンスには以下の項目が含まれる。

|項目|例|
|:---|:---|
|ステータスライン|HTTP/1.1 200 OK|
|ヘッダー|Content-Type: text/html ...|
|ボディ(オプション)|<!DOCTYPE html...|

### HTTPメソッド
GET/POST/PUT/DELETEの4つで、CRUD(Create, Read, Update, Delete)に対応している。

### HTTPステータスコード
|コード|意味|
|:---|:---|
|1xx|処理中|
|2xx|成功|
|3xx|リダイレクト|
|4xx|クライアントエラー|
|5xx|サーバーエラー|

### リクエストヘッダーの例
|種類|用途|
|:---|:---|
|HTTPヘッダー|要求を送ろうとするホスト名|
|User-Agentヘッダー|ブラウザの種別|
|Cookieヘッダー|以前Set-Cookieヘッダーで送信されたデータ|

### レスポンスヘッダーの例
|種類|用途|
|:---|:---|
|Content-Typeヘッダー|ボディ部のコンテンツの種類(HTMLなど)|
|Dateヘッダー|コンテンツの日付|
|Set-cookieヘッダー|Cookieを設定する|

### Telnet
HTTPプロトコルで通信するためのコマンド。

```bash
$ telnet aws.amazon.com 80

GET / HTTP/1.1
HOST: aws.amazon.com
```


# プライベートサブネット
プライベートサブネットはインターネットと隔離したサブネットのことで、セキュリティを高めるために作成する。今回はプライベートサブネット内にDBサーバーを作成し、WEBサーバーからのみアクセスできるようにすることを想定する。インターネットからは直接アクセスしないので、パブリックIPアドレスは定めない。

### プライベートサブネットのインスタンス設定
プライベートサブネットにおいては、ルートテーブルはインターネットに接続しないのでデフォルトのままで良い(ポート22のみ空けている状態)。次にサブネットの中にDBサーバー用のインスタンスを作成し、以下の項目を設定する。

* IPアドレス ... パブリックIPのチェックを外す
* セキュリティグループ ... MySQLを使うのでポート3306は通す

### pingコマンド
pingはサーバー間での疎通を確認するコマンドで「ICMP（Internet Control Message Protocol）」というプロトコルを利用する。デフォルトのセキュリティグループではICMPは許可されていないため、インバウンドのファイアウォールの設定でICMPを追加する。

まずはローカルからパブリックサブネットにあるWEBサーバーにログインする。

```bash
$ ssh -i my-key.pem ec2-user@public_dns_name 
```

次にWebサーバー上でDBサーバー（例: IPアドレスは「10.0.2.10」）に疎通を確認。

```bash
$ ping 10.0.2.10

64 bytes from 10.0.2.10: icmp_seq=1 ttl=64 time=1.07 ms
```

### 踏み台サーバーを経由してのDBサーバーへのログイン
今回のWEBサーバーのように、インターネットから直接接続できないサブネット・サーバーに接続するときに一度経由するサーバーのことを踏み台サーバーという。DBサーバーに接続するための秘密鍵のファイルを「SCP（Secure Copy）」というプロトコルを用いて踏み台サーバーであるWEBサーバーに転送する。

```bash
$ scp -i my-key.pem my-key.pem ec2-user@ec2-user@public_dns_name
```

次にWebサーバーにログインし、秘密鍵ファイルのパーミッションを自分しか読めないように変更する。

```bash
$ chmod 400 my-key.pem
```

この状態で以下のコマンドでDBサーバーにログインできる。

```bach
$ ssh -i my-key.pem ec2-user@10.0.2.10
```


# NATサーバー
DBサーバーはプライベートサブネットに設置したため、インターネットに接続できないようになっている。そのためこのままではMySQLなどのソフトウェアのインストールが行えない。必要なソフトウェアを一つずつWEBサーバーからscpコマンドで送ることも可能であるが、手間がかかりすぎる上に、WEBサーバーには不要なソフトウェアをダウンロードする必要がある。この問題を解決するのがNAT(Nwtwork Address Translation)である。

### NATサーバー
NATはIPアドレスを変換する装置である。プライベートサブネットに存在するホスト(サーバーやクライアント)がインターネットにパケットを送信しようとしたときにNATはパケットの送信元IPアドレスを自身のIPアドレスに置換する。これにより、接続先からはNATが接続しているように見える。
NATを用いることで、プライベートサブネットからインターネットに接続できるが、逆にインターネットからプライベートサブネットに接続することはできない。

### NAT構築方法
NATを構築する方法として、NATインスタンスとNATゲートウェイの2つの方法がある。
NATインスタンスは、NATソフトウェアがあらかじめインストールされたAMIから起動したEC2インスタンスを使うこと。
NATゲートウェイはNAT専用に構成された仮想的なコンポーネットで、配置するサブネットを選択するだけで構成できる。

### NATゲートウェイの設定方法
NATゲートウェイにはサブネットとElastic IP(静的な固定化されたIPアドレス)を割り当てる。またプライベートサブネットのルートテーブルの設定に、「0.0.0.0/0」に対してNATゲートウェイを選択する設定を追加する。

### curlコマンド
Amazon Linuxにはデフォルトでtelnetコマンドがインストールされていないので代わりにcurlコマンドを使う。DBサーバーで以下のコマンドを打ち、正常に動作すれば、NATが機能していると分かる。

```bash
$ curl www.nikkeibp.co.jp
```


# アプリケーションのインストール
MySQLのインストールのためには以下のコマンドをDBサーバー上で実行する。

```bash
$ sudo yum -y install mysql-server # インストール
$ sudo service mysqld start # mysqlサーバーの起動

$ mysqladmin -u root password # ログイン
New password: 設定したいパスワードを入力
Confirm new password: 同じものを入力

$ mysql -r root -p # ログイン
Enter password: 設定したパスワードを入力
```


# 通信の復習

### IPアドレス
* ネットワーク上の通信先を一意に特定するもので、ICANNという団体が管理している。
* パブリックIPアドレスとプライベートIPアドレスがある。
* ルーターがパケットをバケツリレーのように次々と転送する。
* ルーティング情報はEGPやIGPを使って交換する。

### ポート番号
* 1つのIPアドレスで同時に複数のアプリケーションが通信できる。
* WEB、DNS、SMTPなどのよく使われるサービスは利用するポート番号が決まっておりウェルノウンポートと呼ぶ。
* WEBサーバーはウェルノウンポートとしてポート80番を用いる。

### DNS
* IPアドレスは覚えにくいため、ブラウザからのアクセスはドメイン名を使う。
* ドメイン名とIPアドレスを相互変換することを名前解決という。
* 名前解決にはDNSサーバーを用いる。

### HTTP
* WebサーバーとWebブラウザはHTTPを用いてデータのやり取りをする。


# TCP/IP
上述の通信の処理はTCP/IPモデルという通信モデルで構成されている。役割ごとに4つの階層に分かれたモデルである。上位の階層は下位の界層が何でもよく、下位の階層は上位の階層の内容は分からなくてもよい。

|層|役割|代表的なプロトコル|
|:---|:---|:---|
|アプリケーション層|ソフトウエア同士の通信|HTTP SSH DNS SMTP|
|トランスポート層|データのやりとりの順番の制御、エラーの訂正|TCP UDP|
|インターネット層|ルーティング（IPアドレスの割り当て）|IP ICMP ARP|
|インタフェース層|ネットワーク上で接続された機器同士の通信|Ethernet PPP|

### 名前解決でのTCP/IPモデルの例
1. 名前解決リクエストの作成（アプリケーション層 -> DNS）
2. UDPでカプセル化（トランスポート層 -> UDP）
3. IPでカプセル化（インターネット層 -> IP）
4. Ethernetでカプセル化（インターフェース層 -> Ethernet）

### Ethernet/MACアドレス/ARP
Ethernetで通信するパソコン、サーバー、各種ネットワーク機器などのホストには、「MACアドレス」という唯一無二の番号が振られる。例えば「05:0c:ce:d8:1b:a1」という文字列ががMACアドレスである。MACアドレスは工場出荷時に定められる。

---

自分のMacのMACアドレスは以下のように調べられる。
http://moshbox.jp/?p=25912

---

Ethernetでの通信では、MACアドレスを使ってデータを送信する。この時にMACアドレスとIPアドレスの対応表が必要になる。これを解決するのがARPというプロトコルである。
例えば「10.0.1.10というIPアドレスを持っているホストは誰ですか？」という問い合わせを行い(ARP要求)、そのIPアドレスを持っているホストは「僕です。MACアドレスは05:0c:ce:d8:1b:a1です。」という応答を返す(ARP応答)。以降はこの「10.0.1.10 <=> 05:0c:ce:d8:1b:a1」の対応表を使って送受信を行うことができる。
ARP要求は自身が所属するサブネット内で送信することができる。サブネットを超えるような場合はまずサブネットに所属するルータへ転送し、以降ルータ同士のやりとりによってDNSサーバーとも接続が可能になる。

### UDPとTCP
TCP/IPで通信する場合、トランスポート層でのデータの転送には「UDP」と「TCP」の2通りの通信方法がある。

UDPには以下の特徴がある。

* 状態を持たない「ステートレスプロトコル」である。
* 送りっぱなしのプロトコルであり、相手がパケットを受け取ったかどうかを確認する手段はない。
* やり取りが単純な分だけ、高速に送れる（動画などで使用する）。

TCPには以下の特徴がある。

* UDPと違い、双方向の通信が可能である。
* WebサーバーからDBサーバーへデータを送り、データベースに格納する場合などに使用する。
* 3ウェイハンドシェークというやりとりにより、自分と通信相手の間に仮想的な通信経路である「コネクション」を確立する。