TCP/IP再学習(インターネット層)

## はじめに

AWSなどのクラウド基盤構築時はTCPを意識せずに、
各サービス機能の組み合わせで何となく構築ができてしまいませんか。
上記のようなAWSありきのインフラ知識から脱出すべく、
インフラの基礎知識であるTCP/IPに関して知識の整理を行うことを目的とした備忘録になります。

## TCP/IPプロトコルの全容を図形で確認
ひとまず学習対象であるTCP/IPプロトコルの全容を確認する。
ここではTCP/IPは以下図の構成となっていることだけ再認識。
![2023-06-13_07h27_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/f74ee6b5-e67a-67c9-e989-652a8d87ad2b.png)
| 層 | 名称 | 規格(プロトコル) | 利用例 |
| --- | --- | --- | --- |
| 4層 | アプリケーション層 | HTTP,HTTPS,SMTP,POP3,IMAP4,DHCP,DNSなど | Webサイト閲覧、メールファイル転送など |
| 3層 | トランスポート層 | TCP,UDP,NetWare/IPなど | TCP/UDP(データを適切なアプリケーションへ振り分け) |
| 2層 | インターネット層 | IP,ARP,RARP,ICMP | ルーティング,エンドツーエンド通信,Ping |
| 1層 | ネットワークインターフェイス/リンク層 | Ethernet | LAN |

[※参照：TCP/IPプロトコル通信のネットワークアーキテクチャを図解で解説](https://www.itmanage.co.jp/column/tcp-ip-protocol/)

## インターネット層(2層)とは
### 一言でいうと
インターネット層の主な役割は「ネットワークをつなぎ合わせ、別のネットワークにいる端末との接続性を確保」することである。
要するに**複数のネットワーク間のデータ転送を行う役割**を目的とした階層となる。
### インターネット層で利用される代表的なプロトコルについて
IP(IPv4,IPv6)：ネットワークに接続する端末を識別したり、データを小分けにするための情報を扱う。
ICMP：IPレベルの通信を確認したり色々なエラーを通知したりと、IPネットワークにおける通信エラー調査の役割を持つ。
IPSec：ネットワーク層でIPパケットのカプセル化や認証、暗号化を行い、インターネット上に仮想的な専用線を作る仮想化技術

### IPについて
前提としてIPとは「Internet Protocol (インターネットプロトコル)」を略したもので、インターネットに接続された端末同士が情報をやり取りするための通信規格を意味しています。

また、情報のやり取りには、端末に住所のようなものを振り分けておく必要があります。これが「IPアドレス」と呼ばれるものです。PCやスマホ、タブレットなど、それぞれの端末にIPアドレスが与えられることで、メールの送受信やWebページの閲覧が可能になります。

### IPv4について
IPv4は「**Internet Protocol Version 4**」の略称であり、IPプロトコルの第4版を意味しています。

#### IPv4のパケットフォーマットについて
IPv4がヘッダーとしてトランスポート層から受信したデータに付与する内容は以下である。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/74f12682-f128-685e-207b-0f54892a6c74.png)
[参照：ipヘッダのフォーマットとサイズの基本](https://shinmeisha.co.jp/newsroom/2020/06/08/ip%e3%83%98%e3%83%83%e3%83%80%e3%81%ae%e3%83%95%e3%82%a9%e3%83%bc%e3%83%9e%e3%83%83%e3%83%88%e3%81%a8%e3%82%b5%e3%82%a4%e3%82%ba%e3%81%ae%e5%9f%ba%e6%9c%ac/)

■バージョン
　IPバージョン。IPv4では「4(2進数で0100)」を格納。

■ヘッダ長
　IPv４のヘッダの長さを表す4ビットのフィールド
　パケットを受け取る端末はこの値を確認することで、どこまでがIPヘッダなのか認識できる
　4バイト(32bit)単位に変換される値が入る。例：20バイト(160ビット＝32ビット*5)なので「5」となる。

■サービスタイプ
　パケットの優先順位を表す情報を格納。

■パケット長
　IPヘッダとIPペイロード(トランスポート層でカプセル化されたパケット)を合わせた、全体の長さを表す。

■識別子
　パケットには同じ識別番号にすることで、受信側で複数の分割されたパケット
　を受信した場合においても、この識別番号に基づき正しく組み立て処理できる。
　　※パケット交換方式通信では、パケットを分割して送信します。
　　　なお、IPでデータを小分けにする処理を「フラグメンテーション」という

■フラグ
　IPパケットをフラグメンテーションしてよいかの情報。

■フラグメントオフセット
　フラグメントされたパケットが元のパケットのどの位置であったかを示す情報。
　パケットを受け取る端末は、この値をみてIPパケットの順序を正しく並べ替る。

■生存時間(TTL)
　IPパケットの寿命を表す情報が格納。
　IPの世界ではIPパケットの寿命を「経由するルーターの数」で表す。
　経由するルーター数を「ホップ数」といい、TTLはルーターを経由するたびに、
「1」ずつ減れされてTTL値が「0」になるとパケットが破棄される。
　※破棄＝TTL exceededというICMPパケットを返送

■プロトコル番号
　上位層(トランスポート層)のプロトコルが何であるかを示す情報。
　この値は標準化されており、上位プロトコルでTCPを使用する場合は、
　このプロトコル番号が「6」となる。

■チェックサム
　IPヘッダのチェックサムを表す情報。IPヘッダにエラーがないかをチェック。

■送信元IP 
　32ビット（4byte)で構成された、送信元のIPアドレスの情報。
　　※IPアドレスはIPv4ネットワークにおける住所のような存在

■送信先IP
　32ビット（4byte)で構成された、宛先のIPアドレスの情報。

■オプション
　通常は使用されないが、デバックやテストを行う際に使用される情報。

■パティング
　通常使用されないが、上記のオプションを使用した場合にはIPヘッダ長が
　32ビットの整数倍にならない場合がある。32ビットの整数倍にするために
　詰め物(Padding)として空データの 「 0 」 の値を入れることにより調整する。

### IPv4アドレスとサブネットマスクについて

IPヘッダーの中で最も重要なフィールドが「送信元IPアドレス」「宛先IPアドレス」となる。
改めてIPv4アドレスとはIPv4ネットワークに接続された端末の識別IDである。
32ビット(4バイト)で構成されており、「192.168.1.1」などの10進数で表記することができる。
この表記方法を「ドット付き10進記法」と呼ばれている

#### サブネットマスクはネットワークとホストの分かれ目
IPv4アドレスはそれ単体で使用するわけではなく、
「サブネットマスク」という値と設定で使用することが一般的である。
IPアドレスは「ネットワーク部」「ホスト部」の二つで構成されており、
ネットワーク部は「どのIPv4ネットワークにいるのか」を表しています。
ホスト部はそのネットワークの中で「どの端末なのか」を表しています。

なお、以下例の通り「192.168.11.1」のIPアドレスに対して、サブネットマスク「255.255.255.0(/24)」を設定すると「ネットワーク部：192.168.11.x」「ホスト部：xxx.xxx.xxx.1」となる。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/c126ef1d-77e0-1f8d-daf6-1998693370d1.png)
[参考：サブネットマスクを理解するPart1　基礎からのネットワーク⑥](http://www.runsurunet.com/2017/10/11/%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E3%83%9E%E3%82%B9%E3%82%AF%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B/)

#### 色々なIPv4アドレスについて
IPv4アドレスは「0.0.0.0」～「255.255.255.255」まで利用可能だが、
一定にルールに基づいて使用する必要がある。
この仕様ルールを「使用用途」「使用場所」「除外アドレス」という3分類で確認を進める。

##### 使用用途における分類
IPV4アドレスは使用用途に応じてクラスＡ～Eのクラスに分類が可能
一般的なユーザはクラスA~Cまでを使用し、1:1通信で使用する(ユニキャスト)
基本的にクラスごとの違いはネットワーク規模の違いである。

| アドレスクラス | 名称 | 先頭ビット | 開始IPアドレス | 終了IPアドレス | ネットワーク部 | ホスト部 |
| --- | --- | --- | --- | --- | --- | --- |
| クラスA | ユニキャスト大規模 | 0 | 0.0.0.0 | 127.255.255.255 | 8ビット | 24ビット |
| クラスB | ユニキャスト中規模 | 10 | 128.0.0.0 | 191.255.255.255 | 16ビット | 16ビット |
| クラスC | ユニキャスト小規模 | 110 | 192.0.0.0 | 223.255.255.255 | 24ビット | 8ビット |
| クラスD | マルチキャスト | 1110 | 224.0.0.0 | 239.255.255.255 | - | - |
| クラスE | 研究・予約用 | 1111 | 240.0.0.0 | 255.255.255.255 | - | - |

###### クラスレスアドレッシング
上記のアドレスクラスに捕らわれずにIPv4アドレスを割り当てる方式を、
「クラスレスアドレッシング」という。
IPv4アドレスの中に「サブネット部」という新しい概念を入れることで、
IPv4アドレスを効率的に管理することができる。

例として「192.168.1.0」をサブネット化してみる
「192.168.1.0」はクラスCのIPアドレスなのでネットワーク部24ビット、ホスト部は8ビットとなる。
この8ビットのホスト部からサブネット部を割り当てることが可能となる。

今回は16個のネットワークをサブネット化した例を記載する。
まず、16個のサブネットに分割するためには4ビットが必要になる(16=2の4乗)
この4ビットをサブネット部として利用し、新しいネットワーク部を作成する。
その場合、「192.168.1.0/28～192.168.1.240/28」までの16個に分割されたネットワークが利用でき、各ネットワークは最大14個(2の4乗-2)のIPアドレスを割り当て可能になる。

###### 使用場所による分類

使用場所によって「グローバルIPv4アドレス」「プライベートIPv4アドレス」の2種類に分類可。
前者は世界で一意なIPであり、後者は企業や家庭のネットワークなど限られた組織内で一意なIP

■グローバルIPv4アドレス
日本のグローバルIPは「JPNIC」が管理していて、
新規の割り当ては制限が設けられている。

■プライベートIPV4アドレス
組織内だけであれば自由に割り当て可能。
しかし、インターネットに直接的に接続することができるわけではなく、
インターネットに接続するときは、グローバルIPv4に変換する必要がある。
このIPアドレスの変換を「NAT」という。
※家庭ではブロードバンドルーターがNATの役割をもつ

###### 除外アドレス
特定のIPアドレスは元から役割が与えられているため、
端末には設定できないアドレスがいくつか存在している。
代表的なアドレスは「ネットワークアドレス」「ブロードキャストアドレス」「ループバックアドレス」である。

■ネットワークアドレス
ホスト部のビットが全て「0」のIPアドレスで、ネットワークそのものを表している。
例えば、「192.168.100.1/24」の場合は「192.168.100.0」がネットワークアドレスになる。
なお、アドレスもサブネットも全て「0」とした「0.0.0.0/0」はデフォルトルートアドレス(全てのネットワーク)になります。
AWSのルートテーブルで「0.0.0.0/0」にIGWを設定している理由はVPC内以外に飛ばす通信を全てIGWにルーティングするためとなる。

■ブロードキャストアドレス
ホスト部のビットが全て「1」のIPアドレスで、同じネットワークに存在する全ての端末を表している。
例えば、「192.168.100.1/24」の場合は「192.168.100.255」がブロードキャストアドレスになる。

なお、アドレスもサブネットも全て「1」とした「255.255.255.255/32」はリミテッドブロードキャストアドレス(全てのネットワーク)になります。

ブロードキャストとリミテッドブロードキャストの違いは、「○○ネットワークにある全部のコンピュータ」か「今自分がいるネットワークにある全部のコンピュータ」の違い。
リミテッドブロードキャストは自分のIPv4アドレスやネットワークアドレスがわからないときやDHCPv4でアドレスを取得するときに使用する。

■ループバックアドレス
自分自身を表すIPv4アドレスで、第一オクテットが「127」のIPv4アドレスとなる。
第一オクテットが「127」であればよいが一般的には「127.0.0.1/8」が設定される。
※たまにやるlocalhostは「127.0.0.1」を指していることが多い。
　設定はhostsファイルに明記されている。

### IPルーティング
IPルーティングとは宛先IPアドレスと照らし合わせる「宛先ネットワーク」という情報を、IPパケットを転送すべき隣接機器のIPアドレスを表す「ネクストホップ」という情報を管理することでIPパケットの転送先を切り替えることを指す。

宛先ネットワークとネクストホップを管理するファイルを「ルーティングテーブル」という。

##### ルーターがIPパケットをルーティング例
ルーティング設定は以下図のような設定となり、
ネットワーク部のみ指定をすればそのネットワークに属しているサーバへのリクエストがネクストホップ記載先にルーティングされる。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/aafb96a7-880e-1715-d0f8-34898390eca3.png)
[参考：ルーティングの動作とルーティングテーブル ～ IPパケットの転送は電車の乗り換えのように](https://hrzine.jp/article/detail/217)

##### ヘッダーにおける付与のタイミング
以下の通り、ルーティングテーブルの参照は、ネットワーク層で実施される。
デフォルトルート「0.0.0.0」は全てのネットワークが該当するため、
端末はインターネット上に存在する不特定多数のWebサイトにアクセスするときはとりあえずデフォルトゲートウェイにIPパケットを送信し、あとはデフォルトゲートウェイの機器にルーティングを依頼する。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/e6acd62e-a67c-423b-ec39-fb030c8ffecd.png)

## ルーティングプロトコル
### DHCP
端末に対して自動でIPアドレス/デフォルトゲートウェイ(0.0.0.0のこと)/DNSサーバ情報などを連携する仕組み。
DHCPサーバに対しては「リミテッドブロードキャスト」で通信を行う。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/dd9fb6d5-23fa-9411-1eff-8318001b2a78.png)
[参考：【DHCP】環境でIPアドレスが変わるタイミング ~PC再起動時にIPが変わらない理由~](https://milestone-of-se.nesuke.com/l7protocol/dhcp/ip-after-reboot/)

### ICMPについて
ICMPはIPレベルの通信を確認したり色々なエラーを通知したりと、
IPネットワークにおける通信エラー調査の役割を持つプロトコルである。
　※「Ping」「traceroute」コマンドはこのプロトコルを使用している

#### ICMPのパケットフォーマットについて
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/783ce340-0aff-3150-6466-8fe8f39402e1.png)
[参考：ICMP](https://www.infraexpert.com/study/tcpip4.html)

ICMPを構成する上記フィールドの中で最も重要なのでが、メッセージの最初にある「タイプ」「コード」である。この二つの組み合わせでIPレベルでどんなことが起きているのか、ざっくりと知ることができる。
組み合わせは以下表のとおりである。
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/944f15d2-bd54-b737-7ae1-11b1fe859e40.png)
[参考：ICMP](https://www.infraexpert.com/study/tcpip4.html)

#### Echo Request/Reply
IPレベルの通信状態を確認するときに使用されるICMPv4バケットが「Echo Request(エコー要求)」と「Echo Reply(エコー応答)」となる。
コマンドプロンプトでpingコマンドを実行すると、指定したIPアドレスに対して「タイプ：8」「コード：0」のEcho Requestが送信されます。
Requsestを受け取った端末は「タイプ：0」「コード：0」のEcho Replyを返します。

ネットワークでのトラブルシュートの際は、pingが調査の第一歩になるかと思います。
pingでネットワーク層レベルの疎通を確認して、Echo Replyが返ってくるようであればトランスポート層(TCP/UDP)→アプリケーション層(HTTP,SSL,DNSなど)と上位層に向かって疎通を確認します。
Echo Replyが返ってこないのであれば、ネットワーク層(IP)→データリンク層→物理層と下位に向かって疎通を確認します。

#### IPsec
IPsec(Security Architecture for Internet Protocol)は、ネットワーク層でIPパケットのカプセル化や認証、暗号化を行い、インターネット上に仮想的な専用線を作る仮想化技術。
暗号化によってパケットの暗号化や改ざん検知を実現するためのプロトコル群。

IPsec(Security Architecture for Internet Protocol)は、ネットワーク層でIPパケットのカプセル化や認証、暗号化を行い、インターネット上に仮想的な専用線を作る仮想化技術。
暗号化によってパケットの暗号化や改ざん検知を実現するためのプロトコル群。

##### IPsecの種類

■拠点間IPsec VPN
拠点間IPsec VPNは、色々な場所に拠点(支社やクラウド環境など)がある企業の接続に使用される。IPSecを使用して、インターネット上にトンネル(仮想的な直結回線)を作って、あたかも専用線で接続されているかのように拠点のネットワークを接続します。
専用線と同じように使用できるにもかかわらず、インターネットの接続料金だけで拠点間を接続できるため、大幅なコストダウンを図ることが可能となる

■リモートアクセスIPsec VPN
リモートアクセスIPsec VPNは、モバイルユーザやテレワーカーのリモートアクセスで使用されます。自宅からテレワークするような場合に、OSの標準機能やサードパーティのVPNソフトウェアなどを使用して、VPN用の仮想的なNICを作りVPN装置にIPsecトンネルを作る。

■IPSecプロトコルが持っている機能
IPSecは「IKE(Internet Key Exchange)」「ESP(Encapsulating Security Payload)」「AH(Authentication Header)」という3つのプロトコルを組み合わせてVPNを作成する。

基本的には「IKE」「ESP」を使用するが「ESP」が使用できない場合「AH」を使用する

■IKE
IKEプロトコルは鍵交換に用いられるプロトコルです。
IPSecを利用した暗号化通信では最初に鍵交換などのSAの合意をとる必要がありますが、このような合意を手動で行うことは難しいため、自動で行うことが望ましいです。そのため、自動的にSAの合意を取ることができるIKEプロトコルを鍵交換プロトコルとして利用しています。

■ESP
ESPプロトコルはデータの転送に利用されるプロトコルです。
ペイロード部分と32ビットのSPI、シーケンス番号、認証データといった情報がすべてに暗号化されており、同梱されています。このことにより、ESPプロトコルでもパケットが改ざんされていないかどうかの認証ができます。

■AH
AHプロトコルは完全性の保証や認証機能を持ったプロトコルです。
AHプロトコルではパケットの暗号化はできませんが、そのかわり、SPIやシーケンス番号、認証データのみをパックし、IPパケットの中に加えています。そのことにより、パケットが改ざんされていないかどうか認証することが可能となっています。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/fccfccec-c240-e646-902f-bd95af748bec.png)
[参考：IPsec ( Security Architecture for IP )](https://www.infraexpert.com/study/ipsec5.html)

## 最後に
AWSなどのクラウドに触り続けると、
インフラの基礎的なことが理解できないまま構築が進んでしまいます。
本記事は個人の備忘録となりますが、誰かの何かの役に立てば幸いです。

### 参考文献
この記事は以下の情報を参考にして執筆しました。
- [サブネットマスクを理解するPart1　基礎からのネットワーク⑥](http://www.runsurunet.com/2017/10/11/%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E3%83%9E%E3%82%B9%E3%82%AF%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B/)
- [ルーティングの動作とルーティングテーブル ～ IPパケットの転送は電車の乗り換えのように](https://hrzine.jp/article/detail/217)
- [【DHCP】環境でIPアドレスが変わるタイミング ~PC再起動時にIPが変わらない理由~](https://milestone-of-se.nesuke.com/l7protocol/dhcp/ip-after-reboot/)
- [ICMP](https://www.infraexpert.com/study/tcpip4.html)
- [IPsec ( Security Architecture for IP )](https://www.infraexpert.com/study/ipsec5.html)