インフラ/ネットワークの知識3(ネットワーク層)

# はじめに
ネットワーク層に関する技術などについてまとめていきます.

主な話題はIPアドレス・ルーティングとなります.

# ネットワーク層について
ネットワーク層は,
**異なるネットワークにいるノードとの接続を確保する**ためにある階層です.

データリンク層は,同じネットワークにいるノードとの隣接性を確保するものだったので,異なるネットワークにいるノードと接続することができません.

そこで,異なるネットワークに存在するノードと接続できるようにネットワーク層では,ヘッダを付加する処理を行っています.

このヘッダを付加する処理のことを**パケット化**といい,バケット化によってできたデータを**パケット**と呼びます.

送信するときは,トランスポート層から受け取ったセグメント/データグラムをパケット化して,データリンク層に渡します.

受信するときは,データリンク層からフレームを受け取り,パケット化とは逆の処理をして,トランスポート層に渡します.

# IPについて
IPはインターネット上のホストへデータを送信するための通信プロトコルというのが定義ですが,情報を送ったり受け取ったりするためのルールのようなものです.

ネットワーク層で押さえておくべきプロトコルであり,IPによってパケット化されたパケットのことを**IPパケット**と呼びます.

IPパケットは,制御情報を表す**IPヘッダ**,データそのものを表す**IPペイロード**で構成されています.

IPヘッダは以下のようにたくさんの情報を付加していますが,
今回はいくつかのフィールドをピックアップしていきます.

#### IPヘッダ
![スクリーンショット 2024-12-23 160548.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/73265393-22c9-073a-8a91-8e9d9272df1d.png)

### バージョン
バージョンは,IPのバージョンを表しています.

といっても,そのバージョンは2種類で,IPv4だったら'0100', IPv6だったら'0110'となります.

今回はIPv4の場合についてのみ扱います.

## フラグメンテーション
フラグメンテーションとは,**MTU(Maximum Transmission Unit)に収まらないサイズのIPペイロードを,MTUに収まるように分割すること**です.

識別子,フラグ,フラグメントオフセットは,パケットのフラグメンテーションに関連しています.

### 識別子
識別子は,**パケットを作成するときランダムに割り当てるパケットのID**です.

### フラグ
フラグは3ビットで構成されています.

上位1ビットは使用しません.

上位2ビットはフラグメントしてよいかどうかを表しており,**DFビット**と呼びます.

上位3ビットはフラグメントされたパケットが後ろに続くかどうかを表しており,**MFビット**と呼びます.

### フラグメントオフセット
フラグメントオフセットは,フラグメントしたときにそのパケットがもとのパケットの先頭からどこに位置しているかを示しています.

値は8バイト単位で表され,例えば400なら3200バイト目以降のデータであることがわかる.

### TTL
TTLはパケットの寿命を表しています.

パケットの寿命は経由するルータの数で表し,経由するルータの数を**ホップ数**と呼びます.

TTLの数は,ルータを経由するたびに減っていき,0になると破棄されます.

TTLがあることで,IPパケットが同じところを回ってしまう現象(ルーティングループ)を防ぐことができます.

### プロトコル番号
プロトコル番号は,IPペイロードがどんなプロトコルで構成されているかを表します.

例えばICMPだったら'1', UDPであれば'17'などです.

### 送信元/あて先IPアドレス
IPアドレスは32ビットで構成されていて,'192.168.100.1'のような10進数で表します.

送信元IPアドレスがネットワーク上の自分の住所を表します.

あて先IPアドレスは,相手の住所を表します.

# IPアドレス
IPアドレスについてみていきます.

IPアドレスは以下の2つで構成されています.
- ネットワーク部
    - ネットワークそのものを表します.どのネットワークかを示す情報です.
- ホスト部
    - そのネットワークに接続しているノードそのものを表します.どのコンピュータかを示す情報です.

## サブネットマスク
サブネットマスクは,**ネットワーク部とホスト部を区切る目印**です.

サブネットマスクの'1'の部分がネットワークアドレス,'0'の部分がホストアドレスです.

IPアドレスに'172.16.1.1'にサブネットマスク'255.255.0.0'が設定されていたら
'172.16'というネットワークの'1.1'というホストだということです.

#### IPアドレスとサブネットマスク
![スクリーンショット 2024-12-23 170134.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/d909624a-be5f-3cc4-5c20-35c28834c03e.png)

## クラスフルアドレス
IPアドレスは使用用途に応じて,クラスAからクラスEまでに分類できます.

各クラスの詳細は以下のようになります.
#### アドレスクラスの詳細
![スクリーンショット 2024-12-23 171330.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/393891ef-7d1b-cf0b-bbfd-1bd145bc960c.png)

アドレスクラスに基づいてIPアドレスを割り当てる方式を
**クラスフルアドレス**と呼びます.

## クラスレスアドレス(サブネッティング)
クラスフルアドレスでは8ビットごとにIPアドレスを割り当てていました.

8ビットにとらわれずIPアドレスを割り当てる方式を**クラスレスアドレス**と呼びます.

ネットワーク部,ホスト部に加え,**サブネット部**を考えます.

サブネット部を加えることによって,新しいネットワーク部を作り出します.

たとえば'192.168.1.0'というクラスCをサブネット化することを考えます.

このネットワークを16個のネットワークにサブネット化したいならば,4bitをサブネット部として使用することで,
'192.169.1.0/28'から'192.168.1.240/28'までの新しいサブネット化されたネットワークを作ることができます.

## グローバルIPアドレス
グローバルIPアドレスは,ICANNとその下部組織で世界的に管理された
**自由に割り当てることができないIPアドレス**です。

## プライベートIPアドレス
プライベートIPアドレスは,組織内であれば自由に割り当ててよいIPアドレスです.

プライベートIPアドレスは,組織内だけで有効なIPアドレスなので,インターネットに接続するためには,プライベートIPアドレスをグローバルIPアドレスに変換する必要があります.

## ネットワークアドレス
ネットワークアドレスは,ホスト部のビットがすべて'0'のIPアドレスで,ネットワークそのものを表します.

また,IPアドレスもサブネットマスクも'0'で構成されたものは,**デフォルトルートアドレス**となります.

## ブロードキャストアドレス
ブロードキャストアドレスは,ホスト部のビットがすべて'1'のIPアドレスで,同じネットワークに存在するノード全てを表します.

## ループバックアドレス
ループバックアドレスは自分自身を表すIPアドレスです.

第1オクテットが'127'のIPアドレスで,'127.0.0.1/8'が一般的です.

# ルータ
ルータは社内LANとWANを接続するための機器です.


# L3スイッチ
L3スイッチは,LAN同士を接続するための機器です.

# ルーティング
IPパケットの転送先を切り替える機能のことを**ルーティング**と呼びます.

ルータやL3スイッチは,あて先アドレスの参照元(あて先ネットワーク)と,そのIPパケットを転送すべき隣接機器のIPアドレス(ネクストホップ)を管理することで,IPパケットの転送先を切り替えます.

あて先ネットワークとネクストホップを管理するテーブルのことを**ルーティングテーブル**と呼びます.

# ルーティングの例
ノードAがルータを経由してノードBとIPパケットをやり取りする例を取り上げます．

#### 扱うネットワーク構成
![スクリーンショット 2024-12-24 171520.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/17583e87-fb6d-07e0-fe5b-84f85b3fdb03.png)

#### 1.デフォルトゲートウェイに送る
ノードAがノードBに対するIPパケットを作り,フレーム化してケーブルに流します.

ノードBは異なるネットワークなので自身のルーティングテーブルを検索します.

'192.168.2.1'はデフォルトルートアドレス'0.0.0.0'にマッチするので,
ネクストホップの'192.168.1.254'に転送

デフォルトルートアドレスのネクストホップを**デフォルトゲートウェイ**と呼ぶ.

![スクリーンショット 2024-12-26 085519.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/bc7b8c83-6aa2-bd4a-05c3-e60badd730fd.png)

#### 2.R1でルーティングテーブルを見て,どこに送信するか考える
R1はあて先IPアドレスを見て,ルーティングテーブルを検索します.

ルーティングテーブルに'192.168.2.0/24'があり,ネクストホップは'192.168.12.2'であることがわかるので,R2のe0/0にパケットを送信します.
![スクリーンショット 2024-12-26 090514.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/9f502e99-2e8c-487a-b173-a35bcfe0a787.png)

#### 3.R2でルーティングテーブルを見て,どこに送信するか考える
R2はあて先IPアドレスを見て,ルーティングテーブルを検索します.

ルーティングテーブルに'192.168.2.0/24'で直接接続であることがわかり,ノードBにパケットを送信します.
![スクリーンショット 2024-12-26 091932.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/11123644-85b2-7b32-e630-1a86f9de14e1.png)

#### 4.PC2でルーティングテーブルを見て,どこに送信するか考える
パケットを受け取ったノードBは,自分あてのパケットだと判断し,それに応答するためにノードAに対するパケットを作って,フレーム化してケーブルに流します.

ノードBからみてノードAは異なるネットワークにいるノードなので,デフォルトゲートウェイとして設定されているR2のe1/0にパケットを送信します.
![スクリーンショット 2024-12-26 092335.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/d3151b0f-2386-a59a-9c51-e95e05b365fc.png)

#### 5 戻りも同様にルーティングテーブルを使う
戻りのパケットも同じようにあて先IPアドレスを見て,ルーティングテーブルを検索し,ネクストホップに転送するという動きを繰り返します.
![スクリーンショット 2024-12-26 092858.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/2933046c-69a1-5b82-4b8a-23a9a3c9619a.png)

# ルーティングテーブルの作り方
ルーティングテーブルの作り方は大きく分けて以下の二つがあります.
- 静的ルーティング
- 動的ルーティング

## 静的ルーティング
静的ルーティングは,手動でルーティングテーブルを作る方法です.

ひとつひとつあて先ネットワークとネクストホップを設定するので,小さなネットワーク環境のルーティングに適しています.

しかし,大きなネットワーク環境には適していません.

Ciscoルータの場合,「ip route (network) (subnetmask) (next hop)」コマンドで静的ルートを設定可能です.
![スクリーンショット 2024-12-26 094249.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/60a5de52-35f5-bfad-7596-8d481161ac01.png)

## 動的ルーティング
動的ルーティングは,隣接するルータ同士で自分の持っているルート情報を交換して,自動でルーティングテーブルを作る方法です.

ルート情報を交換するプロトコルを**ルーティングプロトコル**といいます.

#### ルート情報をやりとりして,自動でルーティングテーブルを作る
![スクリーンショット 2024-12-26 095724.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/dfc80fdf-8c3e-d702-3668-b1077cebc24c.png)

動的ルーティングの利点は,すべてのルータに設定が必要なわけでもないので,管理の手間がかからないことです.

さらに,あて先までのどこかで障害が発生しても,自動的に迂回ルートを探すので耐障害性も持ち合わせています.

ただし,しっかり設定をしなければ間違いなどがネットワーク全体に伝播してしまうので,しっかりとした設計をする必要があります.

# ルーティングプロトコル
ルーティングプロトコルは**AS(Autonomous System, 自立システム)** によって以下の2種類に分けられます.
- IGP(Interior Gateway Protocol, 内部ゲートウェイプロトコル)
- EDP(Exterior Gateway Protocol, 外部ゲートウェイプロトコル)

## IGP
IGPはAS内で使用するルーティングプロトコルです.

IGPを説明するにあたり,**ルーティングアルゴリズム**と**メトリック**が重要になります.

### ルーティングアルゴリズム
ルーティングアルゴリズムは,どうやってルーティングテーブルを作るか,そのルールを表しており,そのアルゴリズムは**ディスタンスベクタ型**と**リンクステート型**のどちらかです.

### メトリック
メトリックはあて先ネットワークまでの距離を表しています.

### 具体的なIGP
IGPの代表的なものは**RIPv2, OSPF, EIGRP**のいずれかです.

以下の表がそれらの特徴となっています.

![スクリーンショット 2024-12-26 102823.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586226/295ce6c8-882a-4577-6fc1-1f2ae725e23e.png)

## EGP
EGPは,ASとASをつなぐときに使用するルーティングプロトコルです.

EGPの具体的なルーティングプロトコルは**BGP**で,BGPを説明するにあたり,**AS番号,ルーティングアルゴリズム,ベストパス選択アルゴリズム**です.

# NAT
パケットのIPアドレスを変換する技術を**NAT**と呼びます.

もう少し具体的にすると,グローバルIPアドレスとプライベートIPアドレスを相互に変換する機能です.

NATを使用すると,IPアドレスの節約や,同じネットワークアドレスを持つシステム間で通信ができるようになります.

NATは**NATテーブル**と**プロキシARP**によって支えられています.

NATテーブルは,変換前と変換後のIPアドレス,あるいはポート番号を記録している表です.

プロキシARPは,ARP Requestに対して代理で応答する事です.

これは,NATで使用するIPアドレスはルータのインタフェースが持つIPアドレスとは異なるものなので,**ルータはNATで使用するIPアドレスのARP Requestにも代理で応答する必要**があります.

代理で応答し,NATで使用するIPアドレスのIPパケットを受け取り,NATテーブルの情報をもとに変換します.

以下がNATの例となります.
- 静的NAT
- NAPT(Network Address Port Translation)
- Twice NAT

## 静的NAT
静的NATは内部と外部のIPアドレスを1:1に紐づけて変換します.

静的NATは内部から外部にアクセスするとき,送信元IPアドレスを変換し,送信元IPアドレスに応じて,変換するIPアドレスを切り替えます.

外部から内部にアクセスするときは,あて先IPアドレスを変換し,あて先IPアドレスに応じて,変換するIPアドレスを変換します.

あるサーバを,特定のIPアドレスでインターネットに公開したいときなどで用います.

## NAPT(Network Address Port Translation)
NAPTは内部と外部のIPアドレスをn:1に紐づけて変換します.

NAPTは内部から外部にアクセスするとき,送信元IPアドレスだけでなく送信元ポート番号まで変換します.

NAPTを使用することでグローバルIPアドレスが節約できます.

サーバでは,時刻同期やウイルス対策ソフトの定義ファイル更新などの,サーバからインターネットに対するアウトバウンド通信に適用するときなどで用います.

## Twice NAT
Twice NATは送信元とあて先の両方を一気に変換します.

会社が合併したときや会社のシステムと接続するなど,アドレス空間が重複している構成を接続しなければならないときなどで用います.

# 最後に
IPアドレスやルーティングなどをまとめましたが,特にネットワークをつなげるときのルーティングの作業はしっかりと頭の中で,その流れを組み立てられるようになっておきたいです...!

# 参考
[インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門](https://www.amazon.co.jp/%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9-%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%8A%80%E8%A1%93-%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E3%81%BF%E3%82%84%E3%81%9F%E3%81%B2%E3%82%8D%E3%81%97/dp/4797396806)