YAMAHA NVR510によるDHCP設定（固定アドレス配布、自動プロキシ設定）

## 1. はじめに
これまでDHCPはMac mini ServerにインストールしたmacOS Serverの機能を用いて実現してきましたが、macOS Serverのオープンソースサービス採用終了(macOS Mojaveより)に伴い、代替策を検討する必要が出てきました。
（本来はもっと早くに対応すべき内容ですが、新型Mac miniの登場待ち、また購入までに時間を要したため、現在に至ります。）

元々はDNSサーバとの連携を図るため、新しいMac miniにて実現する予定でしたが、自宅のネットワーク環境があまりよろしくないことから、関東に引っ越した当初から使用しているYAMAHA NVR510を用いて実現していきます。

## 2. 目次

```
1. はじめに
2. 目次
3. 実現したい内容
4. NVR510のコマンド
5. 確認
6. さいごに
7. 参考サイト
```

## 3. 実現したい内容
私が実現したいネットワーク環境の内容は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132084/980ba87c-4cad-d1d8-ce34-b22cf531b725.png)

我が家にはNVR510が贅沢にも２台あります。マンション備え付けのProviderBに加え、フェムトセルを実現するためにProviderAとも契約をしたのですが、それぞれにRouterを設けて、簡単に切り替えられるようにしました。（まだフェイルオーバまでは実現しておりません。それは今後の課題ですね。）

今回はRouterBにDHCP Serverを機能させ、各デバイスに固定IPアドレスを割り当てます。デバイスの登録はMACアドレスで行います。

行いたい配布内容は以下の通りです。

* 固定IPアドレス
* デフォルトゲートウェイ
* DNSサーバアドレス
* 自動プロキシ
* 登録外デバイスは任意アドレス


## 4. NVR510のコマンド

タイトルがいきなりコマンドとなっております。
そうです。GUIではこれを全て実現することができないのです。
GUIで実現できないのは以下の設定です。

* 固定IPアドレス
* 自動プロキシ

これまでMac mini ServerでDHCPサーバを実現していたのも、家庭用ルータの場合に特に自動プロキシを配布することができなかったためです。

しかし、NVR510は実現可能です。
DHCPで配布できるオプションは全てカバーできるため、ISCのdhcpdに近い機能を実現することが可能なのです。（冗長化は不明）

では、まずは今回設定したコマンドを下に示します。

```:config
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope lease type 1 bind-priority
dhcp scope 1 192.0.1.2-192.0.1.99/24 gateway 192.0.1.254
dhcp scope bind 1 192.0.1.2 ethernet xx:xx:xx:xx:xx:xx
dhcp scope bind 1 192.0.1.3 ethernet xx:xx:xx:xx:xx:xx
dhcp scope bind 1 192.0.1.4 ethernet xx:xx:xx:xx:xx:xx
dhcp scope bind 1 192.0.1.5 ethernet xx:xx:xx:xx:xx:xx
dhcp scope bind 1 192.0.1.6 ethernet xx:xx:xx:xx:xx:xx
・
・
・

dhcp scope option 1 dns=192.0.1.2,192.0.1.254,8.8.8.8 252=68,74,74,70,3a,2f,2f,31,39,32,2e,30,2e,31,2e,34,3a,38,30,38,30,2f,77,70,61,64,2e,64,61,74
dns domain tobylabs.dip.jp

```

では、解説をしていきます。

```:DHCPサーバのON
dhcp service server
dhcp server rfc2131 compliant except remain-silent
```

DHCPサーバの実装、そして動作開始を意味します。
また、２行目はremain-silent以外をRFC2131対応となるように設定しています。

remain-silentは、クライアントからDHCPREQUESTを受信した場合に、そのクライアントのリース情報を持っていない場合はDHCPNAKを送らないようにします。


```:DHCPサーバSCOPEの設定
dhcp scope lease type 1 bind-priority
dhcp scope 1 192.0.1.2-192.0.1.99/24 gateway 192.0.1.254
```

SCOPEの設定です。
scope番号1を定義し、bind-priorityにしています。予約デバイス以外のデバイスがきた時にでもアドレスを配布できるようにします。

2行目では配布時の予約アドレスを定義しています。
また、default gatewayを192.0.1.254（RouterA）にしています。通常はProviderAを使用するように設定するためです。

```:固定アドレスの設定
dhcp scope bind 1 192.0.1.2 ethernet xx:xx:xx:xx:xx:xx
dhcp scope bind 1 192.0.1.3 ethernet xx:xx:xx:xx:xx:xx
dhcp scope bind 1 192.0.1.4 ethernet xx:xx:xx:xx:xx:xx
dhcp scope bind 1 192.0.1.5 ethernet xx:xx:xx:xx:xx:xx
dhcp scope bind 1 192.0.1.6 ethernet xx:xx:xx:xx:xx:xx
・
・
・
```

固定アドレスは、上で定義したSCOPE番号１に付与していきます。定義したアドレスにMACアドレスを紐づけています。ここでは隠していますが、ethernetの後ろの`xx:xx:xx:xx:xx:xx`に対象デバイスのMACアドレスを定義します。

```:SCOPEオプションの設定
dhcp scope option 1 dns=192.0.1.2,192.0.1.254,8.8.8.8 252=68,74,74,70,3a,2f,2f,31,39,32,2e,30,2e,31,2e,34,3a,38,30,38,30,2f,77,70,61,64,2e,64,61,74
```

ここが今回設定するミソの一つです。

まず、dns=192.0.1.2,192.0.1.254,8.8.8.8の部分は、配布するDNSサーバのアドレスを指定します。
ここを明示的に指定しない場合、`dns server <Server Address>`が配布されます。

次に、その後ろの`252=`以下が自動プロキシ設定の配布です。
実際には設定をここに記述しているのではなく、wpad.datファイルを指定しています。

今回指定したURLは以下の通りです。

```:proxy.pac（wpad.dat）の指定
http://192.0.1.4:8081/wpad.dat
```

`252=`以下の数字の羅列は、上記URLをASCIIコードに変換したものになります。

変換する際に使用したURLサイトは以下になります。

[ASCIIコード変換機](http://web-apps.nbookmark.com/ascii-converter/)

また、ここでもう一つ重要な話があります。
複数オプションを設定する際は、コマンドをその都度入力するのではなく、一度に併記して入力する必要があります。

今回は、オプション番号6(DNS)と252(WPAD)を併記して入力しいました。
（このことを書いているサイトはあまりありませんでした。）

```:DNS Domainの設定
dns domain tobylabs.dip.jp
```

DNSの検索スコープを設定しています。
ここで設定した内容がそのまま配布されます。

以上で設定は終わりです。


## 5. 確認

Server 1のDHCPサーバをOFFにし、NVR５１０のDHCPサーバをONにした状態でIPアドレスが配布されることも確認しました。

WireSharkでTCP dumpしましたが、問題なく設定した全ての情報が配布されているようです。

```
http://192.0.1.4:8080/wpad.dat
```

には、以下のスクリプトが置かれています。

```javascript:http://192.0.1.4:8080/wpad.dat
function FindProxyForURL(url, host) {
  if(
    isPlainHostName(host) || isInNet(host,"192.0.0.0", "255.255.0.0")
  ) return "DIRECT";
  else if(
    isPlainHostName(host) || isInNet(host,"192.168.0.0", "255.255.0.0")
  ) return "DIRECT";
  else return "PROXY 192.0.1.4:8081; DIRECT";
}
```

ローカルネットワークへのアクセスは直接、それ以外はServer 2(192.0.1.4)のポート番号8081にアクセスするように指定しています。
これがServer 2で動作するSquidサーバになります。

プロキシサーバも自動で認識し、アクセスできることを確認しました。


## 6. さいごに

今回、RouterBにのみ設定しましたが、本当はどちらのRouterが落ちてもDHCPは動作するように冗長化を図りたいのです。
それは今後の課題としたいと思います。

## 7. 参考サイト

* [NVR510 設定例](https://network.yamaha.com/products/routers/nvr510/setting)
* [コマンドリファレンス](http://www.rtpro.yamaha.co.jp/RT/manual/nvr700w_nvr510/index.html)
* [FAQ for YAMAHA RT Series / TCP/IP](http://www.rtpro.yamaha.co.jp/RT/FAQ/TCPIP/dhcp-server.html)
* [DHCPとDNSだけRTX1100に任せたい - kam1nchu’s blog](http://kam1nchu.hateblo.jp/entry/2017/12/13/225903)
* [RT810 の DHCP サーバを WPAD に対応させる](https://blog.cles.jp/item/7330)
* [ASCIIコード変換機](http://web-apps.nbookmark.com/ascii-converter/)