「Dnsmasq」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) →DNS キャッシュの設定: 項目を追加 |
カテゴリを追加 |
||
| (5人の利用者による、間の29版が非表示) | |||
| 1行目: | 1行目: | ||
{{Lowercase title}} |
|||
[[Category:Domain Name System]] |
|||
[[Category:ドメインネームシステム]] |
|||
[[Category:DHCP]] |
|||
[[de:Dnsmasq]] |
|||
[[en:Dnsmasq]] |
[[en:Dnsmasq]] |
||
[[es:Dnsmasq]] |
[[es:Dnsmasq]] |
||
[[it:Dnsmasq]] |
|||
[[pt:Dnsmasq]] |
[[pt: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 検索速度を向上させるように設定することができます。 |
|||
'''dnsmasq''' は DNS キャッシュと DHCP サーバーとしてのサービスを提供します。ドメインネームサーバ (DNS) としては DNS クエリをキャッシュすることで以前に訪れたことのあるサイトへの接続速度を向上させることができ、DHCP サーバーとしては {{Pkg|dnsmasq}} は LAN 上のコンピュータに内部 IP アドレスとルートを割り当てるのに使えます。サービスのどちらか、または両方として役立てることが可能です。dnsmasq は軽量で設定が簡単です。個人のコンピュータでの利用や、50以下のコンピュータが繋がったネットワークでの使用を想定して作られています。また、[[PXE]] サーバーも含まれています。 |
|||
== インストール == |
== インストール == |
||
{{Pkg|dnsmasq}} パッケージを [[インストール]] します。次に、{{ic|dnsmasq.service}} を [[起動/有効化]] します。 |
|||
DHCP クライアントが新しい {{ic|/etc/resolv.conf}} を作成できるように、ネットワークを再起動する必要があります。 |
|||
== DNS キャッシュの設定 == |
|||
== 設定 == |
|||
単一のコンピュータ上で dnsmasq を DNS キャッシュデーモンとしてセットアップするには {{ic|/etc/dnsmasq.conf}} を編集して {{ic|listen-address}} ディレクティブをアンコメントし、ローカルホストの IP アドレスを追記してください: |
|||
dnsmasq を設定するには、{{ic|/etc/dnsmasq.conf}} を編集します。 ファイルにはオプションを説明するコメントが含まれています。 利用可能なすべてのオプションについては {{man|8|dnsmasq}} を参照してください。 |
|||
listen-address=127.0.0.1 |
|||
{{Note|dnsmasq のデフォルト設定では、 DNS サーバーが有効になります。 必要ない場合は、{{ic|1=port=0}} を設定することで明示的に無効にする必要があります。 |
|||
ネットワーク上の他のコンピュータのために LAN の IP アドレスを受信するようにするには: |
|||
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}}} して下さい。 |
|||
listen-address=192.168.1.1 # Example IP |
|||
{{hc|/etc/systemd/system/dnsmasq.service.d/no-nss-lookup-target.conf|2= |
|||
この場合は LAN の固定 ip を使用することが推奨されます。 |
|||
[Unit] |
|||
Wants= |
|||
}} |
|||
}} |
|||
複数 IP アドレス設定: |
|||
{{Tip|設定ファイルの構文をチェックするには、以下を実行します: |
|||
listen-address=127.0.0.1,192.168.1.1 |
|||
$ dnsmasq --test |
|||
}} |
|||
=== DNS |
=== DNS サーバー === |
||
dnsmasq を1台のコンピュータで DNS キャッシュデーモンとして設定するには、 {{ic|listen-address}} ディレクティブでローカルホストの IP アドレスを追加してください。 |
|||
dnsmasq を設定した後は、DHCP クライアントが {{ic|/etc/resolv.conf}} にある既知の DNS アドレスの前にローカルホストのアドレスを挿入させるようにする必要があります。これによって外部の DNS でクエリを解決しようとする前に全てのクエリが dnsmasq に送られるようになります。DHCP クライアントを設定した後は変更を適用するためにネットワークを再起動してください。 |
|||
listen-address=::1,127.0.0.1 |
|||
==== resolv.conf ==== |
|||
このコンピュータを使用して、ネットワーク上の他のコンピュータの LAN IP アドレスをリッスンします。この場合、静的 LAN IP を使用することをお勧めします。例 |
|||
まず一つ目の選択肢は {{ic|resolv.conf}} の設定です。これを使うには、{{ic|/etc/resolv.conf}} の一番上のネームサーバをローカルホストに変えて下さい: |
|||
listen-address=::1,127.0.0.1,192.168.1.1 |
|||
{{hc|/etc/resolv.conf| |
|||
nameserver 127.0.0.1 |
|||
# External nameservers |
|||
... |
|||
}} |
|||
あるいは、ネットワークインターフェイスを割り当てることもできます。 |
|||
これで DNS クエリは最初に dnsmasq によって解決されるようになります。dnsmasq がクエリを解決できなかった場合にのみ外部のサーバーが使用されます。残念ながら、{{Pkg|dhcpcd}} はデフォルトで {{ic|/etc/resolv.conf}} を上書きするようになっているので、DHCP を使っている場合は {{ic|/etc/resolv.conf}} を保護すると良いでしょう。保護するには、dhcpcd の設定ファイルに {{ic|nohook resolv.conf}} を追加してください: |
|||
interface=enp5s0 |
|||
{{hc|/etc/dhcpcd.conf| |
|||
... |
|||
nohook resolv.conf}} |
|||
キャッシュされるドメイン名の数を {{ic|1=cache-size=''size''}} で設定します(デフォルトは {{ic|150}} です。) |
|||
resolv.conf の書き込みを保護することも可能です: |
|||
# chattr +i /etc/resolv.conf |
|||
cache-size=10000 |
|||
===== 3つ以上のネームサーバ ===== |
|||
[[DNSSEC]] の検証には、{{Pkg|dnsmasq}} パッケージが提供する DNSSEC トラストアンカーを読み込み、オプション {{ic|dnssec}} を設定します。 |
|||
Linux による DNS クエリの処理には {{ic|resolv.conf}} で使えるネームサーバは3つまでという制約があります。対応策として、{{ic|resolv.conf}} にはローカルホストのネームサーバだけを記述して、外部のネームサーバ用に {{ic|resolv-file}} を分けて作成する方法があります。まず、dnsmasq のための resolv ファイルを新しく作成してください: |
|||
conf-file=/usr/share/dnsmasq/trust-anchors.conf |
|||
dnssec |
|||
# Google's nameservers, for example |
|||
nameserver 8.8.8.8 |
|||
nameserver 8.8.4.4 |
|||
}} |
|||
使いたいオプションは {{man|8|dnsmasq}} を参照してください。 |
|||
==== DNS アドレスファイルと転送 ==== |
|||
{{hc|/etc/dnsmasq.conf| |
|||
... |
|||
resolv-file=/etc/resolv.dnsmasq.conf |
|||
... |
|||
}} |
|||
dnsmasqを設定した後、{{ic|/etc/resolv.conf}} にローカルホストアドレスを唯一のネームサーバーとして追加する必要があります。これにより、すべてのクエリが dnsmasq に送信されるようになります。 |
|||
==== dhcpcd ==== |
|||
dnsmasq はスタブリゾルバであり、リカーシブリゾルバではないため、外部 DNS サーバーへの転送を設定する必要があります。これは、[[openresolv]] を使用して自動的に行うか、dnsmasq の設定で DNS サーバーアドレスを手動で指定することで実行できます。 |
|||
[[dhcpcd|dhcpcd]] には {{ic|/etc/resolv.conf}} にネームサーバを前と後ろに追加する機能があります。それぞれ {{ic|/etc/resolv.conf.head}} と {{ic|/etc/resolv.conf.tail}} ファイルを作成します: |
|||
===== openresolv ===== |
|||
echo "nameserver 127.0.0.1" > /etc/resolv.conf.head |
|||
ネットワークマネージャが ''resolvconf'' をサポートしていれば、{{ic|/etc/resolv.conf}} を直接変更する代わりに、 [[openresolv]] を使って [https://roy.marples.name/projects/openresolv/configuration/ dnsmasq の設定ファイルを生成] することができます。 |
|||
==== dhclient ==== |
|||
{{ic|/etc/resolvconf.conf}} を編集し、ループバックアドレスをネームサーバとして追加し、dnsmasq 設定を書き出すように openresolv を設定します。 |
|||
{{Pkg|dhclient}} の場合、{{ic|/etc/dhclient.conf}} の以下の部分をアンコメントしてください: |
|||
{{hc|/etc/resolvconf.conf|2= |
|||
prepend domain-name-servers 127.0.0.1; |
|||
# 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 |
|||
==== NetworkManager ==== |
|||
dnsmasq_conf=/etc/dnsmasq-conf.conf |
|||
dnsmasq_resolv=/etc/dnsmasq-resolv.conf |
|||
}} |
|||
{{ic|resolvconf-u}} を実行して、設定ファイルを作成します。ファイルが存在しない場合、{{ic|dnsmasq.service}} は起動に失敗します。 |
|||
[[NetworkManager]] は設定ファイルから ''dnsmasq'' を起動することができます。{{ic|NetworkManager.conf}} の {{ic|[main]}} セクションに {{ic|1=dns=dnsmasq}} オプションを追加し、{{ic|dnsmasq.service}} が [[systemd]] によってロードされないように無効化してください: |
|||
dnsmasq の設定ファイルを編集して、openresolv が生成した設定を使用します [https://roy.marples.name/projects/openresolv/configuration/resolvers/dnsmasq/] |
|||
{{hc|/etc/NetworkManager/NetworkManager.conf|<nowiki> |
|||
[main] |
|||
plugins=keyfile |
|||
dns=dnsmasq |
|||
</nowiki>}} |
|||
# Read configuration generated by openresolv |
|||
{{ic|/etc/NetworkManager/dnsmasq.d/}} にカスタム設定ファイルを作成することで ''dnsmasq'' のためのカスタム設定を作ることができます。例えば、DNS キャッシュの容量を変更するには (RAM に保存されます): |
|||
conf-file=/etc/dnsmasq-conf.conf |
|||
resolv-file=/etc/dnsmasq-resolv.conf |
|||
===== 手動転送 ===== |
|||
{{hc|/etc/NetworkManager/dnsmasq.d/cache|2= |
|||
cache-size=1000 |
|||
まず、{{ic|/etc/resolv.conf}} でネームサーバーとして localhost のアドレスのみを設定する必要があります。 |
|||
{{hc|/etc/resolv.conf| |
|||
nameserver ::1 |
|||
nameserver 127.0.0.1 |
|||
options trust-ad |
|||
}} |
}} |
||
[[ドメイン名前解決#/etc/resolv.conf の書き込み保護]] の説明に従って、{{ic|/etc/resolv.conf}} を上書きから保護していることを確認してください。 |
|||
{{ic|NetworkManager}} によって ''dnsmasq'' が起動されると、デフォルトの設定ファイルの代わりにこのディレクトリにある設定ファイルが使われます。 |
|||
その後、dnsmasq の設定ファイルに {{ic|1=server=''server_address''}} として上流の DNS サーバのアドレスを指定する必要があります。また、{{ic|/etc/resolv.conf}} を読み込んで、dnsmasq が自分自身のローカルホストのアドレスだけを読み込むことがないように、{{ic|no-resolv}} を追加してください。 |
|||
{{Tip|この方法では特定のドメインで DNS のカスタム設定を有効にすることができます。例えば: {{ic|server=/example1.com/example2.com/xx.xxx.xxx.x}} は {{ic|example1.com, example2.com}} というウェブサイトを見ている時だけ最初の DNS アドレスを {{ic|xx.xxx.xxx.xx}} に変更します。速度や安定性、プライバシーやセキュリティが欠けている特定の DNS ネームサーバを使うときはこの方法をグローバルな DNS 設定にすることを推奨します。}} |
|||
{{hc|/etc/dnsmasq.conf|2= |
|||
==== IPv6 ==== |
|||
[...] |
|||
no-resolv |
|||
# Google's nameservers, for example |
|||
NetworkManager で {{ic|dnsmasq}} を有効にすると IPv6 の DNS ルックアップ ({{ic|dig -6 [hostname]}}) が出来なくなります。この問題を解決するには、以下のファイルを作成して IPv6 のループバックも受信するように ''dnsmasq'' を設定します: |
|||
server=8.8.8.8 |
|||
server=8.8.4.4 |
|||
}} |
|||
これでDNSクエリは dnsmasq で解決され、キャッシュからクエリに答えられない場合のみ外部サーバをチェックするようになります。 |
|||
{{hc|/etc/NetworkManager/dnsmasq.d/ipv6_listen.conf|2= |
|||
listen-address=::1 |
|||
==== カスタムドメインの追加 ==== |
|||
(ローカル) ネットワークの hosts にカスタムドメインを追加することができます: |
|||
local=/home.lan/ |
|||
domain=home.lan |
|||
この例では {{ic|hostname.home.lan}} を (hosts ファイルに定義されている) ホスト/デバイスとして ping できます。 |
|||
hosts エントリにカスタムドメインを追加するには {{ic|expand-hosts}} をアンコメントしてください: |
|||
expand-hosts |
|||
この設定を使わない場合、{{ic|/etc/hosts}} のエントリにドメインを追加する必要があります。 |
|||
==== テスト ==== |
|||
dnsmasq を起動してから一度も訪問していないウェブサイトを選択して、検索速度をテストします(''drill''は {{Pkg|ldns}}パッケージの一部です) |
|||
$ drill archlinux.org | grep "Query time" |
|||
再度コマンドを実行すると、キャッシュされた DNS IP が使用され、dnsmasq が正しく設定されていれば、検索時間はより速くなります。 |
|||
{{hc|$ drill archlinux.org {{!}} grep "Query time"| |
|||
;; Query time: 18 msec |
|||
}} |
}} |
||
さらに、{{ic|dnsmasq}} は上流の IPv6 DNS を優先させません。残念ながら NetworkManager では優先させることが出来ないようです ([https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/936712 Ubuntu Bug])。NetworkManager の設定で IPv4 の DNS を無効化するのが回避策になります。 |
|||
{{hc|$ drill archlinux.org {{!}} grep "Query time"| |
|||
===== 他の方法 ===== |
|||
;; Query time: 2 msec |
|||
}} |
|||
DNSSEC の検証が機能しているかどうかを調べるには、[[DNSSEC#テスト]] をご覧ください。 |
|||
他にも NetworkManager のアプレットを使って設定を手動で入力する方法もあります (通常はアプレットを右クリックします)。設定方法は使用しているフロントエンドの種類によりますが、基本的には、アプレットを右クリックして、プロファイルを編集(または作成)し、DHCP タイプとして 'Automatic (specify addresses)' を選択します。DNS アドレスは次のような形式で入力する必要があります: {{ic|127.0.0.1, DNS-server-one, ...}}。 |
|||
== DHCP サーバー |
=== DHCP サーバー === |
||
デフォルトで |
dnsmasq はデフォルトでは DHCP 機能がオフになっていますので、使用したい場合はオンにする必要があります。 以下、重要な設定項目です。 |
||
{{bc| |
{{bc|1= |
||
# Only listen to routers' LAN NIC. Doing so opens up tcp/udp port 53 to |
# Only listen to routers' LAN NIC. Doing so opens up tcp/udp port 53 to localhost and udp port 67 to world: |
||
interface=''enp0s0'' |
|||
# 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 |
# 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. |
|||
# 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}} を参照してください。 |
|||
== デーモンを起動する == |
|||
起動時に dnsmasq をロードするようにするには: |
|||
==== プロキシ DHCP ==== |
|||
{{bc|# systemctl enable dnsmasq}} |
|||
ネットワーク上にすでに DHCP サーバーがあり、それと相互運用したい場合、dnsmasq を ''プロキシ DHCP'' として動作させ、[[#PXEサーバー]] 固有の情報のみをクライアントに提供するように設定することが可能です。このモードは IPv4 でのみ利用可能です。以下の構文を使用し、既存の DHCP サーバーのアドレスを指定します。 |
|||
dnsmasq をいますぐ起動するには: |
|||
dhcp-range=192.168.0.1,proxy |
|||
==== テスト ==== |
|||
{{bc|# systemctl start dnsmasq}} |
|||
dnsmasq がインストールされているコンピュータに接続し、DHCP を使用して IP アドレスを自動的に割り当てるように設定し、ネットワークに正常にログインできるか試します。 |
|||
dnsmasq が正しく起動したか見るには、システムの journal を確認してください: |
|||
サーバ上の {{ic|/var/lib/misc/dnsmasq.leases}} ファイルを調査すると、リースが確認できるはずです。 |
|||
{{bc|$ journalctl -u dnsmasq}} |
|||
=== TFTP サーバーの設定 === |
|||
DHCP クライアントが新しい {{ic|/etc/resolv.conf}} を作れるようにネットワークも再起動する必要があります。 |
|||
転送ファイルを保存する TFTP のルートディレクトリ (例: {{ic|/srv/tftp}}) を作成してください。 |
|||
== テスト == |
|||
=== DNS キャッシュ === |
|||
dnsmasq の TFTP セキュアモードを使うには TFTP のルートディレクトリとファイルの所有者を全て {{ic|dnsmasq}} ユーザーに[[Chown|設定]]してください。 |
|||
ルックアップの速度をテストするには、dnsmasq を起動してから訪れたことのないウェブサイトを選択してください ({{ic|dig}} は {{Pkg|bind-tools}} パッケージに入っています): |
|||
{{ic|dnsmasq.conf}} で TFTP を有効化: |
|||
$ dig archlinux.org | grep "Query time" |
|||
{{hc|/etc/dnsmasq.conf|<nowiki> |
|||
enable-tftp |
|||
tftp-root=/srv/tftp |
|||
tftp-secure |
|||
</nowiki>}} |
|||
=== PXE の設定 === |
|||
dnsmasq を正しく設定していれば、このコマンドを二回目に実行するとキャッシュされた DNS の IP が使用され、ルックアップの時間が速くなっているはずです: |
|||
PXE を使うには DHCP と TFTP サーバーが必要ですが、どちらの機能も dnsmasq によって提供されています. |
|||
{{hc|<nowiki>$ dig archlinux.org | grep "Query time"</nowiki>| |
|||
;; Query time: 18 msec |
|||
{{Tip|dnsmasq を使って既存の DHCP サーバーを使ってネットワークに PXE ブートオプションを追加することもできます: |
|||
{{hc|/etc/dnsmasq.conf|2= |
|||
interface=''enp0s0'' |
|||
bind-dynamic |
|||
dhcp-range=''192.168.0.1'',proxy}} |
|||
}} |
}} |
||
# [[#TFTP サーバーの設定|TFTP サーバー]]と [[#DHCP サーバーの設定|DHCP サーバー]]を設定 |
|||
{{hc|<nowiki>$ dig archlinux.org | grep "Query time"</nowiki>| |
|||
# PXE 互換のブートローダー (例: [[Syslinux#Pxelinux|PXELINUX]]) を TFTP のルートにコピーして設定 |
|||
;; Query time: 2 msec |
|||
# {{ic|/etc/dnsmasq.conf}} で PXE を有効化: |
|||
{{Note| |
|||
*ファイルのパスは TFTP ルートからの相対パスです。 |
|||
*ファイルに {{ic|.0}} 拡張子が付く場合、{{ic|pxe-service}} オプションで拡張子を除外する必要があります。 |
|||
}} |
}} |
||
ファイルを送信するには: |
|||
dhcp-boot=lpxelinux.0 |
|||
クライアントアーキテクチャに応じてファイルを送信するには: |
|||
pxe-service=x86PC, "PXELINUX (BIOS)", "bios/lpxelinux" |
|||
pxe-service=X86-64_EFI, "PXELINUX (EFI)", "efi64/syslinux.efi" |
|||
{{Note|{{ic|pxe-service}} が機能しない場合 (特に UEFI を使用するクライアントの場合)、{{ic|dhcp-match}} と {{ic|dhcp-boot}} を組み合わせることができます。dhcp 起動プロトコルで使用する {{ic|client-arch}} の数について詳しくは [https://tools.ietf.org/html/rfc4578#section-2.1 RFC4578] を見てください。}} |
|||
=== DHCP サーバー === |
|||
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" |
|||
後はブートローダー次第です。 |
|||
dnsmasq が動いているコンピュータに接続されたコンピュータから、DHCP を使って IP アドレスを自動的に割り当てるように設定し、ネットワークに通常通りにログインしてください。 |
|||
== ヒントとテクニック == |
|||
== Tips and tricks == |
|||
=== OpenDNS が Google へのクエリをリダイレクトするのを止める === |
=== OpenDNS が Google へのクエリをリダイレクトするのを止める === |
||
| 182行目: | 249行目: | ||
{{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}} |
|||
キャプティブポータルを使用する場合など、特定の場面では特定のドメインをハードコードされたアドレスセットに解決するのが役に立つ場合があります。{{ic|address}} の設定で解決できます: |
|||
=== カスタムドメインの追加 === |
|||
(ローカル) ネットワークの hosts にカスタムドメインを追加することができます: |
|||
local=/home.lan/ |
|||
domain=home.lan |
|||
address=/example.com/1.2.3.4 |
|||
この例では {{ic|hostname.home.lan}} を (hosts ファイルに定義されている) ホスト/デバイスとして ping できます。 |
|||
さらに、特殊なワイルドカードを使うことで {{ic|/etc/hosts}} や DHCP が返答がないドメイン名について特定のアドレスを返すようにすることが可能です: |
|||
hosts エントリにカスタムドメインを追加するには {{ic|expand-hosts}} をアンコメントしてください: |
|||
expand-hosts |
|||
address=/#/1.2.3.4 |
|||
この設定を使わない場合、{{ic|/etc/hosts}} のエントリにドメインを追加する必要があります。 |
|||
=== 複数のインスタンス === |
|||
複数の dnsmasq サーバーをインターフェイスで動作させたい場合: |
|||
==== 固定 ==== |
|||
インターフェイスごとに固定のサーバーを使いたい場合、{{ic|interface}} と {{ic|bind-interface}} オプションを使ってください。2番目の dnsmasq が起動するようになります。 |
|||
==== 動的 ==== |
|||
インターフェイスを除外して他のインターフェイスにバインドできます: |
|||
except-interface=lo |
|||
bind-dynamic |
|||
{{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}} |
|||
}} |
|||
=== キャッシュ統計を表示 === |
|||
キャッシュ統計は、{{pkg|ldns}} パッケージからの {{ic|drill}} ユーティリティを使用して、chaos 要求を使用して照会できます。 |
|||
$ drill misses.bind TXT CH |
|||
$ drill hits.bind TXT CH |
|||
出力には、それぞれキャッシュミスとヒットの数が含まれます: |
|||
;; ANSWER SECTION: |
|||
misses.bind. 0 CH TXT "411" |
|||
その他のオプション {{ic|cachesize.bind}}、{{ic|insertions.bind}}、{{ic|evictions.bind}}、{{ic|auth.bind}}、{{ic|servers.bind }} |
|||
== 参照 == |
|||
* [http://www.g-loaded.eu/2010/09/18/caching-nameserver-using-dnsmasq/ Caching Nameserver using dnsmasq, and a few other tips and tricks.] |
|||
2025年3月6日 (木) 18:30時点における最新版
dnsmasq は、DNS サーバー、DHCPv6 と PXE をサポートする DHCP サーバー および TFTP サーバー を提供します。また、dnsmasq は DNS クエリをキャッシュし、過去に訪問したことのあるサイトへの DNS 検索速度を向上させるように設定することができます。
インストール
dnsmasq パッケージを インストール します。次に、dnsmasq.service を 起動/有効化 します。
DHCP クライアントが新しい /etc/resolv.conf を作成できるように、ネットワークを再起動する必要があります。
設定
dnsmasq を設定するには、/etc/dnsmasq.conf を編集します。 ファイルにはオプションを説明するコメントが含まれています。 利用可能なすべてのオプションについては dnsmasq(8) を参照してください。
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
あるいは、ネットワークインターフェイスを割り当てることもできます。
interface=enp5s0
キャッシュされるドメイン名の数を cache-size=size で設定します(デフォルトは 150 です。)
cache-size=10000
DNSSEC の検証には、dnsmasq パッケージが提供する DNSSEC トラストアンカーを読み込み、オプション dnssec を設定します。
conf-file=/usr/share/dnsmasq/trust-anchors.conf dnssec
使いたいオプションは dnsmasq(8) を参照してください。
DNS アドレスファイルと転送
dnsmasqを設定した後、/etc/resolv.conf にローカルホストアドレスを唯一のネームサーバーとして追加する必要があります。これにより、すべてのクエリが dnsmasq に送信されるようになります。
dnsmasq はスタブリゾルバであり、リカーシブリゾルバではないため、外部 DNS サーバーへの転送を設定する必要があります。これは、openresolv を使用して自動的に行うか、dnsmasq の設定で DNS サーバーアドレスを手動で指定することで実行できます。
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#テスト をご覧ください。
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 によって提供されています.
/etc/dnsmasq.conf
interface=enp0s0 bind-dynamic dhcp-range=192.168.0.1,proxy
- TFTP サーバーと DHCP サーバーを設定
- PXE 互換のブートローダー (例: PXELINUX) を TFTP のルートにコピーして設定
/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-match と dhcp-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 サーバーをインターフェイスで動作させたい場合:
固定
インターフェイスごとに固定のサーバーを使いたい場合、interface と bind-interface オプションを使ってください。2番目の dnsmasq が起動するようになります。
動的
インターフェイスを除外して他のインターフェイスにバインドできます:
except-interface=lo bind-dynamic
ドメインのブロックリスト化
ドメインをブロックリスト化する、つまり 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
キャッシュ統計を表示
キャッシュ統計は、ldns パッケージからの drill ユーティリティを使用して、chaos 要求を使用して照会できます。
$ drill misses.bind TXT CH $ drill hits.bind TXT CH
出力には、それぞれキャッシュミスとヒットの数が含まれます:
;; ANSWER SECTION: misses.bind. 0 CH TXT "411"
その他のオプション cachesize.bind、insertions.bind、evictions.bind、auth.bind、servers.bind