dnsmasq
dnsmasq は DNS キャッシュと DHCP サーバーとしてのサービスを提供します。ドメインネームサーバ (DNS) としては DNS クエリをキャッシュすることで以前に訪れたことのあるサイトへの接続速度を向上させることができ、DHCP サーバーとして dnsmasq は LAN 上のコンピュータに内部 IP アドレスとルートを割り当てるのに使えます。サービスのどちらか、または両方として役立てることが可能です。dnsmasq は軽量で設定が簡単です。個人のコンピュータでの利用や、50以下のコンピュータが繋がったネットワークでの使用を想定して作られています。また、PXE サーバーも含まれています。
インストール
公式リポジトリから dnsmasq をインストールしてください。
デーモンの起動
dnsmasq.service
を スタート/有効化 します。
dnsmasq が正常に起動したかどうかは、システムの ジャーナル を確認します。
# journalctl -u dnsmasq.service
また、DHCP クライアントが新しい /etc/resolv.conf
を作成できるように、ネットワークを再起動する必要があります。
設定
dnsmasq を設定するには、/etc/dnsmasq.conf
を編集します。 ファイルにはオプションを説明するコメントが含まれています。 利用可能なすべてのオプションについては dnsmasq(8) を参照してください。
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 を起動してから一度も訪問していないウェブサイトを選択して、検索速度をテストします(drillは ldnsパッケージの一部です)
$ 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#テスト をご覧ください。
NetworkManager
NetworkManager には dnsmasq を使って DNS を有効化するプラグインがあります。DNS ルックアップがキャッシュされることにより、解決時間が短くなったり、VPN ホストの DNS ルックアップを該当する VPS の DNS サーバーに転送することができます (複数の VPN に接続する場合に特に有用です)。
dnsmasq がインストールされていること、ただし無効化されていることを確認してください。それから、/etc/NetworkManager/NetworkManager.conf
を編集して [main]
セクションの dns
を変更してください:
/etc/NetworkManager/NetworkManager.conf
[main] ... dns=dnsmasq
NetworkManager を再起動するかマシンを再起動してください。NetworkManager は自動的に dnsmasq を起動して 127.0.0.1 を /etc/resolv.conf
に追加します。実際の DNS サーバーは /run/NetworkManager/resolv.conf
で確認できます。(bind-tools[リンク切れ: 置換パッケージ: bind] でインストールできる) $ dig example.com
を使って何回か DNS ルックアップを実行してみて dnsmasq が使われていることを確認してください。
カスタム設定
/etc/NetworkManager/dnsmasq.d/
にカスタム設定ファイルを作成することで dnsmasq のためのカスタム設定を作ることができます。例えば、DNS キャッシュの容量を変更するには (RAM に保存されます):
/etc/NetworkManager/dnsmasq.d/cache.conf
cache-size=1000
IPv6
NetworkManager で dnsmasq
を有効にすると IPv6 の DNS ルックアップ (dig -6 [hostname]
) が出来なくなります。この問題を解決するには、以下のファイルを作成して IPv6 のループバックも受信するように dnsmasq を設定します:
/etc/NetworkManager/dnsmasq.d/ipv6_listen.conf
listen-address=::1
さらに、dnsmasq
は上流の IPv6 DNS を優先させません。残念ながら NetworkManager では優先させることが出来ないようです (Ubuntu Bug)。NetworkManager の設定で IPv4 の DNS を無効化するのが回避策になります。
他の方法
他にも NetworkManager のアプレットを使って設定を手動で入力する方法もあります (通常はアプレットを右クリックします)。設定方法は使用しているフロントエンドの種類によりますが、基本的には、アプレットを右クリックして、プロファイルを編集(または作成)し、DHCP タイプとして 'Automatic (specify addresses)' を選択します。DNS アドレスは次のような形式で入力する必要があります: 127.0.0.1, DNS-server-one, ...
。
テスト
ルックアップの速度をテストするには、dnsmasq を起動してから訪れたことのないウェブサイトを選択してください (dig
は bind-tools[リンク切れ: 置換パッケージ: bind] パッケージに入っています):
$ dig archlinuxjp.org | grep "Query time"
dnsmasq を正しく設定していれば、このコマンドを二回目に実行するとキャッシュされた DNS の IP が使用され、ルックアップの時間が速くなっているはずです:
$ dig archlinuxjp.org | grep "Query time"
;; Query time: 18 msec
$ dig archlinuxjp.org | grep "Query time"
;; Query time: 2 msec
DHCP サーバーの設定
デフォルトで dnsmasq の DHCP 機能は無効にされているため、使用したいときは /etc/dnsmasq.conf
で有効にする必要があります。以下は中心となる設定です:
# Only listen to routers' LAN NIC. Doing so opens up tcp/udp port 53 to # localhost and udp port 67 to world: interface=<LAN-NIC> # 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 # Dynamic range of IPs to make available to LAN pc dhcp-range=192.168.111.50,192.168.111.100,12h # If you’d like to have dnsmasq assign static IPs, bind the LAN computer's # NIC MAC address: dhcp-host=aa:bb:cc:dd:ee:ff,192.168.111.50
テスト
dnsmasq が動いているコンピュータに接続されたコンピュータから、DHCP を使って IP アドレスを自動的に割り当てるように設定し、ネットワークに通常通りにログインしてください。
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 によって提供されています.
- TFTP サーバーと DHCP サーバーを設定
- PXE 互換のブートローダー (例: PXELINUX) を TFTP のルートにコピーして設定
/etc/dnsmasq.conf
で PXE を有効化:
ファイルを送信するには:
dhcp-boot=lpxelinux.0
クライアントアーキテクチャに応じてファイルを送信するには:
pxe-service=x86PC, "PXELINUX (BIOS)", "bios/lpxelinux" pxe-service=X86-64_EFI, "PXELINUX (EFI)", "efi64/syslinux.efi"
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 サーバーをインターフェイスで動作させたい場合:
固定
インターフェイスごとに固定のサーバーを使いたい場合、interface
と bind-interface
オプションを使ってください。2番目の dnsmasq が起動するようになります。
動的
インターフェイスを除外して他のインターフェイスにバインドできます:
except-interface=lo bind-dynamic