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/hosts に web01 とだけ書かれている場合でも、domain 設定と組み合わせて web01.home.local としても検索可能にします。 |
server |
ローカルで解決できなかった問い合わせを転送する上位DNSサーバーのIPアドレスです。 |
実践例1:/etc/hostsと連動したローカルドメイン名前解決
dnsmasqの大きな魅力の一つは、サーバー上の /etc/hosts を書き換えるだけでDNSレコードを追加できる点です。ゾーンファイルの複雑な文法を覚える必要はありません。
1. /etc/hosts への追記
例えば、192.168.1.100 に dev-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.conf に dhcp-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 を無効化する
/etc/systemd/resolved.confをエディタで開きます。- 以下のように
DNSStubListener=noを設定します。sudo sed -i 's/#DNSStubListener=yes/DNSStubListener=no/' /etc/systemd/resolved.conf /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を導入してみてください。

コメント