初学者のためのLINUC202①　8.1DHCP

## はじめに
教本だけでLINUC101,102,201を短期合格しましたが、202の学習開始まで時間が開きほぼ一夜漬けで入れた201以前の記憶が全くない、、、詰
なので、コマンドのおさらい等々細かく学習をするための記事です。
202試験全てを網羅する予定なので、受験予定の方はシリーズものとしてご覧ください。


## DHCPとは
DHCP(Dynamic Host Configuration Protocol)とは、サーバー側が複数持っているIPアドレスを、問い合わせに応じて自動的に振り分けますよってサービス
## 仕組み
### 概略
```mermaid
sequenceDiagram
    participant c as DHCPクライアント
    participant s as DHCPサーバー
    c ->>s: UDPバケット送信！求むIP！
    Note right of c: ①DHCP Discover
    s-->>c: ( •ᴗ• )⸝はい、仮IP
    Note right of c: ②DHCP Offer
    c->>s: いい感じだから正式に使いたいです～
    Note right of c: ③DHCP Request
    s-->>c:おん、ええよ（リース）
    Note right of c: ④DHCP Ack
```
同じIP使わないようにARP要求ブロードキャストでクライントに確認して完了！

### ログファイルの確認
使用コマンド：**journalctl**
ディレクトリ：**/var/log/messages** もしくは **/var/log/syslog**

## 設定
DHCPサーバー：主に**ISC**(Internet Software Consortium DHCP)**DHCP**。**デーモン->dhcpd**
DHCPクライアント：`dhclient`,`pump`,`dhcpd`

## dhcpdの設定に着目
| 設定項目 | 内容 |
|:-----------|:------------|
|option domain-name|ドメイン名|
|option domain-name-servers|DNSサーバー|
|option routers|デフォルトゲートウェイIP|
|option subnet-mask|サブネットマスク|
|option broadcast-address|ブロードキャストアドレス|
|option ntp-servers|NTPサーバーIP|
|option netbios-name-servers|WINSサーバーIP|
|default-lease-time|クライアント側の指定が**ない**場合のデフォルトリースタイム（秒）|
|max-lease-time|クライアント側の指定が**ある**場合の最大リースタイム（秒）|
|range [dynamic-bootp]|クライアントに割り当てるIPの範囲|
|dynamic-bootp|フラグ有→BOOTPクライアントへ割り当て|
|host|クライアント**で**固定IPを使用する場合に記載（クライアント側）|
|fixed-address|クライアント**に**固定で割り当てるIP（サーバー側）|
|hardware|クライアント特定のためのMACアドレス|

### dhcpd.confのフォーマット

```dhcpd.conf
subnet `サーバーのIP` netmask 255.255.255.0{
    option routers `デフォルトゲートウェイIP`;
    option subnet-mask ``;
    option domain-name `ドメイン名(例："example.com")`;
    option domain-name-servers ``;
    option ntp-servers ``;
    option netbios-name-servers ``;
    range ``;
    default-lease-time ``;
    max-lease-time ``;
    host subnote {
        hardware ethernet ``;
        fixed-address ``;
    }
}
```

## サブネットごとの設定
### サブネットって何？orなんだっけ
そう思った方は↓の記事にて解説してるので、よかったら見てください👀

https://qiita.com/tgr_oi/items/e7308ae3bcddd9f3b046

一言で表すと、複数～大量のIPの管理の仕方です



### ☆ポイント☆
（1）特定のサブネットに対して、割り当てるIPアドレスの範囲を指定する
（2）特定のマシンに固定でIPアドレスを割り当てたい場合はMACアドレスで指定をする

### 設定例
上記ポイントの項目と紐づけ、2台のマシンを設定する場合を考えます。
（1）サブネットと割り当てるIPアドレスの範囲
```
サブネット → 192.178.5.0
```
```
IPアドレスの範囲 → 192.178.5.10 ~ 192.178.5.50
```
（2）特定のマシンのマックアドレスと割り当てる固定IPアドレス
2台に対して固定IPアドレスを割り当てることを想定します。

```
ホスト名 →　machine1
MACアドレス → C8:1F:66:00:11:22
IPアドレス → 192.178.5.100
```
```
ホスト名 →　machine2
MACアドレス → 00:1B:8B:00:11:22
IPアドレス → 192.178.5.101
```
~~ちなみに、「C8-1F-66」は「DELL」、「00-1B-8B」は「NEC」がそれぞれ管理するベンダコードでs....~~
ｺﾞﾎﾝ

### 設定ファイル
設定例の内容に沿い、dhcpd.confを記述してみます。
```dhcpd.conf
subnet 192.178.5.0 netmask 255.255.255.0 {
    range 192.178.5.10 192.178.5.50;
    host machine1 {
        hardware ethernet C8:1F:66:00:11:22;
        fixed-address 192.178.5.100;
    }
    host machine2 {
        hardware ethernet 00:1B:8B:00:11:22;
        fixed-address 192.178.5.101;
    }
}
```

## リース期間の設定
### リース期間って？
IPアドレスを貸し出す期間を示す。

### ☆ポイント☆
（1）リース期間の設定は`dfault-lease-time`で設定し、単位は**秒**を用いる。
（2）クライアントからも**期間の要求**が可能なので、その場合の最大値を`max-lease-time`で設定をする。->`dhcpd.confに記載`
（3）貸し出したIPアドレスとホストの情報は`dhcpd.leases`に記録される。

### ファイルの出力例
せっかくなので、サブネットごとの設定の際に書いた`dhcpd.conf`内の1マシンを例にします

```dhcpd.leases
lease 192.178.5.101{
    starts 3 2024/03/05 08:55:06;
    end 3  2024/03/05 12:55:06;
    cltt 3  2024/03/05 08:55:06;
    binding state active;
    next binding state free;
    rewind binding state free;
    hardware ethernet 00:1B:8B:00:11:22;
}
```

## DHCPクライアントの設定
マシンを起動した際にDHCPが有効になるように設定するには、CentOS,Ubuntu,Debian/GNU Linux,NetworkManagerを利用しているか等により、設定の方法が異なります。
ネットワークインターフェースがenp0s3の場合の各環境に合わせた設定を記載します。

**CentOS**
```:/etc/sysconfig/network-scripts/ifcfg-enp0s3
BOOTPROTO = dhcp
```

**ubuntu,Debian/GNU Linux**
```:/etc/network/interfaces
iface enp0s3 inet dhcp
```

**NetworkManager**
```:nmcliコマンド
# nmcli con mod enp0s3 Ipv4.method auto
```

## DHCPサーバからのIP等の取得
dhclientコマンドを使用すると、サーバのIPアドレス等の情報の取得、IPアドレスの設定が可能です。
ネットワークインターフェースはenp0s3とします。
```
# dhclient -d enp0s3
```

dhclient の主なオプション
| オプション　 |内容|
|:---------|:------------------------|
|-1|1回の借り受けに対し一度だけIPアドレスの取得を試みる|
|-4|IPv4アドレスと設定値を取得するときにDHCPv4プロトコルを使用する|
|-6|IPv6アドレスと設定値を取得するときにDHCPv6プロトコルを使用する|
|-F|FQDN（Fully Qualified Domain Name：完全修飾ドメイン名）を指定する（-Hオプションとの同時使用は不可）|
|-H|ホスト名を指定する（-Fオプションとの同時使用は不可）|
|-d|常にフォアグラウンドプロセスとして実行するよう強制する|
|-e|環境変数を定義する|
|-p|任意のポート番号（UDP）を指定する|
|-q|エラー以外のメッセージを標準エラー出力へ書き出さない|
|-r|現在借り受けているIPアドレスを開放する|
|-s|DHCPサーバーのアドレスを指定する|
|-cf|設定ファイルのパスを指定する|
|-lf|リース（借り受け）ファイルのパスを指定する|
|-pf|PIDファイルのパスを指定する|

## DHCPリレーエージェント
以下にリレーに関する説明を記載しますが、読むうえで最も重要なのは、`ルーターに持たせる機能である。`という点を最初に理解することだと思います。

### DHCPサーバ、DHCPクライアントについて
DHCPサーバ、クライアント間の通信は**ブロードキャストアドレス**が使用されるため、同サブネットに存在している必要があり、ネットワークが隔てられた環境でDHCPサーバを導入する場合は、**それぞれのサブネットごと**に導入をする必要があります。
これを実現しようとすると、大きなコストがかかり現実的ではありません。
DHCPリレーエージェントを利用すると、ルーターが**ブロードキャストで受信しユニキャストへ変換しDHCPサーバに転送**されるため異なるサブネット間での利用が可能になる機能です。

## IPv6でのIPアドレスの自動設定について

DHCPなしでIPアドレスの自動設定が、ステートレス自動設定によって可能です。
```mermaid
sequenceDiagram
    participant c as IPv6クライアント
    participant s as IPv6ルーター
    c ->>s: ルーター要請
    Note right of c: RS：Router Solicitation
    s-->>c: ルーター通知
    Note right of c: RA：Router Advertisement
    Note left of c: ルーターからの情報<br/>(プレフィックス)<br/>×<br/>MACアドレスから生成される情報<br/>(インターフェースID)<br/>↓<br/>IPv6アドレスを生成！！

```
Linuxではradvdパッケージの導入でRAの送信が行えるようになり、設定ファイルは`/etc/radvd.conf`


## おわりに
DHCPに関して、202受検に必要な知識をかみ砕いてまとめてみました。
ラズパイの勉強も並行してしており、VPNサーバ構築に挑みたいので、次の記事は教本少し飛んでVPNサーバ周りになります！

最後までお読みいただきありがとうございました。


## メインで使用している参考書は以下です
Linux教科書 LinuCレベル2 Version 10.0対応

https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LinuC%E3%83%AC%E3%83%99%E3%83%AB2-Version-10-0%E5%AF%BE%E5%BF%9C-%E4%B8%AD%E5%B3%B6/dp/4798167967