DHCPで固定IPと動的IPを共存させる

# DHCPで固定IPと動的IPを共存させる

## こんな人向け
- ルーターの設定を編集して、DHCPで固定IPと動的IPを共存させたい
- DHCPのIPアドレスプールの中に固定IPが含まれていてほしい

## やること
- DHCPで動的にアドレスを割り当てる
- 一部の端末には固定IPアドレスを割り当てる
- 固定IPアドレスはDHCPのプールの中に含まれる

図にするとこうなります。

![DHCPのアドレスプールに動的IPアドレスと固定IPアドレスが含まれている図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2922519/ecc6eb3e-c41f-21bb-7cf2-44fc008f604a.png)

## 筆者の環境
- ルーターはRTX830を使用
- WindowsPCからルーターのGUIにアクセスできる

# 前提知識

## IPアドレスとは
IPアドレスは通信の送信元と宛先を表現するための住所みたいなもので、「192.168.10.1」みたいに、数値が4つのドットで区切られています。IPアドレスは、以下の二種類に分けることができます。

**グローバルIPアドレス**
- ネットワーク上で通信するための一意なIPアドレス
- ネットワーク外に出るために必要

**プライベートIPアドレス**
- ネットワーク内で通信するためのIPアドレス
- ネットワーク内の端末を識別するために必要

例えば、家の中のネットワークを図にするとこうなります。ISPと繋がっているルーターがグローバルIPアドレス(GA)をもち、ルーターを経由して通信する端末はプライベートIPアドレス(PA)をもっています。

![ルーターがグローバルIPアドレス(GA)をもち、自宅のPC/スマホ/PS4がプライベートIPアドレス(PA)をもつ図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2922519/60be78c2-b576-5456-62d7-330084a402f0.png)


## DHCPとは

DHCPは、ネットワーク接続してきた端末に対して、**自動でプライベートIPアドレスを割り当てるための仕組み**です。例えば自宅のWiFiにスマホを接続したとき、DHCPによって自動でプライベートIPアドレスが割り当てられています。このときDHCPを利用していなければ、WiFiに繋ぐたびにスマホに適切なプライベートIPアドレスを設定する必要が生じてしまいます。(めんどう)

DHCPによってIPアドレスを割り当てる端末をDHCPサーバー、IPアドレスを割り当てられる端末をDHCPクライアントと呼びます。DHCPサーバーがDHCPクライアントに割り当てるIPアドレスはあらかじめ設定されています。具体的には、DHCPサーバーは「割り当て可能なIPアドレスリスト」をもっていて、そこから一つずつDHCPクライアントに配布していきます。

![DHCPサーバーであるルーターがIPアドレスプールから自宅のスマホにIPアドレスを割り当てている図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2922519/b3943f87-4dec-bfbe-cc71-b2b8da21a206.png)


この記事では、「割り当て可能なIPアドレスリスト」を「IPアドレスプール」と呼びます。

## MACアドレスとは

MACアドレスは、端末にはじめから割り当てられている番号で、端末を一意に識別するために用いられます。「AA:BB:CC:12:34:56」みたいに、48bitの値を8bitずつに分けて、16進数で表します。

MACアドレスは、端末が所属するネットワークに関わらず、基本的に値が変わることがありません。IPアドレスは接続するルーターが変わったり、時間をあけて再接続したりすると変わることがありますが、MACアドレスは利用者が変更しない限り、基本的にずっと同じ値をもちます。

# DHCPで固定IPと動的IPを共存させる方法
ここでは2種類のやり方を紹介します。

## a. IPアドレスプールに固定IPを含めない
IPアドレスプールは動的IPとして利用し、範囲外のIPアドレスプールを固定IPとして利用する方法です。先ほどの図では、例えば192.168.10.101以降が固定IPの範囲になります。そのため、例えば固定IPを割り振りたい端末に、192.168.10.101以降のIPアドレスを設定していくことになります。

![DHCPサーバーであるルーターがIPアドレスプールから自宅のスマホにIPアドレスを割り当てている図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2922519/9c69ad9a-9ea3-835e-aa20-869f67490990.png)


この方法は、新しく割り当てる固定IPが、まだどの端末にも割り当てられていない固定IPかどうかを調べてから割り当てる必要があります。「show status dhcp」コマンドではアドレスプール外の接続状況は表示されないため、別途コマンドを打って固定IPアドレスの利用状況を調べる必要があります。

## b. IPアドレスプールに固定IPを含める
IPアドレスプールに固定IPも動的IPも含めてしまうやり方です。具体的には、IPアドレスプールの中で一部のIPアドレスを予約して、動的IPとして利用できないようにします。予約には端末のMACアドレスを利用します。

![DHCPサーバーであるルーターが予約した固定IPアドレスを自宅のスマホにIPアドレスを割り当てている図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2922519/87807643-2b4f-f4c0-def3-e9063a955bac.png)

この記事では、bのIPアドレスプールに固定IPを含めるやり方を説明していきます。

# やり方
作業は以下の順序で進めていきます。
1. IPアドレスプールを決める
1. DHCPの規格を変更する(必要な場合のみ)
1. 固定IPをMACアドレスで予約する
1. 固定IPが割り当てられたか確認する

## 1. IPアドレスプールを決める
まずはIPアドレスプールを決めて、設定していきます。RTX830はGUIでIPアドレスプールを設定できるため、[サヌキテックネット 5.DHCPによるIPアドレス割り当ての変更](https://sanuki-tech.net/and-more/2021/0608-03/)をに沿って進めていきます。

この作業完了時点ではIPアドレスプール全体を動的IPとして利用することになっているため、RTXのGUIの管理＞コマンド実行から以下のコマンドを入力すると、接続している端末がIPアドレスプールから昇順で割り当てられていることを確認できます。

~~~
# IPアドレスの割り当て状況を確認する

show status dhcp
~~~
リファレンスは[57.25 DHCP サーバーの状態の表示](http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/showstatus/show_status_dhcp.html)

## 2. DHCPの規格を変更する
以下の設定を進めるために、DHCPの規格をRFC2131にしておきます。RFC2131はRFC1541で現在広く利用されている規格で、DHCPINFORMというメッセージに対応しています。DHCPINFORMは、DHCP以外でIPアドレスを設定した端末に対し、IPアドレスプールやリース期間以外のローカルな情報を送信するために利用されるみたいです。

デフォルトではRFC2131に準拠しているようですが、DHCPの規格を変更してしまっていたら、戻しておきましょう。(変更していなければ、この作業は必要ないです)

~~~
# DHCPの規格をRFC2131に変更する(必要な場合のみ)

dhcp server rfc2131 compliant on
~~~
リファレンスは[12.1.2 RFC2131 対応動作の設定](http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/dhcp/dhcp_server_rfc2131_compliant.html)

## 3. 固定IPをMACアドレスで予約する

前の作業で決めたIPアドレスプールから、固定IPをMACアドレスで予約していきます。RTXのGUIの管理＞コマンド実行から以下のコマンドを入力します。

~~~
# MACアドレスでIPアドレスを予約する
# dhcp scope bind 1 {IPアドレス} ethernet {MACアドレス}

dhcp scope bind 1 192.168.100.98 ethernet AA:BB:CC:12:34:56
~~~

リファレンスは[12.1.5 DHCP 予約アドレスの設定](http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/dhcp/dhcp_scope_bind.html)

コマンド中のethernetは不要な場合もあります。どうやらDHCPクライアントの識別子(chaddr)として、MACアドレスのほかにClient-Identifierというものがあるようです。そしてClient-Identifierを送信してくるDHCPクライアントについては、ethernetを付記しない場合はMACアドレスを識別子としないようです。

DHCPクライアントがClient-Identifierを送信してきているかは、show dhcp statusコマンドを叩いて確認できます。端末のMACアドレスの前に( 01 )みたいなのが書いてあれば、Client-Identifierを送信してきているため、ethernetを付記する必要があります。(とりあえずethernetを付けておくのが手っ取り早い気がします)

## 固定IPが割り当てられたか確認する
固定IPの予約作業が終わったら、固定IPを利用する端末をネットワークに接続します。既に接続していた場合は、一度ネットワークから切断して、再接続してください。
以下のコマンドで、割り当てた固定IPが端末に割り当てられていれば、成功です。

~~~
# 4. IPアドレスの割り当て状況を確認する

show status dhcp
~~~
リファレンスは[57.25 DHCP サーバーの状態の表示](http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/showstatus/show_status_dhcp.html)

ちなみに固定IPとして予約されたIPアドレスは、割り当てられていなくても上記コマンドを打つと、「(予約)192.168.10.99」みたいに確認することができます。一つのコマンドで動的IPと固定IPの利用状況を確認できるのは便利だなーと思いました。