DNSの仕組みとBINDによる実装

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

タグ: bind DNS ゾーン転送 リソースレコード ネームサーバー

5月19日 23:06 投稿