🦁

ローカルDNSをたてる

2024/05/19に公開

はじめに

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 を使用しているプロセスを確認します。

terminal
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 を使用している場合、以下のコマンドで停止できる。

terminal
sudo systemctl stop systemd-resolved

その後、/etc/systemd/resolved.conf ファイルを編集し、DNSStubListener を無効にする。

terminal
sudo vi /etc/systemd/resolved.conf

以下の行を変更または追加する。

DNSStubListener=no

設定を保存してファイルを閉じた後、以下のコマンドを実行してリゾルバー設定を更新します。

terminal
sudo systemctl restart systemd-resolved

dnsmasqの導入

dnsmasq のインストール

まず、Ubuntu Server 22.04に dnsmasq をインストールする。

terminal
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アドレスを反映する。

terminal
sudo vi /etc/dnsmasq.d/addresses.conf
address=/wiki.local/10.255.0.1
address=/web.local/10.255.1.1

dnsmasq の再起動

設定が完了したら、dnsmasq を再起動して設定を反映させます。

termnal
sudo systemctl restart dnsmasq

動作確認

DNSサーバ上の確認

nslookup または dig コマンドを使用して、名前解決が正しく動作しているか確認します。

terminal
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をインストールする。

terminal
sudo apt -y install resolvconf

起動および有効化を行う。

terminal
sudo systemctl start resolvconf.service
sudo systemctl enable resolvconf.service

/etc/resolvconf/resolv.conf.d/headの編集に、永続化したいDNSの設定を行う。

terminal
sudo vi /etc/resolvconf/resolv.conf.d/head

今回のケースは以下を追加する。

# 今回のケースのDNSサーバのIPアドレスが10.255.255.2ゆえ
# 10.255.255.2を設定する
nameserver 10.255.255.2

いったんサーバを再起動させる。

terminal
sudo reboot

※resolvconfの再起動では、名前解決には至らなかったため、サーバ自体を再起動した。

terminal
sudo systemctl restart resolvconf.service
sudo systemctl restart systemd-resolved.service
GitHubで編集を提案

Discussion