夜行月報

“夜更かし”から“新しい”をみつけるためのブログ

AWSを触りながらネットワーク& サーバーを勉強する

AWSを触りながらネットワーク& サーバーを勉強する

はじめに

最近インフラ周りについて学習を進めているのですが、テキストを読むだけの学習だとどうしても効率が悪い... そこで今回、学習にも便利だというAWSを用いて、実際に手を動かして環境を作りながらインフラについて学んでみました。

学習の道しるべとして、テキストにはAmazon Web Services 基礎からのネットワーク&サーバー構築を採用しています。

以下、AWS内部の用語はいくつか登場しますが、各種サービスの紹介やその使い方の説明等は行わず、あくまでも一般的なインフラについて学んできたことを書いていきます。

IPアドレス

TCP/IPで使われるIPアドレスには、インターネットに接続するためのグローバルIPアドレス*1と、個人のネットワーク内で自由に使用できるプライベートIPアドレスがある。 IPアドレスは前半部分と後半部分に分けられ、それぞれ「ネットワーク部」と「ホスト部」に分けられる。 ネットワーク部は同一ネットワークである限り変わらないが、ホスト部は、そのネットワークを使用する機器やサーバに対して別々の値が割り当てられる。

CIDRとサブネットマスク

IPアドレスの表記にはCIDR表記とサブネットマスク表記がある。

CIDR(サイダー)表記は 192.168.1.0/24 のように表し、これは「192.168.1.0 ~ 192.168.1.255」の範囲を示す(CIDRブロック)。

サブネットマスク表記は 192.168.1.0/255.255.255.0 のように表し、これも「192.168.1.0 ~ 192.168.1.255」の範囲を示す

AWSでは、「Amazon PVC」というサービスがあり、自由なネットワークの作成が可能。

サブネット

CIDRブロックはさらに分割して使用でき、分割した小さなCIDRブロックを「サブネット」と呼ぶ。

例えば、192.168.0.0/16のブロック(192.168.0.0 ~ 192.168.255.255)を、/24で分けるとすると......

| 192.168.0.0 ~ 192.168.0.255 | 192.168.1.0 ~ 192.168.1.255 | 192.168.2.0 ~ 192.168.2.255 |...

のように、256のサブネットに分割できる。

このようにネットワークをサブネットで分けることで、障害耐性やセキュリティを高められる。

AWSでは、インターネットからアクセスできる「パブリックサブネット」と、インターネットからはアクセスできない「プライベートサブネット」がある。 プライベートサブネットは、インターネットから隔離したいサーバーやバックエンドシステムなどに割り当てることでセキュリティを向上させられる。

ルーティングテーブル

TCP/IPを使用した通信ではIPアドレスによって宛先を探してパケットを転送するが、そのためには、ネットワーク機器であるルーターが宛先へ到達するための最適なネットワーク経路を知っている必要がある。 それらを設定した、宛先IPアドレスと送信先ネットワークの対応表をルーティングテーブルという。

ルーティングテーブルの設定は、基本的にルーター同士が互いのルーティング情報を交換することで行われ、必要に応じて自動的に更新される。 この機能は、EGP(Exterior Gateway Protocol)とIGP(Interior Gateway Protocol)にという2種類のルーティングプロトコルよって成り立っている

AWSでは「ルートテーブル」という名称で同機能が提供されており、サブネットごとに設定が可能になっている。

ドメイン名

IPアドレスはインターネット上の住所のようなものだが、特定のWebサイトにアクセスする際は、IPアドレスではなく「https://www.google.com」などのドメイン名が使用されることが大半。

ドメイン名はピリオドで区切られており(ラベルと言う)、右から順に「トップレベルドメイン」「第2レベルドメイン」「第3レベルドメイン」......と呼ぶ。

最終的にドメイン名をIPアドレスに変換する仕組みをDNS(Domain Name System)と呼び、ドメイン名をキーとして、対応するIPアドレスを引き出すことを「名前解決」と言う。 この機能は、世界中にあるDNSサーバーが担っている。

スポンサーリンク

 

NAT

NAT(Netwrok Address Translation)は、プライベートIPアドレスをパブリックIPアドレスに変換する装置。 NATを利用することで、プライベートサブネットに存在するホストでもインターネットと通信を行える。この通信はプライベートサブネット → インターネットの方向でしか許可されないため、セキュリティを高められる。

NATにはIPアドレスだけでなくポート番号も同時に変換するものがあり、これをNATP(Network Address and Port Translation)またはIPマスカレードとも呼ぶ。

これを用いれば、1つのグローバルIPをNATを通して共有することで、複数のホストがインターネットに接続できるようになる。 家庭用のネットワーク機器や集合住宅などなどは、この仕組みを用いてネットに接続している。(IPアドレスの枯渇にも、これで対応している)

セキュリティ対策

パケットフィルタリング

ルーターやサーバーなどの機器において、パケットに含まれるIPアドレスやポート番号などの情報から、そのパケットを受け入れるかどうかを判断する仕組み。 設定によって、特定のIPアドレスから送信されてきたパケットのみ許可/拒否する、といった制限が可能になる。

AWSでは、「セキュリティーグループ」というサービスでこの機能を設定できる。

ネットワーク関連のLinuxコマンド

lsof コマンド

各ポート番号の先で、どのプログラムが待ち受けているかを確認できるコマンド。

nslookup コマンド

DNSサーバでどのように名前解決が行われているのかを調査する際によく使われるコマンド。 ドメイン名 → IPアドレス(正引き)、IPアドレス → ドメイン名(逆引き)のそれぞれの変換が可能。

pingコマンド

サーバー間の疎通を確認する用途でよく使われるコマンド。 指定したホストに対して「ICMPエコー要求」というパケットを送信し、ホストがそれを受け取って「ICMPエコー応答」というパケットを返す、という一連のやりとりから、通信の確認やその時間を計測したりできる。

pingを投げた先のサーバーがファイアーウォールの設定等でICMPを弾いていた場合、「pingの応答は返ってこないけど、ホストのWebサイトにはアクセスできる」という状況になる。 つまり、pingへの応答がないからといって、そのサーバーが停止してしまっているという証明にはならない。

curlコマンド

curlは「HTTPやFTPなど、様々なプロトコルを用いて通信を行う」コマンド。 例えば、

curl www.example.com

とタイプすると、www.example.comのHTMLコンテンツを取得できる。

traceroute コマンド

これからアクセスをする、宛先へのネットワーク上の経路を確認するためのコマンド。 実行するとパケットの流れを見ることができ、想定していないネットワーク経路を通っていないかなど、ルーティング設定の確認等に使用される。

TCP/IPを用いた通信の仕組み

TCP/IPを用いした通信は、OSI基本参照モデルをTCP/IP向けにアレンジしたモデル(アプリケーション層、トランスポート層、インターネット層、インターフェース層からなる)を用いて行われる。

ここでは、モデルに存在する4つの階層を意識した処理を通じて通信が行われる。流れとしては、以下のような感じになる。

  1. ブラウザが、入力されたドメイン名に対して名前解決を行うため、DNSサーバーに処理を依頼するためのリクエストデータを作る。
  2. 1 のデータはUDP(User Datagram Protocol)*2によって、トランスポート層でカプセル化される。
  3. 2のデータはインターネット層でIP(インターネットプロトコル)によってカプセル化される。
  4. 3で IPアドレスがつき、イーサネットなどの規格に沿ったヘッダーを付与してLANなどに流される。
  5. イーサネットでは、ARPというプロトコルを用いてMACアドレスとIPアドレスを結びつける対応表を作成し、データを送信する。
  6. DNSサーバまでデータが届くと、名前解決が行われ、これまでとは逆の順序で対応するIPアドレス情報が帰ってくる。
  7. 取得したIPアドレスにHTTPで接続し、TCPでリクエストを投げ、最終的に目的となるレスポンスが返ってくる。

最後に

クラウドインフラとはいえ、やはり自分で手を動かして学ぶと違いますね。テキストを追っかけるだけの学習より、何倍も納得感を感じながら進められるので、単純に吸収率が高いのかもしれません。

まだまだAWSには山のように機能がありますので、それらを1つ1つ試しながら、ネットワークやサーバーなど、インフラに関する知識をどんどん増やしていきたいなと思います。 それでは、今回はこの辺りで。

*1:AWSでは「パブリックIPアドレス」と呼ばれる

*2:TCPがデータの順序や破損を検知するのに対し、UDPは最低限の正常性確認以外は何もしないコネクションレスなプロトコル