ドメイン名前解決
一般に、ドメイン名 は IP アドレスを表し、ドメインネームシステム (DNS) で IP アドレスに関連付けられます。
ここでは、ドメイン名前解決の設定方法とドメイン名の解決方法について説明します。
目次
Name Service Switch
Name Service Switch (NSS) 機能は GNU C ライブラリ (glibc) の一部であり、getaddrinfo(3) API をサポートしており、ドメイン名を解決するために使用されます。NSS では、システムデータベースを別々のサービスで提供することができ、その検索順序は管理者が nsswitch.conf(5) で設定することができます。ドメイン名の解決を行うデータベースは hosts データベースであり、glibc は以下のサービスを提供しています。
- files:
/etc/hosts
ファイルを読み込む。hosts(5) を参照してください。 - dns :
/etc/resolv.conf
を読み込む glibc resolver。 resolv.conf(5) を参照してください。
systemd はホスト名解決のために 3 つの NSS サービスを提供します。
- nss-resolve(8) — で説明されているキャッシング DNS スタブ リゾルバ systemd-resolved
- nss-myhostname(8) —
/etc/hosts
を編集せずに ネットワーク設定#ローカルのホストネーム解決 を提供します。 - nss-mymachines(8) — ローカル systemd-machined(8) コンテナの名前のホスト名解決を提供します
NSS を使用してドメイン名を解決する
NSS データベースは getent(1) でクエリできます。ドメイン名は、NSS を介して解決できます。
$ getent hosts domain_name
Glibc リゾルバ
glibc リゾルバは、解決ごとに /etc/resolv.conf
を読み取り、使用するネームサーバーとオプションを決定します。
resolv.conf(5) は、ネームサーバーといくつかの設定オプションをリストアップします。 最初にリストされたネームサーバーが最初に試され、最大3つのネームサーバーをリストすることができます。数字記号 resolv.conf(5) は、ネームサーバーといくつかの設定オプションをリストアップします。
/etc/resolv.conf の上書き
Network manager は /etc/resolv.conf
を上書きする傾向があります。詳細については、対応するセクションを参照してください。
- dhcpcd#/etc/resolv.conf
- Netctl#/etc/resolv.conf
- NetworkManager#/etc/resolv.conf
- ConnMan#/etc/resolv.conf
プログラムが /etc/resolv.conf
を上書きするのを防ぐために、不変の ファイル属性 を設定して書き込み保護することもできます。
# chattr +i /etc/resolv.conf
nmcli を使用した代替方法
NetworkManager を使用する場合、nmcli(1) を使用して /etc/resolv.conf
の永続オプションを設定できます。Wired を接続の名前に変更します。例:
# nmcli con mod Wired +ipv4.dns-options 'rotate,single-request,timeout:1'
その他のオプションについては、nmcli(1)、nm-settings-nmcli(5)、および resolv.conf(5) のマニュアルページを参照してください:
探索時間を制限する
非常に長いホスト名の探索に直面したとき (pacman やブラウジング中など)、代替ネームサーバーが使われるまでの小さなタイムアウトを定義することがしばしば役に立ちます。これを行うには、/etc/resolv.conf
に以下を記述してください。
options timeout:1
IPv6 でホスト名の解決が遅れる
ホスト名の解決時に5秒の遅延が発生した場合は、DNS サーバー/ファイアウォールの誤動作が原因である可能性があり、並列の A および AAAA 要求に対して1つの応答しか返さない可能性があります。[1] /etc/resolv.conf
で次のオプションを設定することで、これを修正できます。
options single-request
ローカルドメイン名
ローカルマシン名のホスト名を完全修飾ドメイン名なしで使用できるようにするには、/etc/resolv.conf
にローカルドメインの行を以下のように追加してください。
domain example.org
これにより、ssh コマンドを使用する際に mainmachine1.example.org
のようなローカルホストを単に mainmachine1
として参照することができますが、 drill コマンドなどは検索を行うために完全修飾ドメイン名を要求します。
ルックアップユーティリティ
特定の DNS サーバーと DNS/DNSSEC レコードを照会するには、専用の DNS ルックアップユーティリティを使用できます。これらのツールは DNS 自体を実装し、NSS を使用しません。
ldns は、DNS から情報を取得するために設計されたツールである drill(1) を提供します。
たとえば、drill を使用して特定のネームサーバーにドメインの TXT レコードを照会するには、次のようにします:
$ drill @nameserver TXT domain
DNS サーバーが指定されていない場合、drill は /etc/resolv.conf
で定義されたネームサーバーを使用します。
Resolver のパフォーマンス
Glibc resolver は問い合わせをキャッシュしません。ローカルキャッシュを実装するには、 systemd-resolved を使用するか、ローカルキャッシュ DNS server を設定し、 127.0.0.1
と ::1
を /etc/resolv.conf
または /etc/resolvconf
(openresolv を使用する場合) でネームサーバーとして使用します。
プライバシーとセキュリティ
DNS プロトコルは暗号化されておらず、機密性、完全性、認証を考慮していないため、信頼されていないネットワークや悪意のある ISP を使用すると、DNS クエリが盗聴され、応答が manipulated される可能性があります。さらに、DNSサーバーは DNS hijacking を行うこともできます。
DNS サーバーがあなたのクエリを機密扱いにすることを信頼する必要があります。DNS サーバーは ISP や サードパーティ によって提供されています。また、自分で 再帰型ネームサーバー を運用することもできますが、より多くの労力がかかります。信頼できないネットワークで DHCP クライアントを使う場合は、任意の DNS サーバーを使ったり、その影響を受けたりしないように、必ず静的なネームサーバーを設定するようにしてください。リモート DNS サーバーとの通信を安全にするために、DNS over TLS (RFC 7858) や DNS over HTTPS (RFC 8484) または DNSCrypt などの暗号化プロトコルを使用するとよいでしょう。ただし上流サーバと リゾルバ がこのプロトコルをサポートしていることが条件です。また、stunnel などの通信を暗号化・復号化する専用ソフトを利用する方法もあります。認証付きのサーバー からの応答であることを確認するために、DNSSEC を検証することができます (リゾルバ と上流のサーバの両方がサポートしている場合)
アプリケーションレベルの DNS
主要な Web ブラウザ [2] [3] などの一部のクライアントソフトウェアは、HTTPS 上で DNS を実装し始めていることに注意してください。クエリの暗号化は、しばしばボーナスとみなされるかもしれませんが、それは、ソフトウェアがシステムリゾルバの設定の周りでクエリを横取りすることも意味します[4]
Firefox では、DNS over HTTPS の有効・無効やDNSサーバーを選択するための 設定オプション が提供されています。
Chromium はユーザーのシステムリゾルバを調査し、システムリゾルバのアドレスが DNS over HTTPS も提供することが分かっている場合、DNS over HTTPS を有効にします。詳細と DNS over HTTPS を無効にする方法については、このブログの記事 を参照してください。
Mozilla [5] は、システムリゾルバがドメイン use-application-dns.net
を解決できない場合、普遍的にアプリケーションレベル DNS を無効にすることを提案しています。現在のところ、これはFirefoxにのみ実装されています。
忘却の DNS
Oblivious DNS は、多くの DNS プライバシーの問題に対処するシステムです。詳しくはCloudflare の記事 をご覧ください。
サードパーティの DNS サービス
さまざまな Public recursive name server が利用可能であり、その一部には専用のソフトウェアもあります。
- cloudflared — HTTPS 経由の Cloudflare DNS の DNS クライアント
- dingo — HTTPS 経由の Google DNS の DNS クライアント
- opennic-up — 最も応答性の高い OpenNIC サーバーを使用して、DNS サーバーの更新を自動化します
- nextdns — NextDNS 用の DNS-over-HTTPS CLI クライアント
dnsperftest を使用して、最も一般的な DNS リゾルバのパフォーマンスを自分の場所からテストできます。dnsperf.com は、プロバイダー間のグローバルベンチマークを提供します。
DNS サーバー
DNSサーバーには、authoritative と recursive があります。そのどちらでもない場合、それらは スタブリゾルバ と呼ばれ、単にすべてのクエリーを別の再帰的ネームサーバーに転送するだけである。スタブリゾルバは通常、ローカルホストまたはネットワークに DNSキャッシュを導入するために使用される。同じことが、本格的なネームサーバーでも実現できることに注意してください。このセクションでは、利用可能なDNSサーバーを比較します。より詳細な比較は、Wikipedia:Comparison of DNS server softwareを参照してください。
名前 | パッケージ | 機能 | resolvconf | サポートされているプロトコル | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Authoritative | Recursive | Cache | Validates DNSSEC |
DNS | DNSCrypt | DNS over TLS |
DNS over HTTPS |
DNS over QUIC | |||
BIND | bind | Yes | Yes | Yes | Yes | Yes | Yes | No | Server1 | Server | No |
CoreDNS | corednsAUR | Yes | No | Yes | No | No | Yes | No | Yes | Yes | No |
DNS-over-HTTPS | dns-over-https | No | No | No | No | ? | ? | No | No | Yes | No |
Deadwood (MaraDNS recursor) | maradnsAUR | No | Yes | Yes | No | No | Yes | No | No | No | No |
dnscrypt-proxy | dnscrypt-proxy | No | No | Yes | No | No | Server | Resolver | No | Yes | ? |
dnsmasq | dnsmasq | Partial2 | No | Yes | Yes | Yes | Yes | No | No | No | No |
dnsproxy | dnsproxyAUR | No | No | Yes | No | No | Yes | Yes | Yes | Yes | Yes |
Knot Resolver | knot-resolver | No | Yes | Yes | Yes | No | Yes | No | Yes | Server | No |
pdnsd | pdnsd | Yes | Yes | Permanent | No | Yes | Yes | No | No | No | No |
PowerDNS Recursor | powerdns-recursor | No | Yes | Yes | Yes | Yes | Yes | No | Partial | No | ? |
Rescached | rescached-gitAUR | No | No | Yes | No | Yes | Yes | No | Yes | Yes | No |
RouteDNS | routedns-gitAUR | No | No | Yes3 | No | No | Yes | No | Yes | Yes | Yes |
SmartDNS | smartdns | No | No | Yes | No | ? | Yes | No | Resolver | Resolver | No |
Stubby | stubby | No | No | No | Yes | No | Server | No | Resolver | No | No |
systemd-resolved | systemd | No | No | Yes | Yes | Yes | Resolver and limited server | No | Resolver | No | No |
Unbound | unbound | Partial | Yes | Yes3 | Yes | Yes | Yes | Server | Yes | Server | No |
- BIND は DNS over TLS と DNS over HTTPS の両方を提供できますが (tls{} と listen-on を参照)、DNS over TLS/DNS over HTTPS アップストリームにクエリを転送することはまだできません。dig ツールは DNS over TLS と DNS over HTTPS (
+tls
と+https
オプションを使用) でクエリを実行できますが 証明書チェックなし です。 - Wikipediaより: dnsmasq は認証付きのサポートが制限されており、公共のインターネット利用よりもむしろ内部ネットワーク利用を意図しています。
- Redis バックエンドを使用して、Unbound に永続的なキャッシュを提供できます。
認証専用サーバー
名前 | パッケージ | DNSSEC | 地理的 バランシング |
---|---|---|---|
gdnsd | gdnsd | No | Yes |
Knot DNS | knot | Yes | Yes |
MaraDNS | maradnsAUR | No | ? |
NSD | nsd | No | No |
PowerDNS | powerdns | Yes | Yes |
条件付き転送
特定のドメイン名を照会するときに、特定の DNS リゾルバを使用することができます。これは、VPN に接続する場合に特に便利です。これにより、VPN ネットワークへのクエリは VPN の DNS によって解決されますが、インターネットへのクエリは引き続き標準の DNS リゾルバによって解決されます。ローカルネットワークでも使用できます。
これを実装するには、ローカル リゾルバ を使用する必要があります。これは、glibc がサポートしていないためです。
動的な環境 (ラップトップやある程度はデスクトップ)では、接続しているネットワーク (複数) に基づいてリゾルバを設定する必要があります。そのための最良の方法は openresolv を使うことです。なぜなら multiple subscribers をサポートしているからです。いくつかの ネットワークマネージャ は openresolv を通して、あるいはリゾルバを直接設定して、これをサポートしています。NetworkManager supports conditional forwarding without openresolv は、openresolv を使わずに条件付き転送をサポートしています。
参照
- Linux Network Administrators Guide
- Debian Handbook
- RFC:7706 - ループバックで動作させることでルートサーバーへのアクセス時間を短縮
- Domain name system overview - DNS に関する図
- 代替 DNS サービス