Ubuntu上でBIND9を使用して内部DNSサーバーを構築する:肥大化したhostsファイルに代わる解決策

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

「IPアドレスを覚える」という悩み

数十台のデバイスがある50人規模のオフィスのネットワークを管理しているなら、この気持ちがわかるはずです。駆け出しの頃、私はあらゆるIPアドレスを覚えるのに苦労しました。会計サーバーは 192.168.1.10ファイルサーバー192.168.1.50、それに加えてプリンターやカメラなど……。

新入社員が入るたびに、WindowsやLinuxの hosts ファイルを修正するために各デスクを回らなければなりませんでした。サーバーのIPが一度でも変われば、その日はテクニカルサポートの電話が鳴り止まず、一日中対応に追われることになります。無機質な数字の羅列の代わりに nas.congty.local と打ち込むだけでアクセスできるようにすることは、かつてないほど切実なニーズでした。

なぜ /etc/hosts では限界があるのか?

hostsファイルの使用は、ネットワーク内にデバイスが2〜3台しかない場合に限れば有効です。しかし、規模が大きくなるにつれて、以下の理由からそれは本当の悪夢へと変わります。

  • 手動更新の苦行: 新しいサーバーを追加するたびに、数百台のクライアントマシンのhostsファイルを修正しなければなりません。
  • 高いミス発生リスク: IPアドレスの数字を一つ打ち間違えるだけで、その部門の全サービスがユーザーから見て「ダウン」した状態になります。
  • 置き去りにされるモバイルデバイス: スマートフォンやタブレットは、ルート化やジェイルブレイクをしない限り、hostsファイルを編集することはほぼ不可能です。

内部DNSサーバーこそが救世主です。それは共有の電話帳のように機能します. 誰かが git.lab.io と入力すると、コンピュータはDNSサーバーに「これはどこにある?」と尋ね、わずか数ミリ秒で正確なIPアドレスを受け取ります。

BIND9 – DNS界の「ベテラン」

現在ではUnboundやCoreDNSなど多くの選択肢がありますが、BIND9 (Berkeley Internet Name Domain) は依然としてゴールデンスタンダードです。私がCentOSからUbuntuに移行した際、BIND9の設定ファイルの配置に少し違いがありましたが、そのロジックさえ一度理解してしまえば、BIND9のカスタマイズ性がいかに強力であるかに気づくはずです。

BIND9は、正引き(Forward DNS)、逆引き(Reverse DNS)、およびリクエストの転送(Forwarding)をスムーズに処理します。これは、ネットワークインフラをプロフェッショナルに管理したい場合には欠かせない基盤です。

Ubuntu ServerでのBIND9構築の実践ステップ

イメージしやすいように、以下のパラメータを使用した実際のラボ環境を想定して進めます。

  • OS: Ubuntu Server 22.04 LTS
  • DNSサーバーIP: 192.168.1.100
  • 内部ドメイン: itfromzero.local

ステップ 1: BIND9パッケージのインストール

まず、リポジトリを更新し、BIND9とサポートツールをインストールします。

sudo apt update
sudo apt install bind9 bind9utils bind9-doc -y

ステップ 2: フォワーダー(クエリ転送)の設定

このDNSサーバーには内部ドメインの問い合わせに答えさせ、従業員が facebook.com などにアクセスした場合は、そのリクエストを外部インターネットに転送するように設定します。

/etc/bind/named.conf.options ファイルを開きます:

sudo nano /etc/bind/named.conf.options

まず、外部からの攻撃にDNSが悪用されるのを防ぐため、信頼できるIPリスト(ACL)を定義します:

acl "trusted" {
    192.168.1.0/24;
    localhost;
    localnets;
};

次に、options ブロック内で、クエリの許可とフォワーダーの設定を追加します:

options {
    directory "/var/cache/bind";
    allow-query { trusted; };
    forwarders {
        8.8.8.8;
        1.1.1.1;
    };
    // ... その他の設定はそのまま保持
};

ステップ 3: 管理ゾーンの定義

次に、itfromzero.local ドメインをこのサーバーで管理することをBIND9に伝えます。/etc/bind/named.conf.local ファイルを開きます:

sudo nano /etc/bind/named.conf.local

正引きおよび逆引きゾーンを定義するために、以下の内容を追加します:

// 正引きゾーン
zone "itfromzero.local" {
    type master;
    file "/etc/bind/zones/db.itfromzero.local";
};

// 逆引きゾーン
zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/zones/db.192.168.1";
};

ステップ 4: 正引きゾーンファイルの作成

ここではAレコードやCNAMEレコードを設定します。管理しやすいように専用のディレクトリを作成しましょう:

sudo mkdir /etc/bind/zones
sudo cp /etc/bind/db.local /etc/bind/zones/db.itfromzero.local
sudo nano /etc/bind/zones/db.itfromzero.local

実際のレコードでファイルを更新します。注意:ドメイン名の末尾にあるドット(.)は必須です

$TTL    604800
@       IN      SOA     ns1.itfromzero.local. admin.itfromzero.local. (
                              3         ; シリアル番号
                         604800         ; リフレッシュ
                          86400         ; リトライ
                        2419200         ; 有効期限
                         604800 )       ; ネガティブキャッシュTTL
;
@       IN      NS      ns1.itfromzero.local.
ns1     IN      A       192.168.1.100
web     IN      A       192.168.1.101
nas     IN      A       192.168.1.102

ステップ 5: 逆引きゾーンファイルの作成

逆引きは、IPアドレスからドメイン名へのマッピングを行います。これはログサービスや内部メールサーバーにとって非常に重要です。

sudo cp /etc/bind/db.127 /etc/bind/zones/db.192.168.1
sudo nano /etc/bind/zones/db.192.168.1

使用しているIP帯域に合わせて設定します:

$TTL    604800
@       IN      SOA     ns1.itfromzero.local. admin.itfromzero.local. (
                              3         ; シリアル番号
                         604800         ; リフレッシュ
                          86400         ; リトライ
                        2419200         ; 有効期限
                         604800 )       ; ネガティブキャッシュTTL
;
@       IN      NS      ns1.itfromzero.local.
100     IN      PTR     ns1.itfromzero.local.
101     IN      PTR     web.itfromzero.local.
102     IN      PTR     nas.itfromzero.local.

ステップ 6: 構文チェックと有効化

すぐにサービスを再起動しないでください。タイポによるDNSダウンを防ぐために、チェックツールを使用します:

sudo named-checkconf
sudo named-checkzone itfromzero.local /etc/bind/zones/db.itfromzero.local
sudo systemctl restart bind9
sudo systemctl enable bind9

実務経験からのアドバイス:凡ミスを避けるために

BIND9で何度も「痛い目」を見た結果、私は3つの黄金律を導き出しました:

  1. 「ドット (.)」の威力: ゾーンファイル内では、ns1.itfromzero.local. のように末尾にドットを付けてFQDNにする必要があります。これを忘れると、BINDは自動的に ns1.itfromzero.local.itfromzero.local と解釈してしまいます。これは初心者が必ずと言っていいほど陥る「底なし沼」です。
  2. 常にシリアル番号を増やす: ゾーンファイルを修正するたびに、Serial の値を1つ増やしてください(例:3から4へ)。そうしないと、セカンダリDNSサーバーはプライマリサーバーからの新しいデータを決して更新しません。
  3. 所有権の厳格なチェック: root権限でファイルをコピーした場合、bind ユーザーがファイルを読み取れないことがあります。すべてがスムーズに動作するように、sudo chown -R bind:bind /etc/bind/zones コマンドを実行してください。

BIND9の導入は単なるソフトウェアのインストールではなく、ネットワークインフラを標準化するための第一歩です。設定が成功し、手動のhostsファイル更新という悩みから早く解放されることを願っています!

Share: