dnsmasq

提供: ArchWiki
2023年11月27日 (月) 00:52時点におけるKgx (トーク | 投稿記録)による版 (項目を整理)
ナビゲーションに移動 検索に移動

dnsmasq は、DNS サーバーDHCPv6PXE をサポートする DHCP サーバー および TFTP サーバー を提供します。また、dnsmasq は DNS クエリをキャッシュし、過去に訪問したことのあるサイトへの DNS 検索速度を向上させるように設定することができます。

インストール

dnsmasq パッケージを インストール します。次に、dnsmasq.service起動/有効化 します。

DHCP クライアントが新しい /etc/resolv.conf を作成できるように、ネットワークを再起動する必要があります。

設定

dnsmasq を設定するには、/etc/dnsmasq.conf を編集します。 ファイルにはオプションを説明するコメントが含まれています。 利用可能なすべてのオプションについては dnsmasq(8) を参照してください。

ノート: dnsmasq のデフォルト設定では、 DNS サーバーが有効になります。 必要ない場合は、port=0 を設定することで明示的に無効にする必要があります。

dnsmasq をローカル DNS リゾルバとして使用しない場合は、nss-lookup.target をプルインしないように 編集dnsmasq.service} して下さい。

/etc/systemd/system/dnsmasq.service.d/no-nss-lookup-target.conf
[Unit]
Wants=
ヒント: 設定ファイルの構文をチェックするには、以下を実行します:
$ dnsmasq --test

DNS サーバー

dnsmasq を1台のコンピュータで DNS キャッシュデーモンとして設定するには、 listen-address ディレクティブでローカルホストの IP アドレスを追加してください。

listen-address=::1,127.0.0.1

このコンピュータを使用して、ネットワーク上の他のコンピュータの LAN IP アドレスをリッスンします。この場合、静的 LAN IP を使用することをお勧めします。例

listen-address=::1,127.0.0.1,192.168.1.1

キャッシュされるドメイン名の数を cache-size=size で設定します(デフォルトは 150 で、ハードリミットは 10000 です。)

cache-size=1000

DNSSEC の検証には、dnsmasq パッケージが提供する DNSSEC トラストアンカーを読み込み、オプション dnssec を設定します。

conf-file=/usr/share/dnsmasq/trust-anchors.conf
dnssec

使いたいオプションは dnsmasq(8) を参照してください。

DNS アドレスファイル

dnsmasq を設定した後は、DHCP クライアントが /etc/resolv.conf にある既知の DNS アドレスの前にローカルホストのアドレスを挿入させるようにする必要があります。これによって外部の DNS でクエリを解決しようとする前に全てのクエリが dnsmasq に送られるようになります。DHCP クライアントを設定した後は変更を適用するためにネットワークを再起動してください。

openresolv

ネットワークマネージャが resolvconf をサポートしていれば、/etc/resolv.conf を直接変更する代わりに、 openresolv を使って dnsmasq の設定ファイルを生成 することができます。

/etc/resolvconf.conf を編集し、ループバックアドレスをネームサーバとして追加し、dnsmasq 設定を書き出すように openresolv を設定します。

/etc/resolvconf.conf
# Use the local name server
name_servers="::1 127.0.0.1"
resolv_conf_options="trust-ad"

# Write out dnsmasq extended configuration and resolv files
 dnsmasq_conf=/etc/dnsmasq-conf.conf
 dnsmasq_resolv=/etc/dnsmasq-resolv.conf

resolvconf-u を実行して、設定ファイルを作成します。ファイルが存在しない場合、dnsmasq.service は起動に失敗します。

dnsmasq の設定ファイルを編集して、openresolv が生成した設定を使用します [1]

# Read configuration generated by openresolv
conf-file=/etc/dnsmasq-conf.conf
resolv-file=/etc/dnsmasq-resolv.conf
手動転送

まず、/etc/resolv.conf でネームサーバーとして localhost のアドレスのみを設定する必要があります。

/etc/resolv.conf
nameserver ::1
nameserver 127.0.0.1
options trust-ad

ドメイン名前解決#/etc/resolv.conf の書き込み保護 の説明に従って、/etc/resolv.conf を上書きから保護していることを確認してください。

その後、dnsmasq の設定ファイルに server=server_address として上流の DNS サーバのアドレスを指定する必要があります。また、/etc/resolv.conf を読み込んで、dnsmasq が自分自身のローカルホストのアドレスだけを読み込むことがないように、no-resolv を追加してください。

/etc/dnsmasq.conf
[...]
no-resolv

# Google's nameservers, for example
server=8.8.8.8
server=8.8.4.4

これでDNSクエリは dnsmasq で解決され、キャッシュからクエリに答えられない場合のみ外部サーバをチェックするようになります。

カスタムドメインの追加

(ローカル) ネットワークの hosts にカスタムドメインを追加することができます:

local=/home.lan/
domain=home.lan

この例では hostname.home.lan を (hosts ファイルに定義されている) ホスト/デバイスとして ping できます。

hosts エントリにカスタムドメインを追加するには expand-hosts をアンコメントしてください:

expand-hosts

この設定を使わない場合、/etc/hosts のエントリにドメインを追加する必要があります。

テスト

dnsmasq を起動してから一度も訪問していないウェブサイトを選択して、検索速度をテストします(drillldnsパッケージの一部です)

$ drill archlinux.org | grep "Query time"

再度コマンドを実行すると、キャッシュされた DNS IP が使用され、dnsmasq が正しく設定されていれば、検索時間はより速くなります。

$ drill archlinux.org | grep "Query time"
;; Query time: 18 msec
$ drill archlinux.org | grep "Query time"
;; Query time: 2 msec

DNSSEC の検証が機能しているかどうかを調べるには、DNSSEC#テスト をご覧ください。

DHCP サーバー

dnsmasq はデフォルトでは DHCP 機能がオフになっていますので、使用したい場合はオンにする必要があります。 以下、重要な設定項目です。

# Only listen to routers' LAN NIC.  Doing so opens up tcp/udp port 53 to localhost and udp port 67 to world:
interface=enp0s0

# dnsmasq will open tcp/udp port 53 and udp port 67 to world to help with dynamic interfaces (assigning dynamic IPs).
# dnsmasq will discard world requests to them, but the paranoid might like to close them and let the kernel handle them.
bind-interfaces

# Optionally set a domain name
domain=example.org

# Set default gateway
dhcp-option=3,0.0.0.0

# Set DNS servers to announce
dhcp-option=6,0.0.0.0

# If your dnsmasq server is also doing the routing for your network, you can use option 121 to push a static route out.
# x.x.x.x is the destination LAN, yy is the CIDR notation (usually /24), and z.z.z.z is the host which will do the routing.
dhcp-option=121,x.x.x.x/yy,z.z.z.z

# Dynamic range of IPs to make available to LAN PC and the lease time. 
# Ideally set the lease time to 5m only at first to test everything works okay before you set long-lasting records.
dhcp-range=192.168.111.50,192.168.111.100,12h

# Provide IPv6 DHCP leases, the range is constructed using the network interface as prefix
dhcp-range=::f,::ff,constructor:enp0s0

# If you’d like to have dnsmasq assign static IPs to some clients, bind the LAN computers NIC MAC addresses:
dhcp-host=aa:bb:cc:dd:ee:ff,192.168.111.50
dhcp-host=aa:bb:cc:ff:dd:ee,192.168.111.51

その他のオプションについては dnsmasq(8) を参照してください。

プロキシDHCP

ネットワーク上にすでに DHCP サーバーがあり、それと相互運用したい場合、dnsmasq を プロキシ DHCP として動作させ、#PXEサーバー 固有の情報のみをクライアントに提供するように設定することが可能です。このモードは IPv4 でのみ利用可能です。以下の構文を使用し、既存の DHCP サーバーのアドレスを指定します。

dhcp-range=192.168.0.1,proxy

テスト

dnsmasq がインストールされているコンピュータに接続し、DHCP を使用して IP アドレスを自動的に割り当てるように設定し、ネットワークに正常にログインできるか試します。

サーバ上の /var/lib/misc/dnsmasq.leases ファイルを調査すると、リースが確認できるはずです。

TFTP サーバーの設定

転送ファイルを保存する TFTP のルートディレクトリ (例: /srv/tftp) を作成してください。

dnsmasq の TFTP セキュアモードを使うには TFTP のルートディレクトリとファイルの所有者を全て dnsmasq ユーザーに設定してください。

dnsmasq.conf で TFTP を有効化:

/etc/dnsmasq.conf
enable-tftp
tftp-root=/srv/tftp
tftp-secure

PXE の設定

PXE を使うには DHCP と TFTP サーバーが必要ですが、どちらの機能も dnsmasq によって提供されています.

ヒント: dnsmasq を使って既存の DHCP サーバーを使ってネットワークに PXE ブートオプションを追加することもできます:
/etc/dnsmasq.conf
interface=enp0s0
bind-dynamic
dhcp-range=192.168.0.1,proxy
  1. TFTP サーバーDHCP サーバーを設定
  2. PXE 互換のブートローダー (例: PXELINUX) を TFTP のルートにコピーして設定
  3. /etc/dnsmasq.conf で PXE を有効化:
ノート:
  • ファイルのパスは TFTP ルートからの相対パスです。
  • ファイルに .0 拡張子が付く場合、pxe-service オプションで拡張子を除外する必要があります。

ファイルを送信するには:

dhcp-boot=lpxelinux.0

クライアントアーキテクチャに応じてファイルを送信するには:

pxe-service=x86PC, "PXELINUX (BIOS)", "bios/lpxelinux"
pxe-service=X86-64_EFI, "PXELINUX (EFI)", "efi64/syslinux.efi"
ノート: pxe-service が機能しない場合 (特に UEFI を使用するクライアントの場合)、dhcp-matchdhcp-boot を組み合わせることができます。dhcp 起動プロトコルで使用する client-arch の数について詳しくは RFC4578 を見てください。
dhcp-match=set:efi-x86_64,option:client-arch,7
dhcp-match=set:efi-x86_64,option:client-arch,9
dhcp-match=set:efi-x86,option:client-arch,6
dhcp-match=set:bios,option:client-arch,0
dhcp-boot=tag:efi-x86_64,"efi64/syslinux.efi"
dhcp-boot=tag:efi-x86,"efi32/syslinux.efi"
dhcp-boot=tag:bios,"bios/lpxelinux.0"

後はブートローダー次第です。

ヒントとテクニック

OpenDNS が Google へのクエリをリダイレクトするのを止める

OpenDNS が全ての Google クエリを OpenDNS の検索サーバーにリダイレクトを止めさせるには、以下を /etc/dnsmasq.conf に追加してください:

server=/www.google.com/<ISP DNS IP>

リースを表示する

$ cat /var/lib/misc/dnsmasq.leases

アドレスの上書き

キャプティブポータルを使用する場合など、特定の場面では特定のドメインをハードコードされたアドレスセットに解決するのが役に立つ場合があります。address の設定で解決できます:

address=/example.com/1.2.3.4

さらに、特殊なワイルドカードを使うことで /etc/hosts や DHCP が返答がないドメイン名について特定のアドレスを返すようにすることが可能です:

address=/#/1.2.3.4

複数のインスタンスを動作する

複数の dnsmasq サーバーをインターフェイスで動作させたい場合:

固定

インターフェイスごとに固定のサーバーを使いたい場合、interfacebind-interface オプションを使ってください。2番目の dnsmasq が起動するようになります。

動的

インターフェイスを除外して他のインターフェイスにバインドできます:

except-interface=lo
bind-dynamic
ノート: libvirt では上記がデフォルトです。

ドメインのブロックリスト化

ドメインをブロックリスト化する、つまり NXDOMAIN でドメインに対するクエリに答えるには、IP アドレスを指定せずに address オプションを使用します。

address=/blocked.example/
address=/anotherblocked.example/

ブロックリストを別のファイル、例えば /etc/dnsmasq.d/blocklist.conf に置き、 conf-file=/etc/dnsmasq.d/blocklist.conf または conf-dir=/etc/dnsmasq.d/,*.conf でロードすると使い勝手がよいです。

ヒント: ブロックリストのソース候補のリストは OpenWrt の adblock パッケージの README で見ることができます。

参照