PR

FreeBSD DNS サーバ その1

FreeBSD
記事内に広告が含まれています。

私が使用している携帯電話は iPhone なのですが、実は iPhone 3G から使い始めて、iPhone 4, iPhone 5, iPhone 6, iPhone7, iPhone 8, iPhone XS と7代目の iPhone となっています。この iPhone XS、ストレージも十分に空いてるし、遅くもなく、それなりに動いているのですが、5G につながらないモデルなのです。どうしようかなぁ?と考えていた時に、何気に古い写真を見てみたのですが、あぁ、懐かしい。。と思われる写真が沢山あることに気づきました。私以外の人にはナンジャこりゃ?と思われるかもしれない写真ですが、私個人のモチベーションアップのために簡単な説明と一緒に少しづつ使ってみたいと思います。このアイキャッチの写真はチェコにあるとある MPLS ネットワークプロバイダのオフィスを訪ねたときにプラハの街中で撮った道しるべです。

jf3vqb.net

さて、今回設置する DNS は家庭内のみの DNS クライアントからの問い合わせに対して答えるサーバとする予定です。以前の記事でお話ししたと思いますが、今回 jf3vqb.net というドメインを取得し、レンタルサーバを管理してくれているプロバイダさんにこのドメインの DNS サーバがあります。

冗長性のために最低2つはあるはずです。

固定 IP アドレス

家庭内でのオプションとして、同じドメイン名とするか、あるいは home.jf3vqb.net などのようなサブドメインとするかのオプションがあるようです。中の DNS をインターネットに公開する必要はありませんので、home.jf3vqb.net で行きたいと思います。当然公開の必要がないので、jf3vqb.net に home サブドメインへの NS レコードを作る必要もありません。まず最初にしないといけないのが、DNS サーバに固定 IP アドレスを付けるということを行います。元々の DHCP サービスが動き続けている限り、DNS サーバを再起動してもアドレスが変わることはそうそうないと思われるのですが、停電などもないとも限りません。固定アドレスにしておきます。

固定アドレスとサブネットマスクを指定します。固定アドレスにするとゲートウェイアドレスが DHCP から提供されないので、/etc/rc.conf に手動で書き込みます。IPv6 はとりあえずそのままにしておきましょう。

この状態で再起動すると新しいアドレスを使用して立ち上がってきます。nmbd が起動していますので、Windows からはホスト名がそのまま使用できます。基本、Windows はブロードキャスト OS なので、ブロードキャストを使うことが非常に多いです。名前解決もブロードキャストを使用して同一ネットワーク内のマスタブラウザに問い合わせて pokemon や package のアドレス解決をしています。

IP アドレスは変わることがありますし、覚えられませんが、マシン名は変わらないですし、覚えやすいです。アラ環ですから 🙂
SSH エラーも出ません。

bind9 コンパイル

続いて DNS ソフトウェアをインストールしてゆくのですが、ここでは最もシェアが大きい ISC BIND9 を使ってみたいと思います。利用可能なバージョンは bind918 のようです。まず、オプションを見てみましょう。

どのようなオプションがあるか調べてみます。

DOCS オプション以外はデフォルトです。

見やすいほうがお好きな方は TERM 変数を xterm に変えてみてください。

というのも、vmware tools をインストールするときにこのオプションと X11 関係のオプションを外しました。ですのでそのままコンパイルしましょう。pokemon サーバは /usr/ports ディレクトリが空のはずなので、portsnap fetch extract でコピーしてから同様にコンパイルします。package サーバも portsnap fetch update で最新にすることをお忘れなく。

open-vm-tools を再コンパイルしたときのオプションが残っています。

ports と package の混在

コンパイル途中で、py38-setuptools-57.0.0 か既にインストールされていると怒られました。pkg delete py38-setuptools-57.0.0 で削除してからもう一度 make install clean を実行します。pkg delete の時に samba413 も削除されるので、/usr/ports/net/samba413 で make install clean も忘れずに行います。パッケージとポーツを混在させると、このようなことが起こったりします。

たくさんのモジュールがコンパイルされました。

ファイルシステムフルのメッセージもないようです。

ディスク容量も足りたようです。

続いて、依存関係で削除した samba413 も作り直して、samba を再起動しておきます。

念のため再起動。

bind9 設定

さて、いよいよ DNS の設定に入ります。/usr/local/etc/namedb/named.conf を編集してゆきます。ここでは、pokemon をプライマリーサーバ、package をセカンダリサーバとして動くようにしてゆきます。とりあえず、/etc/rc.conf を変更して、DNS を起動してみます。

DNS が自動起動するようにします。

/usr/local/etc/namedb/named.conf には 127.0.0.1 のみにバインドするように書かれています。ですので、127.0.0.1 に対して問い合わせを行えは、アドレスは帰ってくるはずです。

おぉ、動いていそうです 🙂

root サーバー ? forwarder ?

root DNS サーバを使用して whitehouse と google のアドレスを得ることができました。ここからカスタマイズしてゆきます。デフォルトの構成では、知らないものは root サーバに問い合わせを行うようになっています。

root servers は時々変わります。定期的に確認を。

まずこれを、知らないものは知ってるものへ聞いてみるように変更してみます。その設定がこちらです。

root サーバーに問い合わせた後権威サーバーに自身で問い合わせるより、既に権威サーバーを知っている人に聞いたほうが速いはず。

現在の状態では、forwarders はコメントアウトされています。このコメントを外して、google DNS へ問い合わせるようにします。この forwarders がセットされたときの動作は、コメントにあるように forwarder first になります。forwarders が利用できなかったり、高負荷などで規定時間内に応答が得られないときは root サーバに問い合わせに行きます。これを防止するために forward only オプションもセットします。

とりあえず、有名どころで試してみます。

もう一度、DNS 検索をしてみます。

ほぼ同じのようです。

先ほどとは少し異なるアドレスが見えます。どちらが近いでしょうか?

最近の DNS の多くは GEO-IP をサポートしています。

best forwarders

ミニマムはほとんど変わりませんが、平均で少しだけ google DNS へ転送したほうが勝っています。では最後に私の家庭で使用している ISP が提供している DNS を指定した場合に得られる google のアドレスで比較してみました。

しっかり仕事していますね?私の ISP は。

ISP 提供の DNS を使用したほうが 500μs 程度勝っていました。もう一つよく使うサイトをテストしてみたいと思います。M$ のデータセンターを調べてみます。google DNS を使用したときは東京にあるデータセンターのアドレスを返したようです。

google DNS は Anycast を使用しています。一番応答の速かったサーバーが応答します。

一方、ISP 提供の DNS を使用した場合は大阪のデータセンターのアドレスを返してくれました。私の家のロケーションは大阪ですので、10ms 弱良い結果を得ることができました。

一番よさげです。

home.jf3vqb.net 順引き

ということで、私の場合は ISP 提供の DNS を forwarders として指定することといたします。続いて設定しないといけないのは、家庭内ドメインのデータを作成して、named.conf に記述してやる必要があります。まず、順引き用ファイル。まず、テンプレートを用意します。

ホスト名 -> IP アドレスの返還を行います。

ループバックアドレス用のファイルをコピーしたので、とりあえず IPv4 の A レコードから設定してゆきます。

IPv4 と IPv6 一つずつあります。

こんな感じです。

DNS の設定ファイルにデータベースファイルを追加し、新しい設定を読み込ませます。

動くかな?

ではテストしてみましょう。

動いた!

よさげです。では、セカンダリサーバを設定しましょう。こんな感じです。

おや?ファイルができません。パーミッションの問題?ということで、プライマリにセカンダリからの転送 OK の記述を入れてやります。加えて、転送できるように実 IP アドレスを持つインターフェースにもバインドしてやります。プライマリもセカンダリも両方必要です。プライマリはこんな感じです。

バインドするアドレスに NIC の IP アドレスを付け加える。
セカンダリからの転送要求を受け付けるようにする。

再度セカンダリで rndc reload を行った時にコンソールにエラーが出ていました。creating IPv4 interface vmx0 failed. こちらもパーミッションの問題でした。セキュリティ上の理由から bind ユーザで動いているのでバインドできないようです。setuid() システムコールが実行される前にインターフェースにバインドしてしまう必要があります。

再起動!

そこで、何でもできる root でバインドできるように再起動します。当然、プライマリもセカンダリもプロセスを再起動しました。しっかりファイルができました。

セカンダリもテストしてみます。

よさげです。では、リゾルバを設定します。メインは自サーバ、バックアップはもう一方のサーバとします。こんな感じです。

最終テストを行います。

おっと、package さんのアドレスを間違ってしまいました。修正します。プライマリでデータベースファイルを開きます。

そして、package さんのアドレスを修正します。重要なのは、アドレスは勿論ですが、SOA ゾーンのシリアル番号も今より大きくしておく必要があります。そうすると、セカンダリサーバはプライマリデータが更新されたと知ることができます。この条件が発生するまでデータ転送は発生しません。

では、データを読み直してみます。

よさげです。では、外部の名前も解決できるか見ておきます。

全て OK のようです。最後に、自身のドメイン名を jf3vqb.net から home.jf3vqb.net へ変更して再起動しておきます。

めでたしめでたし!

home.jf3vqb.net 逆引き

最後に、家庭内で必要になるシーンは思いつきませんが、逆引きもインターネットでは重要になります。例えば、sendmail にリレーを許可する時にホスト名を使用したときに、IP アドレスからホスト名を逆引きして、得られたホスト名を IP アドレスに順引きして、このアドレスが最初のアドレスと一致してなおかつ指定したホスト名と一致したときにメールのリレーが許可されます。家庭内では大きな意味を持ちませんが、何の問題もなくはないので、設定しておきます。例えばこんな問題があります。

ホスト名でみたい!

逆引きのテンプレートファイルをコピーします。当然プライマリで行います。

編集してデータを書き加えます。

ローカルホストのデータが2つある。

順引きと同じように NS レコードを書き換えて、逆引きの PTR レコードを書き加える。各行最後のピリオドが重要です。これがないと、相対名と扱われます。

DNS サーバとポインタレコードを変更して、設定ファイルを編集します。

順引き同様、ファイルの指定と、転送許可を設定します。

セカンダリも順引き同様に設定します。

プライマリから先に設定を読み込ませます。その後にセカンダリの設定を読み込ませます。そうすると、セカンダリ用のファイルがプライマリからコピーされます。

しっかりマシン名が表示されました。

ちょっと確認します。

nobody.localhost ? 誰?

逆引きのメールアドレスがおかしいので直しておきます。

よしよし!

私の使用している ISP の場合は、ISP 提供の DNS を使用したほうがネットワーク的 ( 地理的に近く ) に近くのサーバーのアドレスを返してくれましたが、google DNS をはじめとするパブリック DNS を使用したほうが速くなるということも多数報告されています。どこがいいかはご家庭ごとに異なると思いますので、ご自分の環境で一番よくなる forwarder を見つけましょう。

さて、DNS は期待通りに動きましたでしょうか?今回は ISP 提供のブロードバンドルータ付属の DHCP が全く使えないものなので ( 失礼しました、カスタマイズがほぼ全くできない機種に訂正 )、リゾルバの設定を直接触って DNS のみの動作確認になってしまいました。 DHCP をご紹介できる時にはWindows PC でもう少し、スマートにできると思います。一昔前には Cisco の ISR ルータをブロードバンドルータに仕立てて使っていましたが、回線速度を 100M から 1G に変えたときにルータの使用をあきらめました。必要なスペックを満たそうとすると、個人では手が出ないお値段になってしまうので 🙂 便利でよかったのですが。。。


プラハの旧市街地には馬車が普通に走っていました。そこの角から鎧を着た騎士が出てきても違和感はないと思います 🙂

旧市街地からカレル橋を渡ったところにある古いレストランで MPLS プロバイダと会食ミーティングを行いました。夜にはランプがいくつか灯り幻想的な夜景を見ることができました。

こちらの写真は会食ミーティング翌日にプラハから飛び立つ飛行機の窓からの撮影となります。宿から空港までタクシーを使用したのですが、乗る前にカードは使えるか?という問いに大丈夫、任せとき!と愛想のいい返事が返ってきました。安心して空港へお願いしたのですが、いざ降りる時に、カードリーダの電池がないことが判明!何をどうしたか定かではありませんが、ブツブツ言いながら車のトランクなどをひっかき回し、何とか電源を確保して、到着から20分くらいしてから解放となりました。カードを読むことができなかったらどうなっていたのでしょうか 🙂

チェコからポーランドを抜けて、バルト海へ入るところ。雲も少なく快適なフライトでした。目的地はヘルシンキ空港です。

ヘルシンキから関空への直行便への乗り継ぎを待つ間は、いつものようにスターバックスのコーヒーを片手に待ちます。( 因みに、コロナの影響による旅客数の減少、あるいはロシアの飛行禁止区域の迂回に時間と燃料がかかりすぎることにより、関空との間の直行便は現在無いようで、ヘルシンキからの直行便は 2022 年 6 月現在、成田発着しかないようです。)

JAL の airbus A330-300。勿論エコノミーシートです 🙂 この写真は関空行きですが、このゲートのすぐ隣には10分か20分違いで離陸する成田行きの直行便も止まっていました。コロナ由来の移動の制限が大きく緩和され、旅客数も回復することを期待します。。。戦争終了も。。。

以下広告


コメント