DNS(Domain Name System)は、アプリケーション層で動作するC/S型プロトコルであり、UDPおよびTCPの53番ポートを使用します。代表的な実装としてBIND(Berkeley Internet Name Domain)が広く利用されています。
ドメイン名の管理はICANN(The Internet Corporation for Assigned Names and Numbers)が担っており、gTLD(汎用トップレベルドメイン)やccTLD(国別コードトップレベルドメイン)、さらにルートサーバーシステムの運用を統括しています。
ローカル名前解決
ホスト名とIPアドレスの対応は、/etc/hostsファイルでも定義可能です。これはDNSクエリよりも優先される静的解決手段です。
階層構造のドメイン名
- ルートドメイン:最上位
- トップレベルドメイン(TLD):com, edu, gov, net, org, int, arpa など
- セカンドレベルドメイン:例: example.com
- サブドメイン:最大127階層まで可能
ドメインは「組織ドメイン」「国別ドメイン(.jp, .cn, .uk)」「逆引き専用ドメイン(in-addr.arpa)」に大別されます。
DNSサーバーの種類
- プライマリサーバー:ゾーンデータを管理
- セカンダリサーバー:プライマリからゾーン転送でデータを複製
- キャッシュ/フォワーダサーバー:再帰クエリを処理し結果を一時保存
ゾーンとレコードの基本
正引き(FQDN → IP)と逆引き(IP → FQDN)は、それぞれ独立した「ゾーン」として管理されます。各ゾーンは複数のリソースレコード(RR)で構成されます。
主なリソースレコード
- SOA:ゾーンの管理情報。各ゾーンに1つだけ存在し、先頭に配置必須
- A:IPv4アドレスへのマッピング
- AAAA:IPv6アドレスへのマッピング
- PTR:逆引き用。IPアドレスを逆順+
.in-addr.arpa.形式で指定 - NS:ゾーンを担当するネームサーバー
- CNAME:別名。複数のFQDNを同一IPにマッピング可能
- MX:メールサーバー。優先度(0〜99)を数値で指定
- TXT:テキスト情報。SPFや認証トークンなどに利用
SOAレコードの例
example.jp. IN SOA ns1.example.jp. admin.example.jp. (
2024060101 ; シリアル番号
3600 ; リフレッシュ間隔
600 ; リトライ間隔
604800 ; 有効期限
86400 ; 否定応答TTL
)
NSレコードの例
example.jp. IN NS ns1.example.jp.
IN NS ns2.example.jp.
ns1 IN A 203.0.113.10
ns2 IN A 203.0.113.11
MXレコードの例
example.jp. IN MX 10 mail1.example.jp.
IN MX 20 mail2.example.jp.
mail1 IN A 203.0.113.20
mail2 IN A 203.0.113.21
Aレコードとワイルドカード
www IN A 203.0.113.50
api IN A 203.0.113.51
*. IN A 203.0.113.99 ; 存在しないサブドメインを捕捉
@ IN A 203.0.113.1 ; ドメイン自体のIP
PTRレコードの例
50.113.0.203.in-addr.arpa. IN PTR www.example.jp.
; 短縮形も可
50 IN PTR www.example.jp.
BINDのインストールと設定
主要なパッケージ:
bind:DNSサーバー本体bind-utils:クライアントツール(dig, nslookup)bind-chroot:chroot環境用
インストール:
yum install -y bind bind-utils
主設定ファイル
/etc/named.conf:グローバル設定/etc/named.rfc1912.zones:ゾーン定義/var/named/:ゾーンファイル格納ディレクトリ
最小構成のnamed.conf
options {
listen-on port 53 { localhost; };
allow-query { any; };
};
include "/etc/named.rfc1912.zones";
実践:正引きゾーンの設定
/etc/named.rfc1912.zonesに追加:
zone "example.jp" IN {
type master;
file "example.jp.zone";
};
/var/named/example.jp.zone:
$TTL 86400
@ IN SOA ns1.example.jp. hostmaster.example.jp. (
2024060101
3600
600
604800
86400
)
IN NS ns1
ns1 IN A 192.168.1.10
www IN CNAME srv-web
srv-web IN A 192.168.1.100
srv-db IN A 192.168.1.101
逆引きゾーンの設定
/etc/named.rfc1912.zones:
zone "1.168.192.in-addr.arpa" IN {
type master;
file "192.168.1.zone";
};
/var/named/192.168.1.zone:
$TTL 86400
@ IN SOA ns1.example.jp. hostmaster.example.jp. (
2024060101
3600
600
604800
86400
)
IN NS ns1.example.jp.
10 IN PTR ns1.example.jp.
100 IN PTR srv-web.example.jp.
101 IN PTR srv-db.example.jp.
スレーブサーバーの設定
マスター側:named.confに以下を追加
allow-transfer { 192.168.1.20; };
スレーブ側:/etc/named.rfc1912.zones
zone "example.jp" IN {
type slave;
masters { 192.168.1.10; };
file "slaves/example.jp.zone";
};
注意点:
- シリアル番号を更新しないと転送されない
- 両サーバーの時刻同期が必要(NTP推奨)
- バージョン差異がある場合は、スレーブ側を新しくすること
検証コマンド
dig @192.168.1.10 www.example.jp
dig -x 192.168.1.100 @192.168.1.10
named-checkconf
named-checkzone example.jp /var/named/example.jp.zone
rndc reload