Webサイトにアクセスする際、私たちはブラウザに「www.example.com」のようなドメイン名を入力します。しかし、コンピュータ同士が通信するためにはIPアドレスが必要です。このドメイン名からIPアドレスへの変換を担うのがDNS(Domain Name System)です。
本記事では、DNSの仕組みについて以下の内容を解説します。
- DNSの役割と名前解決の基本概念
- ドメイン名の階層構造とFQDNの仕組み
- DNSクエリの流れ(再帰クエリと反復クエリ)
- DNSサーバーの種類と役割
- 主要なDNSレコードの種類と用途(A/AAAA/CNAME/MX/TXT)
- nslookupとdigコマンドによるDNS問い合わせの実践
この記事を読むことで、ドメイン名からIPアドレスへの変換プロセスを理解し、DNSレコードの役割を説明できるようになります。
前提条件
本記事を理解するために、以下の知識があることを前提としています。
- IPアドレスの基本的な概念を理解している(前々回記事参照)
- OSI参照モデルまたはTCP/IPモデルの概要を把握している
実行環境
DNSの動作確認には以下の環境を使用します。
| OS | 確認コマンド |
|---|---|
| Windows 10/11 | nslookup |
| macOS | nslookup または dig |
| Linux | dig または nslookup |
特別なソフトウェアのインストールは不要です。標準でインストールされているコマンドを使用します。
期待される学習成果
本記事を読み終えると、以下のことができるようになります。
- DNSの役割と名前解決の仕組みを説明できる
- ドメイン名の階層構造を理解し、FQDNを正しく読み解ける
- 再帰クエリと反復クエリの違いを区別できる
- 主要なDNSレコード(A/AAAA/CNAME/MX/TXT)の用途を説明できる
- nslookupやdigコマンドでDNSレコードを確認できる
DNSとは何か
DNS(Domain Name System)は、ドメイン名とIPアドレスを対応付ける分散型データベースシステムです。インターネットの「電話帳」に例えられることが多く、人間が覚えやすいドメイン名を、コンピュータが理解できるIPアドレスに変換します。
graph LR
A["ブラウザ"] -->|"www.example.com"| B["DNSサーバー"]
B -->|"93.184.216.34"| A
A -->|"HTTPリクエスト"| C["Webサーバー<br/>93.184.216.34"]
style A fill:#e3f2fd
style B fill:#fff3e0
style C fill:#e8f5e9DNSが必要な理由
IPアドレスは数字の羅列であり、人間にとって覚えにくいものです。一方、ドメイン名は意味のある文字列であり、記憶しやすく入力ミスも減らせます。
| 形式 | 例 | 特徴 |
|---|---|---|
| IPアドレス | 93.184.216.34 | コンピュータが理解できる、覚えにくい |
| ドメイン名 | www.example.com | 人間が理解しやすい、覚えやすい |
DNSは1983年に開発され、それ以前はHOSTSファイルと呼ばれるテキストファイルで名前とIPアドレスの対応を管理していました。インターネットの拡大に伴い、分散型のシステムであるDNSが必要となりました。
名前解決とは
ドメイン名からIPアドレスを取得するプロセスを名前解決(Name Resolution)または正引きといいます。逆に、IPアドレスからドメイン名を取得することを逆引き(Reverse DNS Lookup)といいます。
| 種類 | 変換方向 | 例 |
|---|---|---|
| 正引き(Forward Lookup) | ドメイン名 → IPアドレス | www.example.com → 93.184.216.34 |
| 逆引き(Reverse Lookup) | IPアドレス → ドメイン名 | 93.184.216.34 → www.example.com |
ドメイン名の階層構造
ドメイン名は階層構造を持っており、右から左に向かって上位から下位へと構成されています。各階層はドット(.)で区切られます。
ドメイン名の構成要素
「www.example.com」というドメイン名を例に、各構成要素を見てみましょう。
graph TB
subgraph "ドメイン名の階層構造"
ROOT["ルート(.)"]
TLD["トップレベルドメイン<br/>(com)"]
SLD["セカンドレベルドメイン<br/>(example)"]
HOST["ホスト名<br/>(www)"]
end
ROOT --> TLD
TLD --> SLD
SLD --> HOST| 階層 | 名称 | 例 | 説明 |
|---|---|---|---|
| 最上位 | ルートドメイン | . | すべてのドメインの起点(通常は省略) |
| 第1階層 | TLD(トップレベルドメイン) | com | 用途や国を示すドメイン |
| 第2階層 | SLD(セカンドレベルドメイン) | example | 組織やサービスを示すドメイン |
| 第3階層以下 | サブドメイン/ホスト名 | www | 特定のサービスやサーバーを示す |
トップレベルドメイン(TLD)の種類
TLDは大きく分けて以下の種類があります。
| 種類 | 略称 | 例 | 説明 |
|---|---|---|---|
| 分野別TLD | gTLD | com, net, org, info | 用途や分野を示す汎用ドメイン |
| 国コードTLD | ccTLD | jp, us, uk, de | 国や地域を示すドメイン |
| 新gTLD | ngTLD | tokyo, shop, blog | 2012年以降に追加された新しいgTLD |
| インフラ用TLD | - | arpa | DNSインフラ用の特殊ドメイン |
FQDN(完全修飾ドメイン名)
FQDN(Fully Qualified Domain Name)とは、ルートドメインからホスト名まですべてを含む完全なドメイン名です。厳密にはルートドメインを示す末尾のドット(.)を含みます。
www.example.com.
日常的にはルートドメインのドット(.)は省略されますが、DNS設定ファイルなどでは明示的に記述することがあります。
DNSサーバーの種類と役割
DNSの仕組みを理解するためには、複数の種類のDNSサーバーがどのように連携しているかを把握する必要があります。
DNSサーバーの分類
graph TB
subgraph "クライアント側"
STUB["スタブリゾルバ<br/>(PC・スマホ)"]
end
subgraph "キャッシュサーバー"
FULL["フルサービスリゾルバ<br/>(キャッシュDNSサーバー)"]
end
subgraph "権威サーバー"
ROOT["ルートDNSサーバー"]
TLD_S["TLDサーバー<br/>(.com)"]
AUTH["権威DNSサーバー<br/>(example.com)"]
end
STUB --> FULL
FULL --> ROOT
FULL --> TLD_S
FULL --> AUTH
style STUB fill:#e3f2fd
style FULL fill:#fff3e0
style ROOT fill:#e8f5e9
style TLD_S fill:#e8f5e9
style AUTH fill:#e8f5e9| サーバー種類 | 役割 | 例 |
|---|---|---|
| スタブリゾルバ | DNSクエリを発行するクライアント | PC、スマートフォン |
| フルサービスリゾルバ | 再帰的にDNSを問い合わせ、結果をキャッシュ | 8.8.8.8(Google DNS)、1.1.1.1(Cloudflare DNS) |
| ルートDNSサーバー | TLDサーバーの情報を返す | 世界に13系統存在 |
| TLDサーバー | 各TLDを管理し、権威サーバーの情報を返す | .comサーバー、.jpサーバー |
| 権威DNSサーバー | ドメインのDNSレコードを実際に管理 | 各組織が運用するDNSサーバー |
フルサービスリゾルバ(キャッシュDNSサーバー)
フルサービスリゾルバは、クライアントからのDNSクエリを受け取り、必要に応じて複数のDNSサーバーに問い合わせを行い、最終的な結果をクライアントに返します。問い合わせ結果はキャッシュされ、同じクエリに対しては高速に応答できます。
代表的なパブリックDNSサービスには以下があります。
| サービス名 | プライマリDNS | セカンダリDNS |
|---|---|---|
| Google Public DNS | 8.8.8.8 | 8.8.4.4 |
| Cloudflare DNS | 1.1.1.1 | 1.0.0.1 |
| OpenDNS | 208.67.222.222 | 208.67.220.220 |
| Quad9 | 9.9.9.9 | 149.112.112.112 |
権威DNSサーバー
権威DNSサーバーは、特定のドメインに関するDNSレコードを管理し、そのドメインに関する問い合わせに対して正式な回答を返します。ドメインを取得すると、そのドメインのDNSレコードを管理する権威DNSサーバーを指定します。
DNSクエリの流れ
Webブラウザにドメイン名を入力してから、IPアドレスが解決されるまでの流れを見てみましょう。
再帰クエリと反復クエリ
DNSの問い合わせには2種類のクエリ方式があります。
| クエリ種類 | 説明 | 使用される場面 |
|---|---|---|
| 再帰クエリ(Recursive Query) | 最終的な回答を要求する | クライアント → フルサービスリゾルバ |
| 反復クエリ(Iterative Query) | 次に問い合わせるべきサーバーを返す | フルサービスリゾルバ → 各DNSサーバー |
名前解決の詳細な流れ
「www.example.com」のIPアドレスを解決する際の具体的な流れを見てみましょう。
sequenceDiagram
participant Client as クライアント
participant Resolver as フルサービスリゾルバ
participant Root as ルートDNSサーバー
participant TLD as TLDサーバー(.com)
participant Auth as 権威DNSサーバー(example.com)
Client->>Resolver: www.example.comのIPは?(再帰クエリ)
Note over Resolver: キャッシュを確認
Resolver->>Root: www.example.comのIPは?(反復クエリ)
Root-->>Resolver: .comサーバーに聞いて(参照応答)
Resolver->>TLD: www.example.comのIPは?(反復クエリ)
TLD-->>Resolver: example.comの権威サーバーに聞いて(参照応答)
Resolver->>Auth: www.example.comのIPは?(反復クエリ)
Auth-->>Resolver: 93.184.216.34です(権威応答)
Note over Resolver: 結果をキャッシュ
Resolver-->>Client: 93.184.216.34ですこの流れを段階的に説明します。
- クライアントからの問い合わせ: ブラウザがフルサービスリゾルバに「www.example.com」のIPアドレスを再帰クエリで問い合わせる
- キャッシュの確認: フルサービスリゾルバは自身のキャッシュを確認し、キャッシュがあればそれを返す
- ルートDNSサーバーへの問い合わせ: キャッシュがない場合、ルートDNSサーバーに反復クエリを送信する
- TLDサーバー情報の取得: ルートDNSサーバーは「.com」を管理するTLDサーバーの情報を返す
- TLDサーバーへの問い合わせ: TLDサーバーに問い合わせを行う
- 権威DNSサーバー情報の取得: TLDサーバーは「example.com」を管理する権威DNSサーバーの情報を返す
- 権威DNSサーバーへの問い合わせ: 権威DNSサーバーに問い合わせを行う
- 最終回答の取得: 権威DNSサーバーが「www.example.com」のIPアドレス(93.184.216.34)を返す
- 結果のキャッシュと返却: フルサービスリゾルバは結果をキャッシュし、クライアントに返す
ローカルキャッシュの役割
上記の流れで毎回すべてのサーバーに問い合わせを行うわけではありません。以下の箇所でキャッシュが利用されます。
| キャッシュ場所 | 説明 |
|---|---|
| ブラウザキャッシュ | ブラウザが独自に保持するDNSキャッシュ |
| OSキャッシュ | OSのDNSリゾルバが保持するキャッシュ |
| hostsファイル | ローカルに定義された名前解決情報 |
| フルサービスリゾルバのキャッシュ | ISPや組織のDNSサーバーが保持するキャッシュ |
DNSレコードの種類
権威DNSサーバーは、さまざまな種類のDNSレコードを管理しています。各レコードには特定の役割があります。
主要なDNSレコード一覧
| レコード種類 | 用途 | 値の例 |
|---|---|---|
| A | ドメイン名をIPv4アドレスにマッピング | 93.184.216.34 |
| AAAA | ドメイン名をIPv6アドレスにマッピング | 2606:2800:220:1:248:1893:25c8:1946 |
| CNAME | ドメイン名の別名を定義 | www.example.com → example.com |
| MX | メールサーバーを指定 | mail.example.com(優先度10) |
| TXT | 任意のテキスト情報を格納 | v=spf1 include:_spf.google.com ~all |
| NS | ドメインの権威DNSサーバーを指定 | ns1.example.com |
| SOA | ドメインの管理情報を定義 | プライマリNS、連絡先、シリアル番号など |
| PTR | 逆引き用レコード(IPアドレス → ドメイン名) | www.example.com |
Aレコード
Aレコードは最も基本的なDNSレコードで、ドメイン名とIPv4アドレスを対応付けます。
example.com. IN A 93.184.216.34
www.example.com. IN A 93.184.216.34
1つのドメイン名に複数のAレコードを設定することも可能です。これはラウンドロビンDNSと呼ばれ、負荷分散に使用されます。
AAAAレコード
AAAAレコード(クアッドAレコード)は、ドメイン名とIPv6アドレスを対応付けます。
example.com. IN AAAA 2606:2800:220:1:248:1893:25c8:1946
IPv6アドレスは128ビットであり、IPv4の32ビット(Aレコード)の4倍であることから「AAAA」と名付けられました。
CNAMEレコード
CNAMEレコード(Canonical Name)は、ドメイン名の別名(エイリアス)を定義します。
www.example.com. IN CNAME example.com.
blog.example.com. IN CNAME example.com.
CNAMEレコードを使用すると、複数のサブドメインを1つのホストに向けることができます。ただし、CNAMEレコードには以下の制約があります。
- CNAMEレコードは他のレコードと共存できない(同じ名前でAレコードやMXレコードを持てない)
- ゾーンの頂点(example.com自体)にはCNAMEを設定できない
MXレコード
MXレコード(Mail Exchanger)は、ドメイン宛てのメールを受け取るサーバーを指定します。優先度(preference)を設定でき、数値が小さいほど優先度が高くなります。
example.com. IN MX 10 mail1.example.com.
example.com. IN MX 20 mail2.example.com.
この例では、mail1.example.com(優先度10)が優先的に使用され、利用できない場合はmail2.example.com(優先度20)が使用されます。
TXTレコード
TXTレコードは、任意のテキスト情報を格納するためのレコードです。以下のような用途で使用されます。
| 用途 | 説明 | 例 |
|---|---|---|
| SPF | 送信元メールサーバーの認証 | v=spf1 include:_spf.google.com ~all |
| DKIM | メールの電子署名 | 公開鍵情報 |
| DMARC | メール認証ポリシー | v=DMARC1; p=reject |
| ドメイン所有権の確認 | Google Search Consoleなどの認証 | google-site-verification=xxxxx |
example.com. IN TXT "v=spf1 include:_spf.google.com ~all"
NSレコード
NSレコード(Name Server)は、ドメインの権威DNSサーバーを指定します。
example.com. IN NS ns1.example.com.
example.com. IN NS ns2.example.com.
通常、冗長性を確保するために複数のNSレコードを設定します。
nslookupコマンドでDNSを確認する
nslookupコマンドは、DNSの問い合わせを行うための基本的なツールです。Windows、macOS、Linuxで利用可能です。
基本的な使い方
|
|
実行結果の例を示します。
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: www.example.com
Address: 93.184.216.34
| 項目 | 説明 |
|---|---|
| Server | 問い合わせに使用したDNSサーバー |
| Address | DNSサーバーのIPアドレスとポート番号 |
| Non-authoritative answer | キャッシュからの応答であることを示す |
| Name | 問い合わせたドメイン名 |
| Address | 解決されたIPアドレス |
特定のレコードタイプを指定する
nslookupでは、-typeオプションを使って特定のレコードタイプを問い合わせることができます。
|
|
特定のDNSサーバーを指定する
特定のDNSサーバーを使って問い合わせを行うこともできます。
|
|
digコマンドでDNSを確認する
digコマンド(Domain Information Groper)は、より詳細なDNS情報を取得できるツールです。macOSとLinuxに標準でインストールされています。Windowsでは、WSL(Windows Subsystem for Linux)やBINDパッケージをインストールすることで使用できます。
基本的な使い方
|
|
実行結果の例を示します。
; <<>> DiG 9.18.18 <<>> www.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12345
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.example.com. IN A
;; ANSWER SECTION:
www.example.com. 86400 IN A 93.184.216.34
;; Query time: 23 msec
;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP)
;; WHEN: Tue Jan 07 23:00:00 JST 2026
;; MSG SIZE rcvd: 60
| セクション | 説明 |
|---|---|
| HEADER | クエリのステータスとフラグ |
| QUESTION SECTION | 問い合わせた内容 |
| ANSWER SECTION | 応答結果(レコードの値とTTL) |
| Query time | 応答にかかった時間 |
| SERVER | 使用したDNSサーバー |
特定のレコードタイプを問い合わせる
|
|
短縮形式で表示する
詳細な情報が不要な場合は、+shortオプションを使用します。
|
|
実行結果の例を示します。
93.184.216.34
DNSの問い合わせ経路を確認する
+traceオプションを使用すると、ルートDNSサーバーからの問い合わせ経路を確認できます。
|
|
このコマンドにより、ルートDNSサーバー、TLDサーバー、権威DNSサーバーへの問い合わせが順番に表示され、名前解決の流れを実際に確認できます。
DNSのセキュリティに関する補足
DNSは1983年に設計されたプロトコルであり、セキュリティ上の考慮が十分ではありませんでした。現在では以下のようなセキュリティ強化技術が利用されています。
| 技術 | 説明 |
|---|---|
| DNSSEC | DNSレコードに電子署名を付与し、改ざんを検知 |
| DoH(DNS over HTTPS) | DNS通信をHTTPS経由で暗号化 |
| DoT(DNS over TLS) | DNS通信をTLS経由で暗号化 |
これらの技術については、次回以降の記事で詳しく解説します。
まとめ
本記事では、DNSの仕組みについて基礎から解説しました。
- DNSの役割: ドメイン名からIPアドレスへの変換(名前解決)を行う分散型データベースシステム
- ドメイン名の階層構造: ルートドメイン、TLD、SLD、サブドメインで構成される
- DNSサーバーの種類: スタブリゾルバ、フルサービスリゾルバ、権威DNSサーバーが連携して名前解決を行う
- クエリの種類: クライアントは再帰クエリ、フルサービスリゾルバは反復クエリを使用
- DNSレコード: A、AAAA、CNAME、MX、TXTなど、用途に応じたレコードが存在
- 確認コマンド: nslookupやdigコマンドでDNSの動作を確認可能
次回記事「DNSキャッシュとTTLの仕組みを理解する」では、DNSキャッシュの詳細な動作、TTL(Time To Live)の役割、キャッシュのクリア方法、DNS伝播の遅延について解説します。