体験しながら学ぶネットワーク技術入門　をやってみた

# 概要
tinet を使って簡単に、Web server / DNS / Client ができた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/7880e2f5-0213-4059-6c5a-82a71a841896.png)

# 参考文献
[体験しながら学ぶネットワーク技術入門](https://www.sbcr.jp/product/4815618599/) みやたひろし著
# 更新履歴
1章　2024年3月29日
2章　2024年12月28日
 
# 詳細
## 1 検証環境 WSL2, Docker
### 1-2-3. WSL2 
- [x] WSLをインストール
- [x] タスクマネージャ＞仮想化 `有効`　よし！
- [x] Powershell > WSLのバージョン `2` よし！

### 1-2-3 セットアップスクリプト実行
- [x] 本のURLからtinetをダウンロード
- [x] setup.shをubuntuで実行

### 1-3-3 tinetの使い方
- [x] tinet up　イメージのDL、 コンテナ起動
- [x] tinet conf IPアドレスの設定、サービスの起動
- [x] tinet test テストコマンド pingを打つ等
こんなイメージでtinetがコンテナを建てて、設定とテストをしてくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/228d8623-65f3-9e5e-1cd5-1eaa86d82dfe.png)
### ネットワーク構成図の生成
- [x] graphvizの apt install
- [x] tinet img ネットワーク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/f6a9bec4-2f80-fc93-7164-4271b032801d.png)
ポンチ絵にするとこんな感じ
### 1-4-3 動作確認
- [x] client 1から sv1 に curl http get
 ポンチ絵にするとこんな感じ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/f57eef6e-6550-2d89-4c4f-361c19cdc268.png)
## 2 レイヤー2
### 2-1 イーサーネット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/d0cadc09-5622-f337-14cf-c5099032d090.png)
```
|宛先MAC||送信元MAC|
|タイプ IPv4なら-x0800 ||ペイロード|
```
MACアドレスの1byte目の下位2bitが、ユニキャスト・ブロードキャスト、ユニバーサル・ローカルアドレスの識別
```
 xx :xx :xx : yy :yy :yy
|ベンダを識別| ID        |
```

- [x] tinet down 01.yaml
- [x] tinet up 02.yaml
- [x] pingをキャプチャする
- [x] etherの構成とMACアドレスの構成を確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/92599aed-d0e0-ae5b-a9cd-417be489357e.png)
### 2-2 ARP(Address Resolution Protocol)
フォーマット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/e0a1e68b-eb81-ac93-3bd6-f0e67b210ee5.png)
```
|Hardware type = 0x0001 ether | Protocol type = 0x0800 IPv4 |
|Hardware size = MAC 6 byte| Protorlsize = IIPアドレス 4byyte| Opcode|
|Sencer Mac Address| 
                                     |Sender IP address |
|Target Mac Address|
|Target IP Address |                                      
```
-[x] ARPテーブルをクリア　ip enigh flush all
-[x] cl3 ⇒ rt1にpinng。ARPテーブルにcl3のIPアドレスとMACアドレスを登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/093a55aa-1e80-ceb9-8028-07de030e26fa.png)

### 2-3 L2スイッチ OVS(Open vSwitch)
-L2スイッチの物理ポートと接続している対向のクライアントのMACアドレスを紐づける。
-[x] sw1のMACアドレステーブルを見る ovs-appctl 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/01d19c82-e83c-4a7a-35c2-1da650d5c40b.png)

### 2-3-2 VLAN (OVSでポートVLAN・タグVLAN)
- ポートVLAN 1台のL2SWを分ける。物理ポート毎に異なるVLAN ID
- タグVLAN 1つの物理ポートで複数のVLANを識別
- OVSにポートVLANとタグVLANを設定し、pingの疎通を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/99410fcf-ff0d-6ca4-c3f1-c06e4928e0e5.png)

## 3章　レイヤー3
- BBルーター　WANポートとLANポートがあり、ルーチング・DHCP・NAT機能がある。
- IPヘッダ
```
|バージョン IPv4(0100)|ヘッダ長| ToS(DSCP+ECN 優先と輻輳制御)|パケット長|
|識別子(フラグメント用)|フラグ(フラグメント可否等)|フラグメントオフセット|
|TTL|プロトコル番号|ヘッダーチェックサム|
|送信元IP|
|宛先IP|
```
- ICMPのパケットフォーマット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/4c4b3fdd-c679-e98c-fcae-9fb9aebf72b0.png)
```
|タイプ: 8=Echo requst|コード: 0=Echo request |
```
pingを打って、IPとICMPのフォーマットを確認
[x] tinet down, tinet up, tinet conf
[x] Cl2でtcpdumpスタート
[x] Cl1からCl2にpingを打つ

### 3-2 静的・動的ルーティング
vtyshでOSPFをなんとなく設定したらできた。動的ルーティングが設定できた。OSPFは別途勉強せねば。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/a478e623-8e6e-cd72-7e7c-aa04c93c632b.png)

### 3-3 NAT
- 静的NAT iptableを使い静的NATのを設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/21f38c74-b0d3-d071-a2ce-4978f2b1fa7c.png)
### 3-4 NAPT
- iptablesを-j MASQUERADEに設定したらできた。
## レイヤー4
ncコマンド　UDP/TCPの送受信ができる。
### 4-1 UDP
-ncコマンド　UDP/TCPの待ち受けポートを指定したり、送信したり
-ssコマンド　待ち受け中のポートが見れる。
#### 実践UDP
cl1 から ns1に UDPで Helloを送る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/89e63e8a-ea5d-bb70-17c4-ed6b1697631d.png)

### 4-2 TCP
- TCPのフォーマット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/c13da10d-4c94-a01b-6742-a04a2362b662.png)

```
|送信元ポート|宛先ポート|
|シーケンス番号：最初はランダム値、次回は送信したアプリデータのバイト数分増やす|
|ACK番号：データ受取り時にシーケンス番号＋データのバイト数をレスポンス|
|データオフセット：ヘッダ長|予約領域|コントロールビット：途中のルータで輻輳を検知するとECN-Echoビットを立ててレスポンス。送信側はそれを見てCongestion Window Reducedビットを立てる？、ACK, SYN, FIN等|ウィンドウサイズ：受信側で受け取れるデータサイズ|
|チェックサム|緊急ポインタ|
|オプション：Maximum Segment Size, Selective ACK(受信できなったデータの後に受信したデータの分のACKを返す)|
```
- 状態遷移
#### 実践TCP
- サーバ側（ns1）でncコマンド（TCP待ち受けの設定） 
:::note info
- ss -nltpコマンドで確認したがポートが開いてなさそう
- うまくいかなかったので、wsl --shutdown, tinet up/confからやり直したらできた。
:::
TCPの3ハンドシェーク後に、ペイロードが送られている様子がパケットを見てわかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/9ee9c64e-e518-46ce-184b-9cf8c343ec86.png)
送るペイロードサイズ分シーケンス番号が増える。
データ受け取ったら、受信した分ACK番号増やしてACKする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/5db31b3b-2a62-8052-82f3-02c5228aea61.png)
### 実践UDPファイアウォール
destination アドレスを間違えて、DROPしたりしてしまったが何とか出来た。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/7c1b187c-535f-5e90-9dcb-2daaafb3bd0f.png)
### 実践TCPファイアウォール
skip
## 5 レイヤー7
### HTTP/2
#### ヘッダ構成
|  | 中身 | メモ |
|:-:|:-:|:-:|
| 疑似ヘッダ  | メソッド・path等 | リクエストライン相当|
| ヘッダセクション | User-Agent等  |　パラメータ相当  |
| コンテンツ |データ　|ボディ部相当 |
#### データを流す前
- ALPN(Application-Layer Protocol Negotiation)でクライアントとサーバで機能拡張をサポートしているか能力交換
- ダイレクト接続　ネゴしないでいきなりHTTP/2で接続しに行く
### 実践HTTP 1.1 キャプチャ
- fw1 GET HTTP/1.1 -> sv1
  - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/593f0259-d271-ecfc-d65a-558877d7c646.png)
- sv1でキャプチャ
  - TCPの3 way hand shakeで SYN,ACKしてからGET
  - 200レスポンスして、FIN, ACK
      - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/edc9e88e-0aed-24d0-b82a-06c7b4ab95cd.png)

### 実践 SSL/TLS