dnsmasqの使い方と設定方法|Linuxで軽量なローカルDNS・DHCPサーバーを構築する手順

環境&ワークフロー

Linux環境で開発を行う際、「ローカル環境のドメイン名を指定してアクセスしたい」「開発用サーバーの名前解決を簡単に行いたい」と思ったことはありませんか?本格的なDNSサーバーであるBIND(Named)は多機能ですが、設定が複雑でリソース消費も大きいため、ローカル開発環境や小規模LANにはややオーバースペックです。

そこで役立つのが、軽量で簡単に扱えるdnsmasqです。dnsmasqを使用すると、わずかな設定ファイル編集だけでローカルDNSサーバーやDHCPサーバーを立ち上げることができ、DNS問い合わせのキャッシュ機能によってネットワークアクセスを高速化することも可能です。

本記事では、dnsmasqの基本概念からインストール手順、/etc/dnsmasq.confの主要な設定例、/etc/hostsと連携した名前解決、Ubuntu等で多発するsystemd-resolvedとのポート53競合の解消方法まで、分かりやすく解説します。

dnsmasqとは?概要と主な利用シーン

dnsmasq(ディーエヌエス・マスク)は、小規模なネットワークやローカル開発環境向けに設計された、非常に軽量なDNSフォワーダー兼DHCPサーバーです。

dnsmasqの主な機能

  • DNSフォワーダー&キャッシュ: クライアントからのDNS問い合わせを上位DNS(Google Public DNSやルーターなど)へ転送し、結果をローカルメモリにキャッシュして次回以降の応答を高速化します。
  • ローカルDNSサーバー(/etc/hosts連携): サーバー上の/etc/hostsファイルを自動的に読み込み、そこに記述されたIPアドレスとホスト名をDNSレコードとして配信します。
  • DHCPサーバー機能: LAN内のデバイスへ動的にIPアドレスを割り当てる機能を提供します(必要に応じて無効化も可能)。
  • TFTP / PXEブート対応: ネットワーク経由でOSを起動・インストールするためのTFTPサーバー機能も内蔵しています。

どんな場面で使われるか?

  • ローカル開発環境の名前解決: test-server.local のような独自ドメインを開発PCやローカルサーバー全体で共有したい場合。
  • ホームネットワーク / 小規模オフィス(SOHO): 家庭用ルーターやDockerコンテナ、Raspberry Piなどで手軽にDNS/DHCPを提供したい場合。
  • 名前解決のキャッシュによる高速化: ルーターやゲートウェイサーバーでDNSクエリをキャッシュさせ、外部トラフィックを削減したい場合。

dnsmasqのインストール手順

主要なLinuxディストリビューションでは、標準パッケージマネージャーから簡単にインストールできます。

Ubuntu / Debian系の場合

sudo apt update
sudo apt install -y dnsmasq

CentOS / RHEL / AlmaLinux / Rocky Linux系の場合

sudo dnf install -y dnsmasq

サービスの起動と自動起動設定

インストールが完了したら、systemctlコマンドでサービスを開始し、OS起動時の自動有効化を行っておきます。

sudo systemctl enable --now dnsmasq

状態の確認は以下のコマンドで行います。

sudo systemctl status dnsmasq

/etc/dnsmasq.conf の基本設定

dnsmasqの設定は、主に /etc/dnsmasq.conf ファイルで行います。設定を変更する前に、オリジナルファイルのバックアップを取っておくことをおすすめします。

sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.org

おすすめの基本設定例

DNSサーバーおよびローカル名前解決用に使う場合の標準的な設定例です。エディタで /etc/dnsmasq.conf を開き、以下のように追記またはコメント解除を行います。

# 53番ポートでListen(デフォルト)
port=53

# リッスンするネットワークインターフェースやIPアドレスを指定
listen-address=127.0.0.1,192.168.1.10

# ドメイン名を含まない(ドットを含まない)検索を上位DNSに転送しない
domain-needed

# プライベートIPアドレス(192.168.x.xなど)の逆引き問い合わせを上位DNSに転送しない
bogus-priv

# 自身の /etc/hosts を読み込んで名前解決に使用する
expand-hosts

# ローカルネットワークで使用するドメイン名を指定
domain=home.local

# 上位DNSサーバーを明示的に指定(Google Public DNS等)
server=8.8.8.8
server=1.1.1.1

# 自マシン・ローカルネットワークからの要求のみに応答(セキュリティ向上)
local-service

主要パラメータの解説

設定項目 説明
port DNSサービスが利用するポート番号。DHCP機能のみ使いDNSを無効化する場合は port=0 とします。
listen-address dnsmasqがバインドして要求を受け付けるIPアドレス。複数指定可能です。
domain-needed ping server のようにドメイン名無しのホスト名検索を外部DNSへ無駄に転送するのを防ぎます。
bogus-priv プライベートIPの逆引き失敗要求を外部へ漏洩させないためのセキュリティ設定です。
expand-hosts /etc/hostsweb01 とだけ書かれている場合でも、domain 設定と組み合わせて web01.home.local としても検索可能にします。
server ローカルで解決できなかった問い合わせを転送する上位DNSサーバーのIPアドレスです。

実践例1:/etc/hostsと連動したローカルドメイン名前解決

dnsmasqの大きな魅力の一つは、サーバー上の /etc/hosts を書き換えるだけでDNSレコードを追加できる点です。ゾーンファイルの複雑な文法を覚える必要はありません。

1. /etc/hosts への追記

例えば、192.168.1.100dev-app.local というドメイン名を割り当てたい場合、/etc/hosts に以下のように記述します。

127.0.0.1   localhost
192.168.1.100 dev-app.local web.local

2. 設定の構文チェック

dnsmasqには、設定ファイルの記述エラーをチェックする便利機能が用意されています。

dnsmasq --test

dnsmasq: syntax check OK. と表示されれば文法エラーはありません。

3. 設定の反映と動作確認

設定や /etc/hosts を変更した後は、サービスを再起動またはSIGHUPシグナルを送信して反映させます。

sudo systemctl restart dnsmasq

続いて、dig コマンドを使って localhost(127.0.0.1)経由で正しく名前解決できるかテストします。

dig @127.0.0.1 dev-app.local +short

実行結果例:

192.168.1.100

指定したIPアドレスが返ってくれば、ローカルDNSとして正常に動作しています。

実践例2:簡易DHCPサーバーの設定手順

dnsmasqをLAN内のDHCPサーバーとして動作させたい場合は、/etc/dnsmasq.confdhcp-range 設定を追加します。

1. IPアドレス範囲の指定

# IPアドレス貸出範囲(192.168.1.50 〜 192.168.1.150)、リース時間12時間
dhcp-range=192.168.1.50,192.168.1.150,255.255.255.0,12h

# デフォルトゲートウェイの通知
dhcp-option=option:router,192.168.1.1

# クライアントへ通知するDNSサーバー(自身のIP)
dhcp-option=option:dns-server,192.168.1.10

2. 特定の機器へ固定IPアドレスを割り当てる場合

MACアドレスを指定して、特定のデバイスへ常に同じIPを割り当てる(静的DHCP)ことも可能です。

dhcp-host=aa:bb:cc:dd:ee:ff,192.168.1.200,nas-server

動作確認とトラブルシューティング

【超重要】systemd-resolvedとのポート53競合の解消

Ubuntu 18.04以降やDebianなどでは、デフォルトで systemd-resolved が53番ポート(127.0.0.53:53)を占有して動作しているため、dnsmasqの起動時に以下のようなエラーが発生することがあります。

dnsmasq: failed to create listening socket for port 53: Address already in use

対処法:systemd-resolved の Stub Listener を無効化する

  1. /etc/systemd/resolved.conf をエディタで開きます。
  2. 以下のように DNSStubListener=no を設定します。
    sudo sed -i 's/#DNSStubListener=yes/DNSStubListener=no/' /etc/systemd/resolved.conf
  3. /etc/resolv.conf のシンボリックリンクを再作成し、直で 127.0.0.1 または上位DNSに向けるか、systemd-resolved を再起動します。
    sudo systemctl restart systemd-resolved
    sudo systemctl restart dnsmasq

または、dnsmasq側で bind-interfaces と特定の外部IPインターフェースだけを指定し、127.0.0.53 と衝突させない方法も有効です。

DNSキャッシュのクリア

/etc/hosts の内容を書き換えたのに古いIPアドレスが解決されてしまう場合は、SIGHUPシグナルを送信してキャッシュをクリアします。

sudo killall -HUP dnsmasq
# または
sudo systemctl reload dnsmasq

クエリログの有効化でトラブル調査

問い合わせが正常に行われているか確認したい場合は、一時的にログ出力オプションを有効にします。

log-queries
log-facility=/var/log/dnsmasq.log

設定後再起動すると、/var/log/dnsmasq.log に受信したクエリと応答結果がリアルタイムに出力されます。

FAQ(よくある質問)

Q1. dnsmasqとBINDの違いは何ですか?

BINDは大規模な権威DNSサーバーや複雑なゾーン管理、DNSSECなどの高度な仕様に対応した本格派DNSサーバーです。一方、dnsmasqはメモリ消費が数MB程度と非常に軽量で、/etc/hosts ファイルをそのままDNSレコードとして利用できる簡易的なフォワーダー/ローカルDNSです。個人開発環境や小規模LANにはdnsmasqが適しています。

Q2. Docker環境でdnsmasqを使うメリットはありますか?

コンテナ間で独自のローカルドメイン名を解決させたり、開発環境ごとのDNSキャッシュとして動作させることで、外部クエリのオーバーヘッドを削減しビルドやテストの処理速度を向上できます。

まとめ

dnsmasqは、Linux環境で手軽にローカルDNSサーバーやDNSキャッシュ、DHCPサーバーを構築できる非常に強力かつ軽量なツールです。

  • 設定は /etc/dnsmasq.conf に集約されており直感的。
  • /etc/hosts を追記するだけで独自ドメインの名前解決が可能。
  • Ubuntu等の systemd-resolved とのポート競合には注意が必要。

開発環境のIPアドレス固定やドメイン割り当てで困っている方は、ぜひdnsmasqを導入してみてください。

関連記事

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント