stylesheet

2022-03-30

NTTのひかり電話ルータRP-400KIとunboundでローカルドメイン運用

ネットワーク内で"ctu.uchino"等、ローカルドメインでアクセスできるようにする。

mDNSも良いけど非対応のデバイスもいろいろとあるのでサーバーマシンを用意できるならDNSを建てるのが安定する。 ルーター側の設定で済むのでクライアント側は特になにも設定する必要がないのがメリット。

アクター

PR-400KI
NTTの第四世代光電話ルーター。2012年2月製造なのでもう10年選手。故障しないのでいつまでたっても旧型。
OrangePi Win
ラズパイの類似製品。Ubuntu FocalベースのArmbianでサーバーとして動作中。略しておっぱい。絶版。
unbound
BIND以降のDNSキャッシュサーバー。簡易的なコンテンツサーバ機能もある。

手順としては、OrangePiへunboundをインストールし、PR-400KIの「ローカルドメイン問合せテーブル」へ追加する。 多少イレギュラーな部分もあったので、以下に細かく記載した。

dnsサーバーの構築

unboundをインストール。

$ sudo apt install unboud

起動に失敗するので53番ポートを使用している犯人を探す。

$ sudo ss -lntp | grep 53

systemd-resolvedが動作しているようなので停止する。

$ sudo systemctl stop systemd-resolved
$ sudo systemctl disable systemd-resolved

unbound.confを編集してlocal-dataをいくつか追加する。

$ sudo jed /etc/unbound/unbound.conf.d/unbound.conf

server:
  interface: 0.0.0.0
  access-control: 127.0.0.0/23 allow
  access-control: 192.168.1.0/23 allow
  
  local-data: "ctu.uchino. IN A 192.168.1.1"
  local-data: "wifi.uchino. IN A 192.168.1.20"
  local-data: "orange.uchino. IN A 192.168.1.8"
  local-data: "office.uchino. IN A 192.168.1.9"
  local-data: "bedroom.uchino. IN A 192.168.1.10"
  local-data: "livingroom.uchino. IN A 192.168.1.11"
  
  ...

起動する。

$ sudo systemctl start unbound
$ sudo systemctl enable unbound

動作確認。

$ dig @127.0.0.1 ctu.uchino

ルーターの設定

続いて、ルーター(PR-400KI)側へDNSサーバーを登録する。
登録は、詳細設定>DNS設定、ローカルドメイン問合せテーブルへ行を追加。

ドメイン名は、先頭にワイルドカード(*)が使える。
サーバーアドレスはIPv4アドレスは弾かれるが、 IPv4射影アドレス(IPv4-mapped IPv6 address)へ変換してやると登録できた。

IPv4射影アドレスの作り方

IPv6アドレスの全128ビットのうち上位80ビットを0埋め、続く16ビットを1埋め、残る下位32ビットへIPv4アドレスを埋め込む。 "192.168.1.8"を例にとると、ドット区切りごとで16進数に変換すると"C0A8:0108"となる。上位96ビットは固定で"::ffff"。 結合した、"::ffff:C0A8:0108"がIPv4射影アドレスとなる。

Javascriptで関数化すると以下の通り。

function ipv4_to_ipv6(ip) {
    const a = ip.split('.').map(x => parseInt(x, 10).toString(16).padStart(2, '0'))
    return `::ffff:${a[0]}${a[1]}:${a[2]}${a[3]}`
}

以下は、"*.uchino"ドメインを192.168.1.8で名前解決する例。

ドメイン名: *.uchino
プライマリDNSサーバアドレス: ::FFFF:C0A8:108
セカンダリDNSサーバアドレス: 

最後にクライアント側からアクセスできるか確認して終了。
ブラウザでアクセスしてみるのが手っ取り早い。