「設定 - DNSMasq」の版間の差分

提供: MochiuWiki : SUSE, EC, PCB

編集の要約なし
 
1行目: 1行目:
== 概要 ==
== 概要 ==
DNSサーバ(DNSMasq)は、suse.comというドメイン名からIPアドレスを返したり、IPアドレスからドメイン名を返すサーバである。<br>
DNSMasqは、DNSフォワーダ、DHCPサーバ、TFTPサーバ、ルータ広告 (RA) サーバを1つに統合した軽量なネットワークサービスである。<br>
<br>
<br>
内部向けDNSサーバは、LANにあるサーバまたはクライアントPCにアクセスする時、IPアドレスではなくsuse.com等のドメイン名を入力してアクセスできるようにするDNSサーバである。<br>
Simon Kelleyによって開発され、GPL v2 / v3以降のライセンスで提供されている。<br>
Linux、BSD、Mac OSで動作し、IPv4 と IPv6 の両方に対応する。<br>
<br>
小規模ネットワークやホームネットワーク、組込み機向けの軽量ツールとして広く利用されており、BIND等のフル機能DNSサーバと比較して設定が簡素でメモリ消費が少ないのが特徴である。<br>
<br>
主なユースケースを以下に示す。<br>
<br>
* 内部向けDNSサーバ (LAN内のホスト名解決)
* DNSキャッシュサーバ (上流DNS応答のキャッシュによる応答速度向上)
* DHCPサーバ (DHCPv4/DHCPv6/BOOTPによるIPアドレス配布)
* PXEネットブート (TFTPサーバとの組合せによるネットワーク起動)
* IPv6 RAサーバ (ステートレスアドレス自動設定の広告)
<br><br>
 
== 前提条件 ==
DNSMasqを導入する環境の前提条件を以下に示す。<br>
<br>
* RHEL
** ネットワーク管理
**: NetworkManager
** パッケージ
**: <u>dnsmasq</u>
**: <u>dnsmasq-utils</u> (任意)
* SUSE
** ネットワーク管理
**: NetworkManager または wicked
** パッケージ
**: <u>dnsmasq</u>
* Raspberry Pi OS
** 静的IPアドレスの事前設定 (DHCPサーバとして運用する場合)
** パッケージ
**: <u>dnsmasq</u>
*: dhcpcd5 または NetworkManagerとの競合に注意すること。
<br>
<u>※注意</u><br>
<u>DNSサーバとして稼働させるホストには固定IPアドレスを設定すること。</u><br>
<br><br>
<br><br>


== DNSMasqのインストール ==
== DNSMasqのインストール ==
DNSサーバを構築するため、DNSMasqをインストールする。<br>
==== RHEL ====
  sudo apt install dnsmasq dnsmasq-base libnetfilter-conntrack3 libnfnetlink0
<u>dnsmasq-utils</u> は、<u>dhcp_release</u> 等の補助ツールを含む任意パッケージである。<br>
<br>
sudo dnf install dnsmasq dnsmasq-utils
<br>
留意点を以下に示す。<br>
<br>
NetworkManagerは、 <code>dns=dnsmasq</code> 設定で独自のDNSMasqインスタンスを起動する。<br>
スタンドアロンでDNSMasqを運用する場合は、<u>/etc/NetworkManager/NetworkManager.conf</u> ファイルの <code>dns=default</code> 等に変更して無効化することが推奨される。<br>
<br>
RHELでは、systemd-resolvedが有効化されている場合がある。<br>
その場合は、[[#systemd-resolvedとの競合回避|systemd-resolvedとの競合回避]]セクションを参照すること。<br>
<br>
==== SUSE ====
<u>NetworkManager-dns-dnsmasq</u> パッケージは、NetworkManager連携用の任意パッケージである。<br>
<br>
sudo zypper install dnsmasq NetworkManager-dns-dnsmasq
<br>
networkリポジトリから最新版を導入する場合は、以下に示す手順を実行する。<br>
<br>
sudo zypper addrepo https://download.opensuse.org/repositories/network/$releasever/network.repo Network
sudo zypper refresh
sudo zypper install dnsmasq
<br>
==== Raspberry Pi OS ====
  sudo apt install dnsmasq
<br>
インストール直後にサービスがmasked状態になっている場合は、以下に示すコマンドで有効化する。<br>
<br>
sudo systemctl unmask dnsmasq.service
sudo systemctl enable dnsmasq.service
<br>
<u>※注意</u><br>
<u>Buster以前のRaspberry Pi OSでは、dhcpcd5がDHCPクライアントとして動作するため、DNSMasqと競合する場合がある。</u><br>
<u>Bookworm以降は、NetworkManagerに移行しており、dhcpcd5との競合は軽減されている。</u><br>
<br>
<u>DHCPサーバとして運用する場合は、事前に固定IPアドレスを設定しておくこと。</u><br>
<br><br>
 
== DNSMasqの主な機能 ==
下表に、DNSMasqが提供する主な機能を示す。<br>
<br>
<center>
{| class="wikitable"
|+ DNSMasqの主な機能
! 機能 !! 説明
|-
| DNSフォワーダ || 上流DNSサーバにクエリを転送して、応答をキャッシュする。
|-
| DHCPサーバ || DHCPv4 / DHCPv6 / BOOTPに対応<br>静的・動的リース両対応
|-
| TFTPサーバ || PXEネットブート用の読み取り専用TFTPサーバを提供。
|-
| ルータ広告 (RA) || IPv6のRAサーバ機能を提供
|-
| DNSキャッシュ || 上流応答をキャッシュして応答速度を向上
|}
</center>
<br>
これらの機能は1つのプロセスで統合的に提供されるため、複数のサービスを個別に導入・設定する必要がない。<br>
<br><br>
<br><br>


== DNSMasqの設定 ==
== DNSMasqの設定 ==
内部向けDNSサーバを設定する。<br>
==== 設定ファイルの構成 ====
sudo vi /etc/dnsmasq.conf
DNSMasqの設定ファイルの構成を以下に示す。<br>
<br>
* メイン設定ファイル
*: <u>/etc/dnsmasq.conf</u>
* ドロップイン設定ディレクトリ
*: <u>/etc/dnsmasq.d/</u>
*: このディレクトリ内の <u>.conf</u> ファイルは自動的に読み込まれる。
* ホスト名登録ファイル
*: <u>/etc/hosts</u> (デフォルト) または <code>--addn-hosts</code> オプションで指定したファイル
* 上流DNS参照ファイル
*: <u>/etc/resolv.conf</u> (デフォルト) または <code>--resolv-file</code> オプションで指定したファイル
* リースファイル
*: <u>/var/lib/dnsmasq/dnsmasq.leases</u>
*: DHCPリース情報が記録される。
<br>
<br>
  # /etc/dnsmasq.confファイル
ドロップインディレクトリを活用することにより、<u>/etc/dnsmasq.conf</u> ファイルを直接編集せずに設定を追加できる。<br>
<br>
==== /etc/dnsmasq.confの主要設定項目 ====
下表に、<u>/etc/dnsmasq.conf</u> ファイルの主な設定項目を示す。<br>
<br>
<center>
{| class="wikitable"
|+ /etc/dnsmasq.confの主な設定項目
! 設定項目 !! デフォルト値 !! 説明
|-
| <code>port=53</code> || 53 || DNSリッスンポート<br><code>0</code> でDNS機能を無効化
|-
| <code>interface=&lt;name&gt;</code> || 全IF || リッスンするインターフェースを指定
|-
| <code>listen-address=&lt;ip&gt;</code> || 全アドレス || リッスンするIPアドレスを指定
|-
| <code>bind-interfaces</code> || 無効 || 指定インターフェースのみbind
|-
| <code>bind-dynamic</code> || 無効 || bind-interfaces相当 + 新IF自動検出<br>推奨
|-
| <code>domain-needed</code> || 無効 || ドットなしクエリを上流に転送しない。
|-
| <code>bogus-priv</code> || 無効 || プライベートIP逆引きを上流に転送しない。(RFC6303)
|-
| <code>no-resolv</code> || 無効 || <u>/etc/resolv.conf</u> ファイルを読まない。
|-
| <code>resolv-file=&lt;file&gt;</code> || /etc/resolv.conf || 上流DNS取得ファイルを指定
|-
| <code>no-poll</code> || 無効 || <u>resolv.conf</u> ファイル変更ポーリングを無効化
|-
| <code>server=&lt;domain&gt;/&lt;ip&gt;</code> || なし || ドメイン別の転送先を指定
|-
| <code>address=&lt;domain&gt;/&lt;ip&gt;</code> || なし || 常に指定IPを返す。
|-
| <code>domain=&lt;domain&gt;</code> || なし || ローカルドメインを指定
|-
| <code>local=&lt;domain&gt;</code> || なし || <code>server=/domain/</code> のシノニム
|-
| <code>expand-hosts</code> || 無効 || <u>/etc/hosts</u> ファイルの単純名にドメインを付加
|-
| <code>no-hosts</code> || 無効 || <u>/etc/hosts</u> ファイルを読まない。
|-
| <code>addn-hosts=&lt;file&gt;</code> || なし || 追加hostsファイルを指定
|-
| <code>stop-dns-rebind</code> || 無効 || DNS再バインディング攻撃対策
|-
| <code>rebind-localhost-ok</code> || 無効 || 127.0.0.0/8, ::1をrebind除外
|-
| <code>rebind-domain-ok=&lt;domain&gt;</code> || なし || 指定ドメインをrebind除外
|-
| <code>local-service</code> || 無効 || ローカルネットワークからのクエリのみ受付
|-
| <code>cache-size=&lt;num&gt;</code> || 150 || キャッシュ最大サイズ<br><code>0</code> で無効
|-
| <code>dns-forward-max=&lt;num&gt;</code> || 150 || 同時上流クエリ最大数
|-
| <code>log-queries</code> || 無効 || DNSクエリログを記録
|-
| <code>log-facility=&lt;facility&gt;</code> || DAEMON || syslogファシリティを指定
|-
| <code>user=&lt;username&gt;</code> || nobody || 起動後の実行ユーザ
|-
| <code>edns-packet-max=&lt;size&gt;</code> || 1232 || EDNS.0 UDP最大サイズ (DNS Flag Day 2020)
|}
</center>
<br>
実設定例を以下に示す。<br>
<br>
  # /etc/dnsmasq.conf
   
   
  # DNSサーバのポート番号の指定
  # DNSサーバのポート番号
  port=53
  port=53
   
   
  # リッスンするインターフェースの設定
  # リッスンするインターフェース
  interface=<インターフェース名  例: eth0>                                # または使用するインターフェース名
  interface=eth0
  listen-address=127.0.0.1,<Raspberry PiのIPアドレス  例: 192.168.0.100>  # 実際のIPアドレスに変更
  listen-address=127.0.0.1,192.168.1.100
   
   
  # ドメイン名および.(ドット)を付加しないクエリの場合、上位のDNSサーバに転送しない
  # ドットなしクエリおよびプライベートIP逆引きを上流に転送しない
# また、外部のDNSへ問い合わせをする場合は、ホスト名では問い合わせない
  domain-needed
  domain-needed
# プライベートIPアドレスの逆引きを、上位のDNSサーバに転送しない
  bogus-priv
  bogus-priv
   
   
  # 任意のIPアドレスに強制的に接続させたいドメインを追加
  # ローカルドメインの指定
  address=/raspi.com/192.168.1.XX
  domain=raspi.com
local=/raspi.com/
expand-hosts
   
   
  # 名前解決で参照するためのファイルにおいて、デフォルトの/etc/hostsファイルは使用しない
  # /etc/hosts は使用せず、追加hostsファイルを使用
  no-hosts
  no-hosts
addn-hosts=/etc/hosts-dnsmasq
# 任意のIPアドレスに強制的に接続させたいドメイン
address=/raspi.com/192.168.1.100
# キャッシュサイズ
cache-size=10000
# 上流DNSサーバ
server=192.168.1.1
server=1.1.1.1
# DNS再バインディング攻撃対策
stop-dns-rebind
<br>
==== DHCPサーバ機能の設定 ====
下表に、DHCPサーバ機能の主な設定項目を示す。<br>
<br>
<center>
{| class="wikitable"
|+ DHCPサーバ機能の主な設定項目
! 設定項目 !! デフォルト値 !! 説明
|-
| <code>dhcp-range</code> || なし || DHCPリース範囲を指定<br>例: <code>192.168.1.100,192.168.1.200,255.255.255.0,12h</code>
|-
| <code>dhcp-host</code> || なし || MAC / UID別の静的IP割り当て
|-
| <code>dhcp-option</code> || なし || 追加DHCPオプション<br>例: <code>option:router,192.168.1.1</code>
|-
| <code>dhcp-authoritative</code> || 無効 || 権威DHCPサーバとして宣言
|-
| <code>dhcp-lease-max</code> || 1000 || 最大リース数
|-
| <code>log-dhcp</code> || 無効 || DHCP詳細ログを記録
|-
| <code>no-dhcp-interface=&lt;iface&gt;</code> || なし || 指定IFでDHCPを無効化
|}
</center>
<br>
DHCPサーバ機能の設定例を以下に示す。<br>
<br>
# DHCPリース範囲の指定
dhcp-range=192.168.1.100,192.168.1.200,255.255.255.0,12h
   
   
  # /etc/hosts-dnsmasqファイルをDNSのレコードとして使用する
  # 静的IP割り当て (MACアドレス指定)
  addn-hosts=/etc/hosts-dnsmasq
  dhcp-host=aa:bb:cc:dd:ee:ff,192.168.1.50,client1
   
   
  # ドメインを付加しないホスト名の問い合わせの場合、自動的にdomain=で指定されたドメイン名を補完する
  # デフォルトゲートウェイの通知
  # 例. ホスト名sleで問い合わせがある時、domain=で指定しているsuse.comを自動的に追加して、sle.suse.comで返す
  dhcp-option=option:router,192.168.1.1
domain=raspi.com
   
   
  # LANで使用する内部ドメインの指定
  # DNSサーバの通知
  local=/raspi.com/
  dhcp-option=option:dns-server,192.168.1.100
   
   
  # 名前解決で参照するためのファイルを指定
  # 権威DHCPサーバとして宣言
  # ドメイン名のないクエリに対して、自動的にドメイン(domain項目で記述する)を付加する
  dhcp-authoritative
expand-hosts
   
   
  # FQDNとIPアドレスの対応を保存するキャッシュサイズを指定
  # DHCP詳細ログ
  cache-size=10000
  log-dhcp
<br>
==== ホスト名の登録 ====
ホスト名とIPアドレスの対応は、以下のいずれかの方法で登録する。<br>
<br>
===== /etc/hostsを直接使用する方法 =====
デフォルトでは、DNSMasq は <u>/etc/hosts</u> を読み込んで名前解決を行う。<br>
<br>
# /etc/hosts
   
   
  # 上流DNSサーバの設定
  192.168.1.100  ns.raspi.com        ns
  server=<HGWを使用している場合  例: 192.168.0.1>
  192.168.1.101  client1.raspi.com  client1
  server=1.1.1.1
  192.168.1.102  client2.raspi.com  client2
<br>
<br>
名前解決で参照するためのファイルを作成する。<br>
===== addn-hostsを使用する方法 =====
以下の例に記述しているXXやYY等のIPアドレスを、該当するクライアントPCのIPアドレスに変更すること。<br>
<u>/etc/hosts</u> ファイルとは別にホスト名登録用ファイルを用意する場合は、<u>no-hosts</u> と <u>addn-hosts</u> を組合せて使用する。<br>
  sudo vi /etc/hosts-dnsmasq
<br>
  # /etc/dnsmasq.confファイル
no-hosts
addn-hosts=/etc/hosts-dnsmasq
<br>
<br>
  # /etc/hosts-dnsmasqファイル
  # /etc/hosts-dnsmasqファイル
   
   
  192.168.x.x    raspi.raspi.net raspi  # 内部向けDNSサーバのIPアドレス
  192.168.1.100  ns.raspi.com        ns
  192.168.x.x    suse.raspi.net  suse   # クライアントPC 1
  192.168.1.101  client1.raspi.com   client1
  192.168.x.x    sle.raspi.net   sle    # クライアントPC 2
  192.168.1.102  client2.raspi.com   client2
<br>
<u>expand-hosts</u> を有効化している場合は、単純名 (例: client1) での問い合わせにも自動的に <code>domain=</code> で指定したドメインが付加される。<br>
<br>
<br>
設定変更後、DNSmasqを再起動する。<br>
==== 動作の流れ ====
sudo systemctl restart dnsmasq
DNSMasqの名前解決の動作の流れを、以下に示す。<br>
<br>
<br>
ログを確認して問題がないか確認する。<br>
# クライアントPCからDNSサーバ (DNSMasq) へ問い合わせが来る。
sudo journalctl -u dnsmasq
# ホスト名のみの場合 (例: sle)、local または hostsファイルを参照して名前解決を行う。
# ホスト名 + ドメイン名の場合 (例: sle.suse.com)、local または hostsファイルを参照して名前解決を行う。
# ドメイン外の場合 (例: google.co.jp)、上位のDNSサーバに問い合わせをフォワードする。
<br>
<br>
上記の設定により、DNSMasqは、以下に示すように動作する。<br>
上流DNSへのフォワード応答はキャッシュされて、次回以降の同一クエリに対してはキャッシュから応答が返される。<br>
# クライアントPCからDNSサーバ(dnsmasq)へ問い合わせが来る。
# ホスト名のみの場合(例. sle)、/etc/hosts-dnsmasqファイルを参照して、名前解決を行う。
# ホスト名 + ドメイン名の場合(例. sle.suse.com)、/etc/hosts-dnsmasqファイルを参照して、名前解決を行う。
# ドメイン外の場合(例. google.co.jp)、上位のDNSサーバに問い合わせをフォワードする。
<br><br>
<br><br>


== DNSMasqの起動 ==
== systemd-resolvedとの競合回避 ==
DNSMasqを起動する。<br>
現代のLinuxディストリビューションでは、systemd-resolvedがデフォルトで有効化されている場合がある。<br>
併せて、ファイアーウォールのポート開放も行う。<br>
<br>
  sudo systemctl start dnsmasq
systemd-resolvedは、<u>127.0.0.53:53</u> でスタブリスナーを起動するため、DNSMasqが53番ポートをバインドしようとすると <u>Address already in use</u> エラーで起動に失敗する。<br>
<br>
競合を回避する手順を以下に示す。<br>
<br>
# 設定ディレクトリを作成する。
#: <pre>sudo mkdir -p /etc/systemd/resolved.conf.d</pre>
# スタブリスナー無効化設定ファイルを作成する。
#: <syntaxhighlight lang="ini">
  # /etc/systemd/resolved.conf.d/disable-stub.confファイル
   
   
[Resolve]
DNSStubListener=no
</syntaxhighlight>
#: <br>
# systemd-resolvedを再起動する。
#: <pre>sudo systemctl restart systemd-resolved</pre>
# <u>/etc/resolv.conf</u> ファイルを再設定する。
#: <syntaxhighlight lang="text">
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
# または手動で nameserver 127.0.0.1 を設定する
</syntaxhighlight>
# DNSMasqを再起動する。
#: <pre>sudo systemctl restart dnsmasq</pre>
# 53番ポートのリッスン状況を確認する。
#: <pre>sudo ss -tulpn | grep :53</pre>
<br>
<u>※注意</u><br>
<u>NetworkManagerの <code>dns=dnsmasq</code> 設定は、NetworkManagerが独自のDNSMasqインスタンスを起動する機能である。</u><br>
<u>スタンドアロンでDNSMasqを運用する場合は、<u>/etc/NetworkManager/NetworkManager.conf</u> ファイルの <code>dns=</code> を <code>default</code> 等に変更して無効化することが推奨される。</u><br>
<br>
<u>systemd-resolvedのスタブリスナーを無効化した後は、<u>/etc/resolv.conf</u> ファイルがDNSMasq (127.0.0.1) を向くように設定すること。</u><br>
<br><br>
== DNSMasqの起動と停止 ==
DNSMasqの起動、停止、有効化、無効化、再起動、状態確認、ログ確認のコマンドを以下に示す。<br>
<br>
* 起動
*: <pre>sudo systemctl start DNSMasq</pre>
*: <br>
* 停止
*: <pre>sudo systemctl stop dnsmasq</pre>
*: <br>
* 自動起動の有効化
*: <pre>sudo systemctl enable dnsmasq</pre>
*: <br>
* 自動起動の無効化
*: <pre>sudo systemctl disable dnsmasq</pre>
*: <br>
* 再起動
*: <pre>sudo systemctl restart dnsmasq</pre>
*: <br>
* 状態確認
*: <pre>sudo systemctl status dnsmasq</pre>
*: <br>
* ログ確認
*: <pre>sudo journalctl -u dnsmasq</pre>
<br>
==== ファイアウォールの設定 ====
下表に、DNSMasqが使用するポートを環境別に示す。<br>
<br>
<center>
{| class="wikitable"
|+ 環境別ファイアウォール設定
! 環境 !! ツール !! DNS (53/UDP+TCP) !! DHCP (67/UDP) !! TFTP (69/UDP) !! コマンド例
|-
| RHEL || firewalld || dnsサービス || dhcpサービス || tftpサービス || <code>sudo firewall-cmd --permanent --add-service=dns</code>
|-
| SUSE || firewalld || dnsサービス || dhcpサービス || tftpサービス || <code>sudo firewall-cmd --permanent --add-service=dns</code>
|-
| Raspberry Pi OS || ufw || 53/TCP+UDP || 67/UDP || 69/UDP || <code>sudo ufw allow 53/udp</code>
|}
</center>
<br>
===== firewalldの場合 =====
# DNS (53/UDP, 53/TCP) の許可
  sudo firewall-cmd --permanent --add-service=dns
  sudo firewall-cmd --permanent --add-service=dns
  # または
  ## またはゾーンを指定
  sudo firewall-cmd --zone=internal --permanent --add-service=dns  
  sudo firewall-cmd --zone=internal --permanent --add-service=dns
# DHCP (67/UDP) の許可
sudo firewall-cmd --permanent --add-service=dhcp
# TFTP (69/UDP) の許可 (PXEブートを使用する場合)
sudo firewall-cmd --permanent --add-service=tftp
   
   
# 設定の反映
  sudo firewall-cmd --reload
  sudo firewall-cmd --reload
<br><br>
<br>
 
ポートを閉じる場合は、<code>--add-service</code> オプションを <code>--remove-service</code> オプションに置き換える。<br>
== DNSMasqの停止 ==
<br>
DNSMasqを停止する。<br>
===== ufwの場合 =====
併せて、ファイアーウォールのポートも閉じる。<br>
# DNS (53/UDP, 53/TCP) の許可
  sudo systemctl stop dnsmasq
sudo ufw allow 53/udp
sudo ufw allow 53/tcp
# DHCP (67/UDP) の許可
  sudo ufw allow 67/udp
   
   
sudo firewall-cmd --permanent --remove-service=dns
  # TFTP (69/UDP) の許可 (PXEブートを使用する場合)
  # または
  sudo ufw allow 69/udp
  sudo firewall-cmd --zone=internal --permanent --add-service=dns
   
   
  sudo firewall-cmd --reload
# 設定の確認
  sudo ufw status
<br><br>
<br><br>


== クライアントPCの設定 ==
== クライアントPCの設定 ==
クライアントPCから内部向けDNSサーバを利用するための設定を行う。<br>
<br>
まず、ドメイン検索の設定を行う。<br>
まず、ドメイン検索の設定を行う。<br>
<br>
* KDEを使用している場合
* KDEを使用している場合
*# [KDEシステム設定]を起動して、[接続]を選択する。
*# [KDEシステム設定]を起動して、[接続]を選択する。
*# [接続]画面左の接続名を選択して、[接続]画面右の[IPv4]タブ - [DNSサーバ:]項目に内部向けDNSサーバのIPアドレスを追加する。
*# [接続]画面左の接続名を選択して、[接続]画面右の[IPv4]タブ - [DNSサーバ:]項目に内部向けDNSサーバのIPアドレスを追加する。
*# 同様に、[接続]画面右の[IPv4]タブ - [検索ドメイン:]項目に内部向けDNSサーバのドメイン名を入力する。<br>例えば、DNSサーバ名が<code>ns.suse.com</code>の場合、<code>suse.com</code>と入力する。
*# 同様に、[接続]画面右の[IPv4]タブ - [検索ドメイン:]項目に内部向けDNSサーバのドメイン名を入力する。<br>例えば、DNSサーバ名が <u>ns.suse.com</u> の場合、<u>suse.com</u> と入力する。
*: <br>
** リゾルバファイルを編集する場合
* リゾルバファイルを編集する場合
**: <u>/etc/resolv.conf</u> ファイルにおいて、内部向けDNSサーバのドメイン名を入力する。
*: /etc/resolv.confファイルにおいて、内部向けDNSサーバのドメイン名を入力する。
**: 例えば、DNSサーバ名が <u>ns.suse.com</u> の場合、<u>suse.com</u> と入力する。
*: 例えば、DNSサーバ名が<code>ns.suse.com</code>の場合、<code>suse.com</code>と入力する。
**: <pre>sudo vi /etc/resolv.conf</pre>
*: <code>sudo vi /etc/resolv.conf</code>
**: <syntaxhighlight lang="text">
*: <br>
# /etc/resolv.confファイル
*: <code>domain suse.com</code>
*: または
domain suse.com
*: <code>search suse.com</code>
# または
*: <br>
search suse.com
*: 編集後、/etc/resolv.confファイルを更新する。
</syntaxhighlight>
*: <code>sudo netconfig update -f</code>
**: <br>
**: SUSEの場合は、編集後に以下に示すコマンドを実行する。
**: <pre>sudo netconfig update -f</pre>
<br>
<br>
次に、クライアントPCのネットワークを再起動する。<br>
次に、クライアントPCのネットワークを再起動する。<br>
* <code>systemctl</code>コマンドを使用する場合
<br>
*: <code>sudo systemctl restart NetworkManager</code>
* systemctlコマンドを使用する場合
* <code>nmcli</code>コマンドを使用する場合
*: <pre>sudo systemctl restart NetworkManager</pre>
*: NetworkManagerの全てのインターフェイスを停止した後、それらを起動する。
* nmcliコマンドを使用する場合
*: <code>sudo nmcli networking off && sudo nmcli networking on</code>
*: NetworkManagerの全てのインターフェイスを停止した後、これらを起動する。
*: <br>
*: <syntaxhighlight lang="text">
* Linuxを再起動する場合
sudo nmcli networking off
*: <code>sudo shutdown -r now</code>
sudo nmcli networking on
</syntaxhighlight>
<br><br>
<br><br>


== ドメイン名の正引きおよび逆引きの確認 ==
== 動作確認 ==
各クライアントPCの正引きおよび逆引きができるかどうかを確認する。<br>
==== digコマンド ====
digコマンドは、DNSクエリを送信して応答を確認するツールである。<br>
<br>
digコマンドを含むパッケージはディストリビューションにより異なる。<br>
<br>
# RHEL
sudo dnf install bind-utils
# SUSE
sudo zypper install bind-utils
# Raspberry Pi
sudo apt install dnsutils
<br>
<br>
digコマンドの基本的な使用方法を以下に示す。<br>
digコマンドの基本的な使用方法を以下に示す。<br>
<br>
  # OSに設定されているDNSサーバに問い合わせ
  # OSに設定されているDNSサーバに問い合わせ
  dig <問い合わせをするホスト名>
  dig <問い合わせホスト名>
   
   
  # @以下で指定したDNSサーバに問い合わせ
  # @以下で指定したDNSサーバに問い合わせ
  dig @<DNSサーバのIPアドレス> <問い合わせをするホスト名>
  dig @<DNSサーバIP> <問い合わせホスト名>
   
   
  # IPアドレスからの逆引き
  # IPアドレスからの逆引き
  dix -x <IPアドレス>
  dig -x <IPアドレス>
<br>
<br>
  nslookup ns.suse.com   # 内部向けDNSサーバの正引き
==== digコマンドの主なオプション ====
  nslookup pc1.suse.com # クライアントPC 1の正引き
下表に、digコマンドの主なオプションを示す。<br>
  nslookup pc2.suse.com # クライアントPC 2の正引き
<br>
  nslookup pc3.suse.com # クライアントPC 3の正引き
<center>
{| class="wikitable"
|+ digコマンドの主なオプション
! オプション !! 説明
|-
| <code>@&lt;server&gt;</code> || クエリ送信先DNSサーバを指定
|-
| <code>-x &lt;ip&gt;</code> || 逆引きクエリ (in-addr.arpa自動構築)
|-
| <code>+short</code> || 回答値のみを出力
|-
| <code>+noall +answer</code> || ANSWERセクションのみ表示
|-
| <code>+trace</code> || ルートサーバから委任チェーンを追跡
|-
| <code>+time=&lt;sec&gt;</code> || クエリタイムアウト (デフォルト5)
|-
| <code>+tries=&lt;num&gt;</code> || 再試行回数 (デフォルト3)
|-
| <code>+recurse</code> || 再帰クエリ要求 (デフォルト有効)
|-
| <code>+norecurse</code> || 非再帰クエリ要求
|-
| <code>+tcp</code> || TCPで送信
|-
| <code>+dnssec</code> || DNSSECレコードを要求
|-
| <code>+domain=&lt;name&gt;</code> || 検索ドメインを付加
|-
| <code>+search</code> || <u>/etc/resolv.conf</u> ファイルのsearchを使用
|-
| <code>-p &lt;port&gt;</code> || ポートを指定
|}
</center>
<br>
==== 正引きおよび逆引き ====
各クライアントPCの正引きおよび逆引きができるかどうかを確認する。<br>
<br>
nslookupコマンドを使用する例を以下に示す。<br>
<br>
  nslookup ns.suse.com   # 内部向けDNSサーバの正引き
  nslookup pc1.suse.com   # クライアントPC 1の正引き
  nslookup pc2.suse.com   # クライアントPC 2の正引き
  nslookup pc3.suse.com   # クライアントPC 3の正引き
   
   
  nslookup 192.168.1.XX # 内部向けDNSサーバの逆引き
  nslookup 192.168.1.XX   # 内部向けDNSサーバの逆引き
  nslookup 192.168.1.YY # クライアントPC 1の逆引き
  nslookup 192.168.1.YY   # クライアントPC 1の逆引き
  nslookup 192.168.1.ZZ # クライアントPC 2の逆引き
  nslookup 192.168.1.ZZ   # クライアントPC 2の逆引き
  nslookup 192.168.1.AA # クライアントPC 3の逆引き
  nslookup 192.168.1.AA   # クライアントPC 3の逆引き
<br>
digコマンドを使用する例を以下に示す。<br>
<br>
# 正引き (回答値のみ)
dig @127.0.0.1 ns.suse.com +short
dig @127.0.0.1 pc1.suse.com +short
   
   
  # 再帰問い合わせが無効の場合(recursion項目がnoの場合)
  # 逆引き (回答値のみ)
  dig @<該当PCのIPアドレス> <該当PCのドメイン名>
dig -x 192.168.1.XX +short
  例1. dig @192.168.10.5 ns.suse.net
dig -x 192.168.1.YY +short
  例2. dig @192.168.10.6 pc01.suse.net
<br>
再帰問い合わせが無効の場合 (<code>recursion=no</code>) は、クライアントPCのIPアドレスを直接指定して問い合わせる。<br>
<br>
  dig @<PCのIPアドレス> <ドメイン名>
   
# 例1
dig @192.168.10.5 ns.suse.net
   
# 例2
dig @192.168.10.6 pc01.suse.net
<br><br>
 
== トラブルシューティング ==
==== 53番ポートが既に使用されている ====
* 原因
*: systemd-resolved または 他のDNSサーバ (bind, unbound, Pi-hole等) が53番ポートを占有している。
*: <br>
* 確認方法
*: <pre>sudo ss -tulpn | grep :53</pre>
*: <br>
* 解決方法
** systemd-resolvedのスタブリスナーを無効化する。<br>前述の[[#systemd-resolvedとの競合回避|systemd-resolvedとの競合回避]]セクションを参照すること。
** 他のDNSサーバを停止する。
** dnsmasq を再起動する。
<br>
==== 名前解決できない (上流DNS到達不可) ====
*原因
*: <u>/etc/resolv.conf</u> ファイル または <code>--resolv-file</code> オプションで指定した上流サーバに到達不能。
*: <br>
* 確認方法
*: <syntaxhighlight lang="text">
dig @8.8.8.8 example.com +short
sudo journalctl -u dnsmasq
</syntaxhighlight>
*: <br>
* 解決方法
** <u>/etc/resolv.conf</u> ファイルの内容を確認して、到達可能な上流DNSを指定する。
** <code>no-resolv</code> 使用時は、<code>server=</code> で上流DNSを明示指定する。
** ファイアウォールで53番ポート (UDP / TCP) の送信を許可する。
<br>
==== 設定ファイルの構文エラー ====
* 原因
*: オプション名の誤り あるいは 値の形式間違い。
*: <br>
* 確認方法
*: <pre>sudo dnsmasq --test</pre>
*: <br>
* 解決方法
** <code>--test</code> オプションで指摘された行を修正する。
** 再度、<code>--test</code> オプションを付加して検証する。
** DNSmasqを再起動する。
**: <pre>sudo systemctl restart dnsmasq</pre>
<br>
==== サービスが起動しない ====
* 原因
*: 構文エラー、53番ポートの競合、interfaceが存在しない、権限不足
*: <br>
* 確認方法
*: <syntaxhighlight lang="text">
sudo systemctl status dnsmasq
sudo journalctl -u dnsmasq
sudo systemctl is-enabled dnsmasq
</syntaxhighlight>
*: <br>
* 解決方法
** <code>dnsmasq --test</code> オプションで構文を修正する。
** 53番ポートの競合問題を解決する。<br>前述のsystemd-resolvedセクションを参照すること。
** <u>bind-interfaces</u> を <u>bind-dynamic</u> に変更する。
** masked状態の場合は、unmaskする。
**: <pre>sudo systemctl unmask dnsmasq.service</pre>
<br>
==== DNS再バインディング攻撃を止める ====
* 原因
*: 外部攻撃者がDNS応答でプライベートIPを返して、内部ネットワークへアクセスを試みる。
*: <br>
* 確認方法
*: <pre>sudo journalctl -u dnsmasq | grep -i rebind</pre>
*: <br>
* 解決方法
** <u>stop-dns-rebind</u> を有効化する。
** 例外ドメインは、<u>rebind-domain-ok=&lt;domain&gt;</u> で指定する。
** <u>rebind-localhost-ok</u> で、<u>127.0.0.0/8</u> と <u>::1</u> をrebind除外に設定する。
<br><br>
 
== 関連情報 ==
* [https://thekelleys.org.uk/dnsmasq/doc.html dnsmasq 公式ドキュメント]
* [https://thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html dnsmasq man ページ]
* [https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/10/ Red Hat Enterprise Linux 10 ドキュメント]
* [https://documentation.suse.com/sles/16/ SUSE Linux Enterprise Server 16 ドキュメント]
* [https://www.raspberrypi.com/documentation/ Raspberry Pi 公式ドキュメント]
* [[サーバ - DHCP]]
<br><br>
<br><br>
{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板,DNSMasq,DNS,DHCP,TFTP,RHEL,NetworkManager
|description={{PAGENAME}} - DNSMasqの設定ガイド (RHEL / SUSE / Raspberry Pi OS向け) DNSフォワーダ、DHCPサーバ、TFTPサーバの統合設定手順 | This page is {{PAGENAME}} in MochiuWiki
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:Raspberry Pi]]
[[カテゴリ:RHEL]][[カテゴリ:SUSE]][[カテゴリ:Raspberry Pi]]

2026年8月12日 (水) 03:09時点における最新版

概要

DNSMasqは、DNSフォワーダ、DHCPサーバ、TFTPサーバ、ルータ広告 (RA) サーバを1つに統合した軽量なネットワークサービスである。

Simon Kelleyによって開発され、GPL v2 / v3以降のライセンスで提供されている。
Linux、BSD、Mac OSで動作し、IPv4 と IPv6 の両方に対応する。

小規模ネットワークやホームネットワーク、組込み機向けの軽量ツールとして広く利用されており、BIND等のフル機能DNSサーバと比較して設定が簡素でメモリ消費が少ないのが特徴である。

主なユースケースを以下に示す。

  • 内部向けDNSサーバ (LAN内のホスト名解決)
  • DNSキャッシュサーバ (上流DNS応答のキャッシュによる応答速度向上)
  • DHCPサーバ (DHCPv4/DHCPv6/BOOTPによるIPアドレス配布)
  • PXEネットブート (TFTPサーバとの組合せによるネットワーク起動)
  • IPv6 RAサーバ (ステートレスアドレス自動設定の広告)



前提条件

DNSMasqを導入する環境の前提条件を以下に示す。

  • RHEL
    • ネットワーク管理
      NetworkManager
    • パッケージ
      dnsmasq
      dnsmasq-utils (任意)
  • SUSE
    • ネットワーク管理
      NetworkManager または wicked
    • パッケージ
      dnsmasq
  • Raspberry Pi OS
    • 静的IPアドレスの事前設定 (DHCPサーバとして運用する場合)
    • パッケージ
      dnsmasq
    dhcpcd5 または NetworkManagerとの競合に注意すること。


※注意
DNSサーバとして稼働させるホストには固定IPアドレスを設定すること。


DNSMasqのインストール

RHEL

dnsmasq-utils は、dhcp_release 等の補助ツールを含む任意パッケージである。

sudo dnf install dnsmasq dnsmasq-utils


留意点を以下に示す。

NetworkManagerは、 dns=dnsmasq 設定で独自のDNSMasqインスタンスを起動する。
スタンドアロンでDNSMasqを運用する場合は、/etc/NetworkManager/NetworkManager.conf ファイルの dns=default 等に変更して無効化することが推奨される。

RHELでは、systemd-resolvedが有効化されている場合がある。
その場合は、systemd-resolvedとの競合回避セクションを参照すること。

SUSE

NetworkManager-dns-dnsmasq パッケージは、NetworkManager連携用の任意パッケージである。

sudo zypper install dnsmasq NetworkManager-dns-dnsmasq


networkリポジトリから最新版を導入する場合は、以下に示す手順を実行する。

sudo zypper addrepo https://download.opensuse.org/repositories/network/$releasever/network.repo Network
sudo zypper refresh

sudo zypper install dnsmasq


Raspberry Pi OS

sudo apt install dnsmasq


インストール直後にサービスがmasked状態になっている場合は、以下に示すコマンドで有効化する。

sudo systemctl unmask dnsmasq.service
sudo systemctl enable dnsmasq.service


※注意
Buster以前のRaspberry Pi OSでは、dhcpcd5がDHCPクライアントとして動作するため、DNSMasqと競合する場合がある。
Bookworm以降は、NetworkManagerに移行しており、dhcpcd5との競合は軽減されている。

DHCPサーバとして運用する場合は、事前に固定IPアドレスを設定しておくこと。


DNSMasqの主な機能

下表に、DNSMasqが提供する主な機能を示す。

DNSMasqの主な機能
機能 説明
DNSフォワーダ 上流DNSサーバにクエリを転送して、応答をキャッシュする。
DHCPサーバ DHCPv4 / DHCPv6 / BOOTPに対応
静的・動的リース両対応
TFTPサーバ PXEネットブート用の読み取り専用TFTPサーバを提供。
ルータ広告 (RA) IPv6のRAサーバ機能を提供
DNSキャッシュ 上流応答をキャッシュして応答速度を向上


これらの機能は1つのプロセスで統合的に提供されるため、複数のサービスを個別に導入・設定する必要がない。


DNSMasqの設定

設定ファイルの構成

DNSMasqの設定ファイルの構成を以下に示す。

  • メイン設定ファイル
    /etc/dnsmasq.conf
  • ドロップイン設定ディレクトリ
    /etc/dnsmasq.d/
    このディレクトリ内の .conf ファイルは自動的に読み込まれる。
  • ホスト名登録ファイル
    /etc/hosts (デフォルト) または --addn-hosts オプションで指定したファイル
  • 上流DNS参照ファイル
    /etc/resolv.conf (デフォルト) または --resolv-file オプションで指定したファイル
  • リースファイル
    /var/lib/dnsmasq/dnsmasq.leases
    DHCPリース情報が記録される。


ドロップインディレクトリを活用することにより、/etc/dnsmasq.conf ファイルを直接編集せずに設定を追加できる。

/etc/dnsmasq.confの主要設定項目

下表に、/etc/dnsmasq.conf ファイルの主な設定項目を示す。

/etc/dnsmasq.confの主な設定項目
設定項目 デフォルト値 説明
port=53 53 DNSリッスンポート
0 でDNS機能を無効化
interface=<name> 全IF リッスンするインターフェースを指定
listen-address=<ip> 全アドレス リッスンするIPアドレスを指定
bind-interfaces 無効 指定インターフェースのみbind
bind-dynamic 無効 bind-interfaces相当 + 新IF自動検出
推奨
domain-needed 無効 ドットなしクエリを上流に転送しない。
bogus-priv 無効 プライベートIP逆引きを上流に転送しない。(RFC6303)
no-resolv 無効 /etc/resolv.conf ファイルを読まない。
resolv-file=<file> /etc/resolv.conf 上流DNS取得ファイルを指定
no-poll 無効 resolv.conf ファイル変更ポーリングを無効化
server=<domain>/<ip> なし ドメイン別の転送先を指定
address=<domain>/<ip> なし 常に指定IPを返す。
domain=<domain> なし ローカルドメインを指定
local=<domain> なし server=/domain/ のシノニム
expand-hosts 無効 /etc/hosts ファイルの単純名にドメインを付加
no-hosts 無効 /etc/hosts ファイルを読まない。
addn-hosts=<file> なし 追加hostsファイルを指定
stop-dns-rebind 無効 DNS再バインディング攻撃対策
rebind-localhost-ok 無効 127.0.0.0/8, ::1をrebind除外
rebind-domain-ok=<domain> なし 指定ドメインをrebind除外
local-service 無効 ローカルネットワークからのクエリのみ受付
cache-size=<num> 150 キャッシュ最大サイズ
0 で無効
dns-forward-max=<num> 150 同時上流クエリ最大数
log-queries 無効 DNSクエリログを記録
log-facility=<facility> DAEMON syslogファシリティを指定
user=<username> nobody 起動後の実行ユーザ
edns-packet-max=<size> 1232 EDNS.0 UDP最大サイズ (DNS Flag Day 2020)


実設定例を以下に示す。

# /etc/dnsmasq.conf

# DNSサーバのポート番号
port=53

# リッスンするインターフェース
interface=eth0
listen-address=127.0.0.1,192.168.1.100

# ドットなしクエリおよびプライベートIP逆引きを上流に転送しない
domain-needed
bogus-priv

# ローカルドメインの指定
domain=raspi.com
local=/raspi.com/
expand-hosts

# /etc/hosts は使用せず、追加hostsファイルを使用
no-hosts
addn-hosts=/etc/hosts-dnsmasq

# 任意のIPアドレスに強制的に接続させたいドメイン
address=/raspi.com/192.168.1.100

# キャッシュサイズ
cache-size=10000

# 上流DNSサーバ
server=192.168.1.1
server=1.1.1.1

# DNS再バインディング攻撃対策
stop-dns-rebind


DHCPサーバ機能の設定

下表に、DHCPサーバ機能の主な設定項目を示す。

DHCPサーバ機能の主な設定項目
設定項目 デフォルト値 説明
dhcp-range なし DHCPリース範囲を指定
例: 192.168.1.100,192.168.1.200,255.255.255.0,12h
dhcp-host なし MAC / UID別の静的IP割り当て
dhcp-option なし 追加DHCPオプション
例: option:router,192.168.1.1
dhcp-authoritative 無効 権威DHCPサーバとして宣言
dhcp-lease-max 1000 最大リース数
log-dhcp 無効 DHCP詳細ログを記録
no-dhcp-interface=<iface> なし 指定IFでDHCPを無効化


DHCPサーバ機能の設定例を以下に示す。

# DHCPリース範囲の指定
dhcp-range=192.168.1.100,192.168.1.200,255.255.255.0,12h

# 静的IP割り当て (MACアドレス指定)
dhcp-host=aa:bb:cc:dd:ee:ff,192.168.1.50,client1

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

# DNSサーバの通知
dhcp-option=option:dns-server,192.168.1.100

# 権威DHCPサーバとして宣言
dhcp-authoritative

# DHCP詳細ログ
log-dhcp


ホスト名の登録

ホスト名とIPアドレスの対応は、以下のいずれかの方法で登録する。

/etc/hostsを直接使用する方法

デフォルトでは、DNSMasq は /etc/hosts を読み込んで名前解決を行う。

# /etc/hosts

192.168.1.100   ns.raspi.com        ns
192.168.1.101   client1.raspi.com   client1
192.168.1.102   client2.raspi.com   client2


addn-hostsを使用する方法

/etc/hosts ファイルとは別にホスト名登録用ファイルを用意する場合は、no-hostsaddn-hosts を組合せて使用する。

# /etc/dnsmasq.confファイル

no-hosts
addn-hosts=/etc/hosts-dnsmasq


# /etc/hosts-dnsmasqファイル

192.168.1.100   ns.raspi.com        ns
192.168.1.101   client1.raspi.com   client1
192.168.1.102   client2.raspi.com   client2


expand-hosts を有効化している場合は、単純名 (例: client1) での問い合わせにも自動的に domain= で指定したドメインが付加される。

動作の流れ

DNSMasqの名前解決の動作の流れを、以下に示す。

  1. クライアントPCからDNSサーバ (DNSMasq) へ問い合わせが来る。
  2. ホスト名のみの場合 (例: sle)、local または hostsファイルを参照して名前解決を行う。
  3. ホスト名 + ドメイン名の場合 (例: sle.suse.com)、local または hostsファイルを参照して名前解決を行う。
  4. ドメイン外の場合 (例: google.co.jp)、上位のDNSサーバに問い合わせをフォワードする。


上流DNSへのフォワード応答はキャッシュされて、次回以降の同一クエリに対してはキャッシュから応答が返される。


systemd-resolvedとの競合回避

現代のLinuxディストリビューションでは、systemd-resolvedがデフォルトで有効化されている場合がある。

systemd-resolvedは、127.0.0.53:53 でスタブリスナーを起動するため、DNSMasqが53番ポートをバインドしようとすると Address already in use エラーで起動に失敗する。

競合を回避する手順を以下に示す。

  1. 設定ディレクトリを作成する。
    sudo mkdir -p /etc/systemd/resolved.conf.d
  2. スタブリスナー無効化設定ファイルを作成する。
     # /etc/systemd/resolved.conf.d/disable-stub.confファイル
     
     [Resolve]
     DNSStubListener=no
    

  3. systemd-resolvedを再起動する。
    sudo systemctl restart systemd-resolved
  4. /etc/resolv.conf ファイルを再設定する。
     sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
     # または手動で nameserver 127.0.0.1 を設定する
    
  5. DNSMasqを再起動する。
    sudo systemctl restart dnsmasq
  6. 53番ポートのリッスン状況を確認する。
    sudo ss -tulpn | grep :53


※注意
NetworkManagerの dns=dnsmasq 設定は、NetworkManagerが独自のDNSMasqインスタンスを起動する機能である。
スタンドアロンでDNSMasqを運用する場合は、/etc/NetworkManager/NetworkManager.conf ファイルの dns=default 等に変更して無効化することが推奨される。

systemd-resolvedのスタブリスナーを無効化した後は、/etc/resolv.conf ファイルがDNSMasq (127.0.0.1) を向くように設定すること。


DNSMasqの起動と停止

DNSMasqの起動、停止、有効化、無効化、再起動、状態確認、ログ確認のコマンドを以下に示す。

  • 起動
    sudo systemctl start DNSMasq

  • 停止
    sudo systemctl stop dnsmasq

  • 自動起動の有効化
    sudo systemctl enable dnsmasq

  • 自動起動の無効化
    sudo systemctl disable dnsmasq

  • 再起動
    sudo systemctl restart dnsmasq

  • 状態確認
    sudo systemctl status dnsmasq

  • ログ確認
    sudo journalctl -u dnsmasq


ファイアウォールの設定

下表に、DNSMasqが使用するポートを環境別に示す。

環境別ファイアウォール設定
環境 ツール DNS (53/UDP+TCP) DHCP (67/UDP) TFTP (69/UDP) コマンド例
RHEL firewalld dnsサービス dhcpサービス tftpサービス sudo firewall-cmd --permanent --add-service=dns
SUSE firewalld dnsサービス dhcpサービス tftpサービス sudo firewall-cmd --permanent --add-service=dns
Raspberry Pi OS ufw 53/TCP+UDP 67/UDP 69/UDP sudo ufw allow 53/udp


firewalldの場合
# DNS (53/UDP, 53/TCP) の許可
sudo firewall-cmd --permanent --add-service=dns
## またはゾーンを指定
sudo firewall-cmd --zone=internal --permanent --add-service=dns

# DHCP (67/UDP) の許可
sudo firewall-cmd --permanent --add-service=dhcp

# TFTP (69/UDP) の許可 (PXEブートを使用する場合)
sudo firewall-cmd --permanent --add-service=tftp

# 設定の反映
sudo firewall-cmd --reload


ポートを閉じる場合は、--add-service オプションを --remove-service オプションに置き換える。

ufwの場合
# DNS (53/UDP, 53/TCP) の許可
sudo ufw allow 53/udp
sudo ufw allow 53/tcp

# DHCP (67/UDP) の許可
sudo ufw allow 67/udp

# TFTP (69/UDP) の許可 (PXEブートを使用する場合)
sudo ufw allow 69/udp

# 設定の確認
sudo ufw status



クライアントPCの設定

クライアントPCから内部向けDNSサーバを利用するための設定を行う。

まず、ドメイン検索の設定を行う。

  • KDEを使用している場合
    1. [KDEシステム設定]を起動して、[接続]を選択する。
    2. [接続]画面左の接続名を選択して、[接続]画面右の[IPv4]タブ - [DNSサーバ:]項目に内部向けDNSサーバのIPアドレスを追加する。
    3. 同様に、[接続]画面右の[IPv4]タブ - [検索ドメイン:]項目に内部向けDNSサーバのドメイン名を入力する。
      例えば、DNSサーバ名が ns.suse.com の場合、suse.com と入力する。
    • リゾルバファイルを編集する場合
      /etc/resolv.conf ファイルにおいて、内部向けDNSサーバのドメイン名を入力する。
      例えば、DNSサーバ名が ns.suse.com の場合、suse.com と入力する。
      sudo vi /etc/resolv.conf
       # /etc/resolv.confファイル
       
       domain suse.com
       # または
       search suse.com
      

      SUSEの場合は、編集後に以下に示すコマンドを実行する。
      sudo netconfig update -f


次に、クライアントPCのネットワークを再起動する。

  • systemctlコマンドを使用する場合
    sudo systemctl restart NetworkManager
  • nmcliコマンドを使用する場合
    NetworkManagerの全てのインターフェイスを停止した後、これらを起動する。
     sudo nmcli networking off
     sudo nmcli networking on
    



動作確認

digコマンド

digコマンドは、DNSクエリを送信して応答を確認するツールである。

digコマンドを含むパッケージはディストリビューションにより異なる。

# RHEL
sudo dnf install bind-utils

# SUSE
sudo zypper install bind-utils

# Raspberry Pi
sudo apt install dnsutils


digコマンドの基本的な使用方法を以下に示す。

# OSに設定されているDNSサーバに問い合わせ
dig <問い合わせホスト名>

# @以下で指定したDNSサーバに問い合わせ
dig @<DNSサーバIP> <問い合わせホスト名>

# IPアドレスからの逆引き
dig -x <IPアドレス>


digコマンドの主なオプション

下表に、digコマンドの主なオプションを示す。

digコマンドの主なオプション
オプション 説明
@<server> クエリ送信先DNSサーバを指定
-x <ip> 逆引きクエリ (in-addr.arpa自動構築)
+short 回答値のみを出力
+noall +answer ANSWERセクションのみ表示
+trace ルートサーバから委任チェーンを追跡
+time=<sec> クエリタイムアウト (デフォルト5)
+tries=<num> 再試行回数 (デフォルト3)
+recurse 再帰クエリ要求 (デフォルト有効)
+norecurse 非再帰クエリ要求
+tcp TCPで送信
+dnssec DNSSECレコードを要求
+domain=<name> 検索ドメインを付加
+search /etc/resolv.conf ファイルのsearchを使用
-p <port> ポートを指定


正引きおよび逆引き

各クライアントPCの正引きおよび逆引きができるかどうかを確認する。

nslookupコマンドを使用する例を以下に示す。

nslookup ns.suse.com    # 内部向けDNSサーバの正引き
nslookup pc1.suse.com   # クライアントPC 1の正引き
nslookup pc2.suse.com   # クライアントPC 2の正引き
nslookup pc3.suse.com   # クライアントPC 3の正引き

nslookup 192.168.1.XX   # 内部向けDNSサーバの逆引き
nslookup 192.168.1.YY   # クライアントPC 1の逆引き
nslookup 192.168.1.ZZ   # クライアントPC 2の逆引き
nslookup 192.168.1.AA   # クライアントPC 3の逆引き


digコマンドを使用する例を以下に示す。

# 正引き (回答値のみ)
dig @127.0.0.1 ns.suse.com +short
dig @127.0.0.1 pc1.suse.com +short

# 逆引き (回答値のみ)
dig -x 192.168.1.XX +short
dig -x 192.168.1.YY +short


再帰問い合わせが無効の場合 (recursion=no) は、クライアントPCのIPアドレスを直接指定して問い合わせる。

dig @<PCのIPアドレス> <ドメイン名>

# 例1
dig @192.168.10.5 ns.suse.net

# 例2
dig @192.168.10.6 pc01.suse.net



トラブルシューティング

53番ポートが既に使用されている

  • 原因
    systemd-resolved または 他のDNSサーバ (bind, unbound, Pi-hole等) が53番ポートを占有している。

  • 確認方法
    sudo ss -tulpn | grep :53

  • 解決方法
    • systemd-resolvedのスタブリスナーを無効化する。
      前述のsystemd-resolvedとの競合回避セクションを参照すること。
    • 他のDNSサーバを停止する。
    • dnsmasq を再起動する。


名前解決できない (上流DNS到達不可)

  • 原因
    /etc/resolv.conf ファイル または --resolv-file オプションで指定した上流サーバに到達不能。

  • 確認方法
     dig @8.8.8.8 example.com +short
     sudo journalctl -u dnsmasq
    

  • 解決方法
    • /etc/resolv.conf ファイルの内容を確認して、到達可能な上流DNSを指定する。
    • no-resolv 使用時は、server= で上流DNSを明示指定する。
    • ファイアウォールで53番ポート (UDP / TCP) の送信を許可する。


設定ファイルの構文エラー

  • 原因
    オプション名の誤り あるいは 値の形式間違い。

  • 確認方法
    sudo dnsmasq --test

  • 解決方法
    • --test オプションで指摘された行を修正する。
    • 再度、--test オプションを付加して検証する。
    • DNSmasqを再起動する。
      sudo systemctl restart dnsmasq


サービスが起動しない

  • 原因
    構文エラー、53番ポートの競合、interfaceが存在しない、権限不足

  • 確認方法
     sudo systemctl status dnsmasq
     sudo journalctl -u dnsmasq
     sudo systemctl is-enabled dnsmasq
    

  • 解決方法
    • dnsmasq --test オプションで構文を修正する。
    • 53番ポートの競合問題を解決する。
      前述のsystemd-resolvedセクションを参照すること。
    • bind-interfacesbind-dynamic に変更する。
    • masked状態の場合は、unmaskする。
      sudo systemctl unmask dnsmasq.service


DNS再バインディング攻撃を止める

  • 原因
    外部攻撃者がDNS応答でプライベートIPを返して、内部ネットワークへアクセスを試みる。

  • 確認方法
    sudo journalctl -u dnsmasq | grep -i rebind

  • 解決方法
    • stop-dns-rebind を有効化する。
    • 例外ドメインは、rebind-domain-ok=<domain> で指定する。
    • rebind-localhost-ok で、127.0.0.0/8::1 をrebind除外に設定する。



関連情報