ローカルDNSをたてる
はじめに
Dnsmasqを用いて、家庭内で使用するローカルDNSを構築するための手順を示す。
想定の環境
- 家庭用ルータが10.0.0.1/8にある。
- ここがデフォルトゲートウェイかつDNSの役割として担っている。
- DHCPによるIP配布はここからのみ行う。
- WikiサーバとWebサーバがあり、ここにそれぞれ名前経由でアクセスできるようにしたい。
- DNSサーバはローカルの名前解決のみを行い、それ以外は家庭用ルータによる名前解決を行う。
IPアドレスとドメイン名の対応は以下の通りとする。
サーバ名 | IPアドレス | ドメイン名 |
---|---|---|
Wikiサーバ | 10.255.0.1/8 | wiki.local |
Webサーバ | 10.255.1.1/8 | web.local |
基本的な方針
- Ubuntu Server 22.04にDnsmasqを導入する。
- DNS機能のみ用いて、DHCP機能は使用しない。
- 名前解決対象のホストは、個別のファイルにリストとして記載する。
- サーバの冗長構成は取らない。
- 個別のテーマとして扱うかも。
Dnsmasq の基本的な動作
dnsmasqはdebパッケージを導入すれば使える。
/etc/dnsmasq.conf
にすべての設定を記述するが、外部ファイルの読み込みに対応している。
これを利用して、DNSによる名前解決の対象としたいIPアドレスと名前の対応は別ファイルに書き出すものとし、その別ファイルをここでは /etc/dnsmasq.d/addresses.conf
とする。
名前解決させたいホストに変更が生じるたび、/etc/dnsmasq.d/addresses.conf
の設定を変更し、dnsmasqの再起動を行う。
そうすることで、最新の対応を得ることができる。
サーバ構築手順
事前準備
ポート 53 を使用しているプロセスの確認
以下のコマンドを実行して、ポート 53 を使用しているプロセスを確認します。
sudo lsof -i :53
このコマンドの出力には、ポート 53 を使用しているプロセスのリストが表示される。
通常、他の DNS サーバ(systemd-resolved や bind など)がこのポートを使用している可能性がある。
プリインストール後はsystemd-resolvedが稼働している可能性が高い。
今回は以下の通り出力された。
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd-r 617 systemd-resolve 13u IPv4 19996 0t0 UDP localhost:domain
systemd-r 617 systemd-resolve 14u IPv4 19997 0t0 TCP localhost:domain (LISTEN)
systemd-resolved の停止
もし systemd-resolved がポート 53 を使用している場合、以下のコマンドで停止できる。
sudo systemctl stop systemd-resolved
その後、/etc/systemd/resolved.conf ファイルを編集し、DNSStubListener を無効にする。
sudo vi /etc/systemd/resolved.conf
以下の行を変更または追加する。
DNSStubListener=no
設定を保存してファイルを閉じた後、以下のコマンドを実行してリゾルバー設定を更新します。
sudo systemctl restart systemd-resolved
dnsmasqの導入
dnsmasq のインストール
まず、Ubuntu Server 22.04に dnsmasq をインストールする。
sudo apt update
sudo apt install -y dnsmasq
dnsmasq の設定
まずは以下のコマンドで、ゲートウェイになるインターフェースを確認する。
ip addr
ここで確認した結果、該当のインターフェースはens18
であった。
/etc/dnsmasq.conf
ファイルを編集する。
オリジナルのファイルを保存したうえで、新規ファイルを作成する形をとる。
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
sudo vi /etc/dnsmasq.conf
################################
# 共通設定
################################
# 特定のインターフェースにのみバインドする
bind-interfaces
# 使用するインターフェースを指定
interface=ens18
# DNSサーバのIPアドレス
listen-address=10.255.255.2
# Dnsmasqがlistenするポート
port=53
################################
# DNSサーバの設定
################################
# 上位DNSサーバの設定
server=10.0.0.1
# プライベートIPアドレスの逆引き設定
bogus-nxdomain=10.0.0.0/8
# dnsmasqでキャッシュするレコード数
# 0にするとキャッシュしない
cache-size=0
# 名前解決の設定(外部ファイルを読み込む)
conf-file=/etc/dnsmasq.d/addresses.conf
# サーバ上の/etc/hostsで名前解決をさせない
no-hosts
# ドメイン名のないクエリに自動的にドメインを付与する
expand-hosts
# 内部ドメインとしてlocalを使用
domain=local
# DNSクエリに対してのログを出力する
# log-querie
# ログの出力場所
# log-facility=/var/log/dnsmasq/dnsmasq.log
################################
# DHCPサーバの設定
################################
# DHCPを無効化するインターフェースを指定
no-dhcp-interface=ens18
アドレスファイルの更新
ここからは本記事の運用面のお話になる。
ホストの追加を行う場合は、このセクションにある通りの作業を行うこととなる。
/etc/dnsmasq.d/addresses.confへの反映
/etc/dnsmasq.d/addresses.conf
に名前とIPアドレスを反映する。
sudo vi /etc/dnsmasq.d/addresses.conf
address=/wiki.local/10.255.0.1
address=/web.local/10.255.1.1
dnsmasq の再起動
設定が完了したら、dnsmasq を再起動して設定を反映させます。
sudo systemctl restart dnsmasq
動作確認
DNSサーバ上の確認
nslookup または dig コマンドを使用して、名前解決が正しく動作しているか確認します。
nslookup wiki.local 10.255.255.2
nslookup web.local 10.255.255.2
これで、dnsmasq を使用して家庭内LANの設定が完了となり、名前解決とDHCP機能が正しく動作するはずである。
クライアント端末上の確認
まずはクライアント端末のDNSの設定として、DNSサーバ(10.255.255.2)を優先DNSとして設定していない場合は、その設定を行う。
そのうえで、webブラウザから、以下の通りアクセスできることを確認する。
(サーバの種類によって、httpsにしたり、ドメインを除いたパスも適切に指定する必要あり)
- wikiサーバの確認:
http://wiki.local
- webサーバの確認:
http://web.local
もしアクセスできない場合は、nslookupコマンドを実行し、状況を確認する。
> nslookup wiki.local 10.255.255.2
サーバー: UnKnown
Address: 10.255.255.2
名前: wiki.local
Address: 10.255.0.1
Ubuntuにおける永続的な DNS ネームサーバーの設定方法
/etc/resolv.conf は systemd-resolved サービスによって間接的に管理されており、ユーザーが手動で行った変更は永続的に保存できないことが生じる。
ここでは、
この記事では、resolvconf を用いて、永続的な DNS ネーム サーバーを設定する方法を解説する。
(随時)現時点でインターネットに出れない場合
aptが通らないため、/etc/resolv.conf
を以下の通り編集する。
nameserver 8.8.8.8
resolvconf
をインストールする。
sudo apt -y install resolvconf
起動および有効化を行う。
sudo systemctl start resolvconf.service
sudo systemctl enable resolvconf.service
/etc/resolvconf/resolv.conf.d/head
の編集に、永続化したいDNSの設定を行う。
sudo vi /etc/resolvconf/resolv.conf.d/head
今回のケースは以下を追加する。
# 今回のケースのDNSサーバのIPアドレスが10.255.255.2ゆえ
# 10.255.255.2を設定する
nameserver 10.255.255.2
いったんサーバを再起動させる。
sudo reboot
※resolvconfの再起動では、名前解決には至らなかったため、サーバ自体を再起動した。
sudo systemctl restart resolvconf.service
sudo systemctl restart systemd-resolved.service
Discussion