DNSサーバー · 1 min read · Jan 09, 2026

MySQLベースのDNSサーバーを運用する: MyDNS - ページ 3

3 dnscacheのインストール

MyDNSについて知っておくべき非常に重要なことは、外部(再帰的)DNSルックアップをサポートしていないということです。つまり、MyDNSは自分が権威を持つドメインに対してのみ回答を提供します!例えば、www.google.comのような他のドメインを解決したい場合は、システムにdnscacheのようなDNSリゾルバをインストールする必要があり、別のIPアドレスにインストールする必要があります。DNSサーバー(MyDNS)とDNSリゾルバ(dnscache)がそのように分離されている理由を知りたい場合は、こちらをご覧ください: http://cr.yp.to/djbdns/separation.html

通常、ISPは自宅やオフィスでのインターネット接続に使用するネームサーバーのIPアドレスを提供しますので、ワークステーションはwww.google.comのような名前を解決できます。ネームサーバーのIPアドレスは実際にはdnscacheのようなDNSリゾルバのIPアドレスです。さて、顧客に独自のネームサーバーのIPアドレスを提供したい場合は、DNSリゾルバを設定し、そのDNSリゾルバのIPアドレスを顧客に提供する必要があります。

さて、サーバーに1つのIPアドレスしかない場合、「よし、MyDNSを127.0.0.1にバインドし、dnscacheを私のパブリックIPアドレスにバインドしてこのボトルネックを回避しよう」と言うことができます。これは悪いアイデアである理由を知りたい場合は、こちらをお読みください: http://www.fefe.de/djbdns/#sameip

システムにDNSリゾルバをインストールしたくない場合は、このセクションをスキップできます。

さて、2つのパブリックIPアドレス、1.2.3.41.2.3.5があり、MyDNSを1.2.3.4でリッスンさせ、dnscache1.2.3.5でリッスンさせたいとしましょう。

dnscacheをインストールするための手順は次のとおりです:

groupadd dns
useradd -M -g dns -s /sbin/nologin -c DNS-Cache-User dnscache
useradd -M -g dns -s /sbin/nologin -c TinyDNS-User tinydns
useradd -M -g dns -s /sbin/nologin -c DNSlog-User dnslog

dnscacheのinitスクリプトを作成します:

cd /usr/local/sbin
wget http://www.servershak.com/dns/dnsctl
chmod 700 dnsctl
ln -s /usr/local/sbin/dnsctl /etc/init.d/dnsctl

システム起動リンクを作成します:

Debianの場合:

update-rc.d dnsctl defaults

FedoraおよびRedHatの場合:

chkconfig –levels 235 dnsctl on

次に、dnscacheをコンパイルしてインストールします:

cd /usr/local/src
wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
tar -zxvf ucspi-tcp-0.88.tar.gz
cd ucspi-tcp-0.88
make
make setup check

mkdir -p /var/package
chmod 1755 /var/package
cd /var/package
wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
gunzip daemontools-0.76.tar
tar -xpf daemontools-0.76.tar
rm daemontools-0.76.tar
cd /var/package/admin/daemontools-0.76
package/install

cd /usr/local/src
wget http://cr.yp.to/djbdns/djbdns-1.05.tar.gz
tar -xvzf djbdns-1.05.tar.gz
cd djbdns-1.05
make
make setup check

dnscache-conf dnscache dnslog /etc/dnscache 1.2.3.5
ln -s /etc/dnscache /service
touch /etc/dnscache/root/ip/1.2.3

これでdnscache1.2.3.5でリッスンしています。次に、MyDNSに1.2.3.4のみにリッスンさせる必要があります。したがって、/etc/mydns.conflistenディレクティブを変更する必要があります:

| listen = 1.2.3.4 |

そしてMyDNSを再起動します:

/etc/init.d/mydns restart

これで1.2.3.5でドメイン名を解決しようとすると、回答が得られるはずです。例えば、www.google.comを解決するには、次のように実行します。

dig @1.2.3.5 www.google.com

同様に、MyDNSが処理するドメイン(例えばwww.somedomain.com)を解決できるはずですが、今回は1.2.3.4を掘ります:

dig @1.2.3.4 www.somedomain.com

4 プライマリDNSサーバーからセカンダリDNSサーバーへのゾーンとレコードの取得

プライマリDNSサーバーとセカンダリDNSサーバーの両方がMyDNSを使用している場合、プライマリからセカンダリDNSサーバーにデータを取得するための3つの方法があります:

  1. 従来の方法: ゾーントランスファーを使用できます。したがって、/etc/mydns.confallow-axfr = noallow-axfr = yesに変更し、プライマリDNSサーバーでMyDNSを再起動する必要があります。それに加えて、転送すべきゾーンのsoaテーブルのxfer列にセカンダリDNSサーバーのIPアドレスを指定する必要があります。さらに、プライマリDNSのファイアウォールがポート53TCPおよびUDP)をブロックしていないことを確認してください。
  2. プライマリDNSとセカンダリDNSが同じMySQLデータベースを使用します。この解決策には1つの欠点があります: MySQLサーバーが失敗すると、プライマリとセカンダリDNSの両方が同時に失敗します…
  3. 推奨される解決策: MySQLデータベースのレプリケーションを使用して、プライマリからセカンダリDNSにデータを転送します。プライマリDNSのファイアウォールがMySQLポート(通常は3306)をブロックしていないことを確認してください。

MySQLレプリケーションを使用することをお勧めします。この設定方法について非常に詳細なガイドをこちらに書いています: https://www.howtoforge.com/mysql_database_replication ので、ここでこのトピックを再度カバーする必要はありません。

リンク

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。