「Dnsmasq」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期)
 
(5人の利用者による、間の23版が非表示)
1行目: 1行目:
 
{{Lowercase title}}
 
{{Lowercase title}}
 
[[Category:Domain Name System]]
 
[[Category:Domain Name System]]
  +
[[de:Dnsmasq]]
 
[[en:Dnsmasq]]
 
[[en:Dnsmasq]]
 
[[es:Dnsmasq]]
 
[[es:Dnsmasq]]
[[it:Dnsmasq]]
 
 
[[pt:Dnsmasq]]
 
[[pt:Dnsmasq]]
[[ru:Dnsmasq]]
+
[[zh-hans:Dnsmasq]]
[[zh-CN:Dnsmasq]]
 
 
{{Lowercase_title}}
 
{{Lowercase_title}}
  +
dnsmasq は、[[Wikipedia:ja:DNSサーバ|DNS サーバー]]、[[Wikipedia:ja:DHCPv6|DHCPv6]] と [[Wikipedia:ja:Preboot Execution Environment|PXE]] をサポートする [[Wikipedia:ja:Dynamic Host Configuration Protocol|DHCP サーバー]] および [[Wikipedia:ja:Trivial File Transfer Protocol|TFTP サーバー]] を提供します。また、dnsmasq は DNS クエリをキャッシュし、過去に訪問したことのあるサイトへの DNS 検索速度を向上させるように設定することができます。
 
[http://www.thekelleys.org.uk/dnsmasq/doc.html dnsmasq] は DNS キャッシュと DHCP サーバーとしてのサービスを提供します。ドメインネームサーバ (DNS) としては DNS クエリをキャッシュすることで以前に訪れたことのあるサイトへの接続速度を向上させることができ、DHCP サーバーとして dnsmasq は LAN 上のコンピュータに内部 IP アドレスとルートを割り当てるのに使えます。サービスのどちらか、または両方として役立てることが可能です。dnsmasq は軽量で設定が簡単です。個人のコンピュータでの利用や、50以下のコンピュータが繋がったネットワークでの使用を想定して作られています。また、[[PXE]] サーバーも含まれています。
 
   
 
== インストール ==
 
== インストール ==
   
[[公式リポジトリ]]から {{Pkg|dnsmasq}} を[[pacman|インストール]]してください
+
{{Pkg|dnsmasq}} パッケージ [[インストール]] します。次に、{{ic|dnsmasq.service}} を [[起動/有効化]] ます
  +
  +
DHCP クライアントが新しい {{ic|/etc/resolv.conf}} を作成できるように、ネットワークを再起動する必要があります。
   
 
== 設定 ==
 
== 設定 ==
   
dnsmasq を設定するには {{ic|/etc/dnsmasq.conf}} を編集する必要があります。ファイルにはオプションに関して詳しいコメントが付いています。
+
dnsmasq を設定するには{{ic|/etc/dnsmasq.conf}} を編集ます。 ファイルにはオプションを説明するコメントが含まれています。 利用可能なすべてのオプションについては {{man|8|dnsmasq}} を参照してください
   
{{Warning|dnsmasq デフォルトで DNS サーバー有効にます。DNS サーバーが不場合、DNS ポートを {{ic|0}} 設定して明示的に無効する必要があります:
+
{{Note|dnsmasq デフォルト設定は、 DNS サーバー有効になります。 ない場合、{{ic|1=port=0}} 設定することで明示的に無効する必要があります
{{hc|/etc/dnsmasq.conf|2=port=0}}
 
}}
 
   
  +
dnsmasq をローカル DNS リゾルバとして使用しない場合は、{{ic|nss-lookup.target}} をプルインしないように [https://wiki.archlinux.jp/index.php/Systemd#.E3.83.A6.E3.83.8B.E3.83.83.E3.83.88.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB.E3.81.AE.E7.B7.A8.E9.9B.86 編集]{{ic|dnsmasq.service}}} して下さい。
{{Tip|設定ファイルをチェックしたい場合、次のコマンドを実行してください: {{ic|$ dnsmasq --test}}。}}
 
   
  +
{{hc|/etc/systemd/system/dnsmasq.service.d/no-nss-lookup-target.conf|2=
== DNS キャッシュの設定 ==
 
  +
[Unit]
  +
Wants=
  +
}}
   
  +
}}
単一のコンピュータ上で dnsmasq を DNS キャッシュデーモンとしてセットアップするには {{ic|/etc/dnsmasq.conf}} を編集して {{ic|listen-address}} ディレクティブをアンコメントし、ローカルホストの IP アドレスを追記してください:
 
   
  +
{{Tip|設定ファイルの構文をチェックするには、以下を実行します:
listen-address=127.0.0.1
 
  +
$ dnsmasq --test
  +
}}
   
  +
=== DNS サーバー ===
ネットワーク上の他のコンピュータのために LAN の IP アドレスを受信するようにするには:
 
   
  +
dnsmasq を1台のコンピュータで DNS キャッシュデーモンとして設定するには、 {{ic|listen-address}} ディレクティブでローカルホストの IP アドレスを追加してください。
listen-address=192.168.1.1 # Example IP
 
   
  +
listen-address=::1,127.0.0.1
この場合は LAN の固定 ip を使用することが推奨されます。
 
   
  +
このコンピュータを使用して、ネットワーク上の他のコンピュータの LAN IP アドレスをリッスンします。この場合、静的 LAN IP を使用することをお勧めします。例
複数 IP アドレスの設定:
 
   
listen-address=127.0.0.1,192.168.1.1
+
listen-address=::1,127.0.0.1,192.168.1.1
   
  +
キャッシュされるドメイン名の数を {{ic|1=cache-size=''size''}} で設定します(デフォルトは {{ic|150}} で、ハードリミットは {{ic|10000}} です。)
=== DNS アドレスファイル ===
 
   
  +
cache-size=1000
dnsmasq を設定した後は、DHCP クライアントが {{ic|/etc/resolv.conf}} にある既知の DNS アドレスの前にローカルホストのアドレスを挿入させるようにする必要があります。これによって外部の DNS でクエリを解決しようとする前に全てのクエリが dnsmasq に送られるようになります。DHCP クライアントを設定した後は変更を適用するためにネットワークを再起動してください。
 
   
  +
[[DNSSEC]] の検証には、{{Pkg|dnsmasq}} パッケージが提供する DNSSEC トラストアンカーを読み込み、オプション {{ic|dnssec}} を設定します。
==== resolv.conf ====
 
   
  +
conf-file=/usr/share/dnsmasq/trust-anchors.conf
まず一つ目の選択肢は {{ic|resolv.conf}} の設定です。これを使うには、{{ic|/etc/resolv.conf}} の一番上のネームサーバをローカルホストに変えて下さい:
 
  +
dnssec
   
  +
使いたいオプションは {{man|8|dnsmasq}} を参照してください。
{{hc|/etc/resolv.conf|
 
nameserver 127.0.0.1
 
# External nameservers
 
...
 
}}
 
   
  +
==== DNS アドレスファイル ====
これで DNS クエリは最初に dnsmasq によって解決されるようになります。dnsmasq がクエリを解決できなかった場合にのみ外部のサーバーが使用されます。残念ながら、{{Pkg|dhcpcd}} はデフォルトで {{ic|/etc/resolv.conf}} を上書きするようになっているので、DHCP を使っている場合は {{ic|/etc/resolv.conf}} を保護すると良いでしょう。保護するには、dhcpcd の設定ファイルに {{ic|nohook resolv.conf}} を追加してください:
 
   
  +
dnsmasq を設定した後は、DHCP クライアントが {{ic|/etc/resolv.conf}} にある既知の DNS アドレスの前にローカルホストのアドレスを挿入させるようにする必要があります。これによって外部の DNS でクエリを解決しようとする前に全てのクエリが dnsmasq に送られるようになります。DHCP クライアントを設定した後は変更を適用するためにネットワークを再起動してください。
{{hc|/etc/dhcpcd.conf|
 
...
 
nohook resolv.conf}}
 
   
  +
===== openresolv =====
resolv.conf の書き込みを保護することも可能です:
 
# chattr +i /etc/resolv.conf
 
   
  +
ネットワークマネージャが ''resolvconf'' をサポートしていれば、{{ic|/etc/resolv.conf}} を直接変更する代わりに、 [[openresolv]] を使って [https://roy.marples.name/projects/openresolv/configuration/ dnsmasq の設定ファイルを生成] することができます。
===== 3つ以上のネームサーバ =====
 
   
  +
{{ic|/etc/resolvconf.conf}} を編集し、ループバックアドレスをネームサーバとして追加し、dnsmasq 設定を書き出すように openresolv を設定します。
Linux による DNS クエリの処理には {{ic|resolv.conf}} で使えるネームサーバは3つまでという制約があります。対応策として、{{ic|resolv.conf}} にはローカルホストのネームサーバだけを記述して、外部のネームサーバ用に {{ic|resolv-file}} を分けて作成する方法があります。まず、dnsmasq のための resolv ファイルを新しく作成してください:
 
   
{{hc|/etc/resolv.dnsmasq.conf|
+
{{hc|/etc/resolvconf.conf|2=
  +
# Use the local name server
# Google's nameservers, for example
 
  +
name_servers="::1 127.0.0.1"
nameserver 8.8.8.8
 
  +
resolv_conf_options="trust-ad"
nameserver 8.8.4.4
 
}}
 
 
それから {{ic|/etc/dnsmasq.conf}} を新しい resolv ファイルを使用するように編集してください:
 
   
  +
# Write out dnsmasq extended configuration and resolv files
{{hc|/etc/dnsmasq.conf|
 
  +
dnsmasq_conf=/etc/dnsmasq-conf.conf
...
 
resolv-file=/etc/resolv.dnsmasq.conf
+
dnsmasq_resolv=/etc/dnsmasq-resolv.conf
...
 
 
}}
 
}}
   
  +
{{ic|resolvconf-u}} を実行して、設定ファイルを作成します。ファイルが存在しない場合、{{ic|dnsmasq.service}} は起動に失敗します。
==== dhcpcd ====
 
   
  +
dnsmasq の設定ファイルを編集して、openresolv が生成した設定を使用します [https://roy.marples.name/projects/openresolv/configuration/resolvers/dnsmasq/]
[[dhcpcd|dhcpcd]] には {{ic|/etc/resolv.conf}} にネームサーバを前と後ろに追加する機能があります。それぞれ {{ic|/etc/resolv.conf.head}} と {{ic|/etc/resolv.conf.tail}} ファイルを作成します:
 
   
  +
# Read configuration generated by openresolv
echo "nameserver 127.0.0.1" > /etc/resolv.conf.head
 
  +
conf-file=/etc/dnsmasq-conf.conf
  +
resolv-file=/etc/dnsmasq-resolv.conf
   
==== dhclient ====
+
===== 手動転送 =====
   
  +
まず、{{ic|/etc/resolv.conf}} でネームサーバーとして localhost のアドレスのみを設定する必要があります。
{{Pkg|dhclient}} の場合、{{ic|/etc/dhclient.conf}} の以下の部分をアンコメントしてください:
 
   
  +
{{hc|/etc/resolv.conf|
prepend domain-name-servers 127.0.0.1;
 
  +
nameserver ::1
  +
nameserver 127.0.0.1
  +
options trust-ad
  +
}}
   
  +
[[ドメイン名前解決#/etc/resolv.conf の書き込み保護]] の説明に従って、{{ic|/etc/resolv.conf}} を上書きから保護していることを確認してください。
=== NetworkManager ===
 
   
  +
その後、dnsmasq の設定ファイルに {{ic|1=server=''server_address''}} として上流の DNS サーバのアドレスを指定する必要があります。また、{{ic|/etc/resolv.conf}} を読み込んで、dnsmasq が自分自身のローカルホストのアドレスだけを読み込むことがないように、{{ic|no-resolv}} を追加してください。
[[NetworkManager]] には dnsmasq を使って DNS を有効化するプラグインがあります。DNS ルックアップがキャッシュされることにより、解決時間が短くなったり、VPN ホストの DNS ルックアップを該当する VPS の DNS サーバーに転送することができます (複数の VPN に接続する場合に特に有用です)。
 
   
  +
{{hc|/etc/dnsmasq.conf|2=
{{Pkg|dnsmasq}} がインストールされていること、ただし無効化されていることを確認してください。それから、{{ic|/etc/NetworkManager/NetworkManager.conf}} を編集して {{ic|[main]}} セクションの {{ic|dns}} を変更してください:
 
  +
[...]
  +
no-resolv
   
  +
# Google's nameservers, for example
{{hc|/etc/NetworkManager/NetworkManager.conf|<nowiki>
 
  +
server=8.8.8.8
[main]
 
...
+
server=8.8.4.4
  +
}}
dns=dnsmasq
 
</nowiki>}}
 
   
  +
これでDNSクエリは dnsmasq で解決され、キャッシュからクエリに答えられない場合のみ外部サーバをチェックするようになります。
NetworkManager を再起動するかマシンを再起動してください。NetworkManager は自動的に dnsmasq を起動して 127.0.0.1 を {{ic|/etc/resolv.conf}} に追加します。実際の DNS サーバーは {{ic|/run/NetworkManager/resolv.conf}} で確認できます。({{Pkg|bind-tools}} でインストールできる) {{ic|$ dig example.com}} を使って何回か DNS ルックアップを実行してみて dnsmasq が使われていることを確認してください。
 
   
==== カスタム設定 ====
+
==== カスタムドメインの追加 ====
   
  +
(ローカル) ネットワークの hosts にカスタムドメインを追加することができます:
{{ic|/etc/NetworkManager/dnsmasq.d/}} にカスタム設定ファイルを作成することで ''dnsmasq'' のためのカスタム設定を作ることができます。例えば、DNS キャッシュの容量を変更するには (RAM に保存されます):
 
  +
local=/home.lan/
  +
domain=home.lan
   
  +
この例では {{ic|hostname.home.lan}} を (hosts ファイルに定義されている) ホスト/デバイスとして ping できます。
{{hc|/etc/NetworkManager/dnsmasq.d/cache.conf|2=cache-size=1000}}
 
 
==== IPv6 ====
 
   
  +
hosts エントリにカスタムドメインを追加するには {{ic|expand-hosts}} をアンコメントしてください:
NetworkManager で {{ic|dnsmasq}} を有効にすると IPv6 の DNS ルックアップ ({{ic|dig -6 [hostname]}}) が出来なくなります。この問題を解決するには、以下のファイルを作成して IPv6 のループバックも受信するように ''dnsmasq'' を設定します:
 
  +
expand-hosts
 
  +
この設定を使わない場合、{{ic|/etc/hosts}} のエントリにドメインを追加する必要があります。
{{hc|/etc/NetworkManager/dnsmasq.d/ipv6_listen.conf|2=
 
listen-address=::1
 
}}
 
さらに、{{ic|dnsmasq}} は上流の IPv6 DNS を優先させません。残念ながら NetworkManager では優先させることが出来ないようです ([https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/936712 Ubuntu Bug])。NetworkManager の設定で IPv4 の DNS を無効化するのが回避策になります。
 
 
==== 他の方法 ====
 
 
他にも NetworkManager のアプレットを使って設定を手動で入力する方法もあります (通常はアプレットを右クリックします)。設定方法は使用しているフロントエンドの種類によりますが、基本的には、アプレットを右クリックして、プロファイルを編集(または作成)し、DHCP タイプとして 'Automatic (specify addresses)' を選択します。DNS アドレスは次のような形式で入力する必要があります: {{ic|127.0.0.1, DNS-server-one, ...}}。
 
   
=== テスト ===
+
==== テスト ====
   
ルックアップの速度をテストするには、dnsmasq を起動してから訪れたことのないウェブサイトを選択してください ({{ic|dig}} は {{Pkg|bind-tools}} パッケージに入っています):
+
dnsmasq を起動してから一度も問していないウェブサイトを選択して、検索速度をテストします(''drill''は {{Pkg|ldns}}パッケージの一部です)
   
$ dig archlinuxjp.org | grep "Query time"
+
$ drill archlinux.org | grep "Query time"
   
dnsmasq を正しく設定していれば、このコマンドを二回目に実行するとキャッシュされた DNS IP が使用され、ルックアップの時間速くなっているはずで:
+
再度コマンドを実行するとキャッシュされた DNS IP が使用され、dnsmasq が正しく設定されていれば、検索時間はより速くなりま
   
{{hc|<nowiki>$ dig archlinuxjp.org | grep "Query time"</nowiki>|
+
{{hc|$ drill archlinux.org {{!}} grep "Query time"|
 
;; Query time: 18 msec
 
;; Query time: 18 msec
 
}}
 
}}
   
{{hc|<nowiki>$ dig archlinuxjp.org | grep "Query time"</nowiki>|
+
{{hc|$ drill archlinux.org {{!}} grep "Query time"|
 
;; Query time: 2 msec
 
;; Query time: 2 msec
 
}}
 
}}
   
  +
DNSSEC の検証が機能しているかどうかを調べるには、[[DNSSEC#テスト]] をご覧ください。
== DHCP サーバーの設定 ==
 
   
  +
=== DHCP サーバー ===
デフォルトで dnsmasq の DHCP 機能は無効にされているため、使用したいときは {{ic|/etc/dnsmasq.conf}} で有効にする必要があります。以下は中心となる設定です:
 
   
  +
dnsmasq はデフォルトでは DHCP 機能がオフになっていますので、使用したい場合はオンにする必要があります。 以下、重要な設定項目です。
{{bc|<nowiki>
 
# 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>
 
   
  +
{{bc|1=
# dnsmasq will open tcp/udp port 53 and udp port 67 to world to help with
 
  +
# Only listen to routers' LAN NIC. Doing so opens up tcp/udp port 53 to localhost and udp port 67 to world:
# dynamic interfaces (assigning dynamic ips). Dnsmasq will discard world
 
  +
interface=''enp0s0''
# requests to them, but the paranoid might like to close them and let the
 
  +
# kernel handle them:
 
  +
# 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
 
bind-interfaces
   
  +
# Optionally set a domain name
# Dynamic range of IPs to make available to LAN pc
 
  +
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
 
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
# If you’d like to have dnsmasq assign static IPs, bind the LAN computer's
 
  +
dhcp-range=::f,::ff,constructor:''enp0s0''
# NIC MAC address:
 
  +
  +
# 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:dd:ee:ff,192.168.111.50
  +
dhcp-host=aa:bb:cc:ff:dd:ee,192.168.111.51}}
</nowiki>}}
 
  +
  +
その他のオプションについては {{man|8|dnsmasq}} を参照してください。
  +
  +
==== プロキシDHCP ====
  +
  +
ネットワーク上にすでに DHCP サーバーがあり、それと相互運用したい場合、dnsmasq を ''プロキシ DHCP'' として動作させ、[[#PXEサーバー]] 固有の情報のみをクライアントに提供するように設定することが可能です。このモードは IPv4 でのみ利用可能です。以下の構文を使用し、既存の DHCP サーバーのアドレスを指定します。
  +
dhcp-range=192.168.0.1,proxy
  +
  +
==== テスト ====
   
  +
dnsmasq がインストールされているコンピュータに接続し、DHCP を使用して IP アドレスを自動的に割り当てるように設定し、ネットワークに正常にログインできるか試します。
=== テスト ===
 
   
  +
サーバ上の {{ic|/var/lib/misc/dnsmasq.leases}} ファイルを調査すると、リースが確認できるはずです。
dnsmasq が動いているコンピュータに接続されたコンピュータから、DHCP を使って IP アドレスを自動的に割り当てるように設定し、ネットワークに通常通りにログインしてください。
 
   
== TFTP サーバーの設定 ==
+
=== TFTP サーバーの設定 ===
   
 
転送ファイルを保存する TFTP のルートディレクトリ (例: {{ic|/srv/tftp}}) を作成してください。
 
転送ファイルを保存する TFTP のルートディレクトリ (例: {{ic|/srv/tftp}}) を作成してください。
183行目: 200行目:
 
</nowiki>}}
 
</nowiki>}}
   
== PXE の設定 ==
+
=== PXE の設定 ===
   
 
PXE を使うには DHCP と TFTP サーバーが必要ですが、どちらの機能も dnsmasq によって提供されています.
 
PXE を使うには DHCP と TFTP サーバーが必要ですが、どちらの機能も dnsmasq によって提供されています.
218行目: 235行目:
 
後はブートローダー次第です。
 
後はブートローダー次第です。
   
== デーモの起動 ==
+
== トとテクニック ==
 
{{ic|dnsmasq.service}} を[[起動]]・[[有効化]]してください。
 
 
dnsmasq が正しく起動したか確認するには、システムの journal をチェック:
 
 
{{bc|$ journalctl -u dnsmasq}}
 
 
DHCP クライアントが {{ic|/etc/resolv.conf}} を新しく作成できるようにネットワークの再起動も必要です。
 
 
== Tips and tricks ==
 
   
 
=== OpenDNS が Google へのクエリをリダイレクトするのを止める ===
 
=== OpenDNS が Google へのクエリをリダイレクトするのを止める ===
234行目: 241行目:
 
OpenDNS が全ての Google クエリを OpenDNS の検索サーバーにリダイレクトを止めさせるには、以下を {{ic|/etc/dnsmasq.conf}} に追加してください:
 
OpenDNS が全ての Google クエリを OpenDNS の検索サーバーにリダイレクトを止めさせるには、以下を {{ic|/etc/dnsmasq.conf}} に追加してください:
 
{{bc|1=server=/www.google.com/<ISP DNS IP>}}
 
{{bc|1=server=/www.google.com/<ISP DNS IP>}}
 
=== リースを表示する ===
 
{{bc|$ cat /var/lib/misc/dnsmasq.leases}}
 
 
=== カスタムドメインの追加 ===
 
(ローカル) ネットワークの hosts にカスタムドメインを追加することができます:
 
local=/home.lan/
 
domain=home.lan
 
 
この例では {{ic|hostname.home.lan}} を (hosts ファイルに定義されている) ホスト/デバイスとして ping できます。
 
 
hosts エントリにカスタムドメインを追加するには {{ic|expand-hosts}} をアンコメントしてください:
 
expand-hosts
 
この設定を使わない場合、{{ic|/etc/hosts}} のエントリにドメインを追加する必要があります。
 
   
 
=== アドレスの上書き ===
 
=== アドレスの上書き ===
275行目: 268行目:
   
 
{{Note|[[libvirt]] では上記がデフォルトです。}}
 
{{Note|[[libvirt]] では上記がデフォルトです。}}
  +
  +
=== ドメインのブロックリスト化 ===
  +
  +
ドメインをブロックリスト化する、つまり NXDOMAIN でドメインに対するクエリに答えるには、IP アドレスを指定せずに {{ic|address}} オプションを使用します:
  +
  +
address=/blocked.example/
  +
address=/anotherblocked.example/
  +
  +
{{Note|{{ic|/etc/hosts}} ファイルとは異なり、dnsmasq はこれらのドメインと、''subdomain.blocked.example'' などのすべてのサブドメインをブロックします。}}
  +
  +
ワイルドカードもサポートされています。パターンの先頭に {{ic|*}} を追加します:
  +
  +
# blocks both ''blocked.example'' and ''anotherblocked.example'' and all their subdomains
  +
address=/*blocked.example/
  +
  +
# blocks subdomains like ''mail.google.com'' but not ''google.com''
  +
address=/*.google.com/
  +
  +
一部の特定のサブドメインは、サーバーアドレスとして {{ic|#}} を使用してブロックを解除できます:
  +
  +
# blocks ''google.com'' and all subdomains except ''mail.google.com''.
  +
address=/google.com/
  +
server=/mail.google.com/#
  +
  +
{{Note|
  +
* オプション {{ic|1=address=/example.com/}} と {{ic|1=server=/example.com/}} は等価です。どちらも NXDOMAIN でクエリに答えます。
  +
* {{ic|1=address=/example.com/#}} と {{ic|1=server=/example.com/#}} は等価ではありません。
  +
** {{ic|1=address=/example.com/#}} は、NULL アドレス (0.0.0.0 または IPv6 の ::) を持つドメインに対するクエリに応答します。
  +
** {{ic|1=server=/example.com/#}} は、ドメインに対するクエリを、標準設定されているサーバーに送ります。
  +
* パターン {{ic|/example.com/}} と {{ic|/.example.com/}} は等価です。どちらも ''example.com'' とそのすべてのサブドメインにマッチします。
  +
}}
  +
  +
使いやすいようにブロックリストを別のファイル、例えば {{ic|/etc/dnsmasq.d/blocklist.conf}} に置き、{{ic|/etc/dnsmasq.conf}} から {{ic|1=conf-file=/etc/dnsmasq.d/blocklist.conf}} または {{ic|1=conf-dir=/etc/dnsmasq.d/,*.conf}} でロードします。
  +
  +
{{Tip|
  +
* [https://github.com/openwrt/packages/blob/master/net/adblock/files/README.md OpenWrt の広告ブロックパッケージの README] にリストがあります。
  +
* hostsファイルのブロックリストは {{ic|1=addn-hosts=hosts.txt}} オプションで使うこともできますし、以下の awk コマンドで dnsmasq ブロックリストに変換することもできます: {{ic|1=awk '/^[^#]/ { print "address=/"$2"/"$1"" }' hosts.txt}}
  +
}}
   
 
== 参照 ==
 
== 参照 ==

2023年11月27日 (月) 01:07時点における最新版

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>

アドレスの上書き

キャプティブポータルを使用する場合など、特定の場面では特定のドメインをハードコードされたアドレスセットに解決するのが役に立つ場合があります。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/hosts ファイルとは異なり、dnsmasq はこれらのドメインと、subdomain.blocked.example などのすべてのサブドメインをブロックします。

ワイルドカードもサポートされています。パターンの先頭に * を追加します:

# blocks both blocked.example and anotherblocked.example and all their subdomains
address=/*blocked.example/

# blocks subdomains like mail.google.com but not google.com
address=/*.google.com/

一部の特定のサブドメインは、サーバーアドレスとして # を使用してブロックを解除できます:

# blocks google.com and all subdomains except mail.google.com.
address=/google.com/
server=/mail.google.com/#
ノート:
  • オプション address=/example.com/server=/example.com/ は等価です。どちらも NXDOMAIN でクエリに答えます。
  • address=/example.com/#server=/example.com/# は等価ではありません。
    • address=/example.com/# は、NULL アドレス (0.0.0.0 または IPv6 の ::) を持つドメインに対するクエリに応答します。
    • server=/example.com/# は、ドメインに対するクエリを、標準設定されているサーバーに送ります。
  • パターン /example.com//.example.com/ は等価です。どちらも example.com とそのすべてのサブドメインにマッチします。

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

ヒント:
  • OpenWrt の広告ブロックパッケージの README にリストがあります。
  • hostsファイルのブロックリストは addn-hosts=hosts.txt オプションで使うこともできますし、以下の awk コマンドで dnsmasq ブロックリストに変換することもできます: awk '/^[^#]/ { print "address=/"$2"/"$1"" }' hosts.txt

参照