dnsmasqでDNSおよびDHCPサービスを強化する

 ネットワークが小規模で、ユーザのほとんどが主にインターネット上のサービスを利用している場合は、名前ではなくIPアドレスの数値を各ノードに割り当てておけばよい。しかし、ネットワークが拡大して組織内のサービス(Wiki、メールサーバ、メディアサーバなど)がオンライン化されると、個々のアドレス値をいちいち覚えきれなくなってくる。解決策の1つが、dnsmasqを使ってドメインネームサーバ(DNS:Domain Name Server)と動的ホスト構成プロトコル(DHCP:Dynamic Host Configuration Protocol)を実装することだ。そうすれば、外部DNSアドレスをキャッシュしてパフォーマンスの向上が図れるほか、ネットワークのすべてのメンバへのIPアドレスの動的割り当てや、あらゆる管理の一元化が可能になる。本記事ではその方法を紹介しよう。

 SOHO(個人および小規模事業者)ネットワークの大半は、ネットワークアドレス変換(NAT:Network Address Translation)とルーティング不可(non-routable)のIPアドレス範囲を使って構築されている。ネットワークの管理者は、新しいマシンが加わるたびに、使用中のアドレス範囲(例:192.168.168.*)から利用可能なIPアドレスを順に割り当てていけばよい。しかし、プライベートネットワーク上にあるこうしたノードのIPアドレスは、組織のパブリックDNSサーバーにはわからない。よって、ネットワークのユーザは、覚えにくいIPアドレス値を使って組織内のネットワークサービスを利用しなければならない。

 これを避けるには、dnsmasqをインストールしてネットワーク上のすべてのノードの情報を覚えさせ、DNSサーバ化して、それらの情報を提供するようにすればよい。処理を簡単にするために、dnsmasqの設定によってDHCPプロトコルで各ノードにIPアドレスを割り当てさせることも可能だ。さらに、特定のシステムに固定のIPアドレスを持たせる必要がある場合は、dnsmasqのDHCPサーバの設定により、システムのメディアアクセス制御(MAC:Media Access Control)アドレス、つまり物理アドレスに基づいてIPアドレスを提供するようにすればよい。これにより、LANのIPアドレス設定情報のすべてを1か所に集めることができる。

 dnsmasqのインストールは非常に簡単だ。ソースからのビルドも「make ; make install」を実行するだけだが、たいていのLinuxディストリビューションには、インストール可能なパッケージが用意されている。dnsmasqには、OpenWRTやTomatoなど、ルータ用のオープンソース・ファームウェアも入っているので、DNS、DHCP、ルーティングの各機能を1台にまとめることも可能だ。

 標準的な設定のシステムであれば、dnsmasqを起動した時点でネットワークのDNSサーバとして稼働する準備が整っている。DNS検索の要求が来ると、dnsmasqはまず「/etc/hosts」ファイルを参照し、要求に一致するエントリがないかを調べる。一致するエントリがあれば、対応するIPアドレスを返す。「/etc/hosts」ファイルの中身は次のようになっている。

192.168.168.5  haggard.example.com haggard
192.168.168.6  grant.example.com grant
192.168.168.7  dent.example.com dent

 この場合、grant.example.comの要求が来ると、dnsmasqは192.168.168.6を返す。

 一致するものが「/etc/hosts」になければ、dnsmasqは「/etc/resolv.conf」に記されている“本来”のネームサーバに要求を転送する。Linuxシステムの「/etc/resolv.conf」ファイルは次のようになっている。

nameserver 24.21.23.54
nameserver 15.16.17.18

 なお、実在する外部のドメイン名は、より優先度の高い「/etc/hosts」のエントリによってマスクできる。

 こうしてdnsmasqシステムのセットアップが済むと、ネットワークのほかのシステムではdnsmasqのIPアドレスをドメインネームサーバとして入力できる。そうすれば、IPアドレスではなくホスト名を使ってTCP/IPネットワークのリソースにアクセスできるようになる。またdnsmasqには、インターネットのDNSサーバから取得したIPアドレスをキャッシュして同じアドレスを探す以降の要求に再利用することで、パフォーマンスが向上するという利点もある。

 ネットワークでの基本的なDNSサービスのセットアップが済んだら、ネットワーク設定のほかの部分にも目を向けてみよう。1台のノートPCをいくつかのネットワークで使っているなら、接続するネットワークに合わせて自動設定が行えると便利だろう。また、起動時のネットワーク情報の自動取得に簡単に対応できるものであれば、新しいシステムのインストールやネットワーク型の次世代マルチメディア機器のセットアップも容易になる。

 dnsmasqには、DNS機能との連携性に優れたDHCPサーバ機能が組み込まれている。そのため、すでに別のDHCPサーバを(ルータなどで)利用していても、そちらを無効にしてdnsmasqのDHCPサービスに切り替えたいという人もいるだろう。

 dnsmasqでDHCPを有効にするには、dnsmasq.confファイルの編集を行う(ほとんどのLinuxディストリビューションでは「/etc」内にある)。「dhcp-range」で検索をかけると、コメントアウトされた行が見つかるはずなので、編集して次のような形にする。

dhcp-range=192.168.168.200,192.168.168.250,12h

 この設定により、dnsmasqは192.168.168.200~250のアドレスプールからIPアドレスの割り当てを行うようになる。なお、自分でIPアドレスを割り当てる際には、この範囲内のアドレスを使ってはならない。行末の「12h」は、各アドレスの“リース(貸し出し)”時間が12時間に設定されていることを示す。つまり、アドレスは12時間しか確保されず、それ以上使う場合は改めて要求を出さなければならない。

 また「domain」フィールドには、使用するドメインを設定する必要がある。ドメインの“本来”のサーバにアクセスするつもりがなければ、適当なドメインを1つ指定しておけばよい。一番簡単なのは、自分で登録したドメインを使うことだ。たとえば「example.com」をドメインとして使うには、dnsmasq.confファイルの該当行を次のようにする。

domain=example.com

 さらに、ネットワークのデフォルトルータ以外のマシンでdnsmasqを実行する場合は、もう1つ変更が必要になる。「dhcp-option」をキーワードにしてdnsmasq.confファイルを検索し、次のような行をコメント化せずに追加する。

dhcp-option=3,192.168.168.1

 最初の「3」は、“デフォルトルート”オプションが設定されていることを示す。この行全体は、IPアドレスが割り当てられたすべてのクライアントにデフォルトルータが192.168.168.1であることを伝えるようDHCPサーバに指示(ネットワークのデフォルトルータのアドレスを指定)している。dnsmasqを再起動すると、それ以降はネットワークにマシンが加わるたびに、指定されたIPアドレス範囲から利用可能なアドレスを順番に割り当てると共に、適切なデフォルトルートを設定してくれる。

 DHCP経由でネットワーク設定を取得するマシンで、いつ要求しても同じIPアドレスが得られるようにしたいことがある。たとえば、ファイル転送とバックアップを容易にするために、ノートPCに固定のアドレスおよび名前を与えたい場合などだ。

 そんなときは、Ethernetネットワークに参加するデバイスに割り当てられた固有の識別子、MACアドレス(物理アドレス)を使えばよい。アドレス取得のためのDHCP要求は、デバイスのMACアドレスと共にブロードキャストされる。MACアドレスは2桁の16進数を6つ並べた形になっており(例:00:04:5A:84:EA:8D)、システムのIPアドレスとは別物である。Ethernetカードを取り換えた場合、そのマシンのMACアドレスは変わるが、おそらくIPアドレスのほうは変わらないだろう。

 デバイスのMACアドレスを確かめる方法はいくつかある。たいていはEthernetポート付近に印字されている。また、Linuxシステムの場合は、ifconfigコマンドを実行するとマシン上のEthernetデバイスの情報が表示されるが、その“HWADDR”の部分に記されているのがMACアドレスである。どちらの方法でも確認できなければ、dnsmasqを実行しているシステムのsyslogをチェックするとよい。問題のマシンからIPアドレス取得のDHCP要求が出されると、そのMACアドレスがログに記録される。

 システムのMACアドレスがわかったら、それに対してIPアドレスおよびドメイン名を割り当てることができる。dhcp-hostファイルに「dhcp-host」という記述がないか探してみよう。たとえば、マシンのMACアドレス「00:04:5A:84:EA:8D」にIPアドレス「192.168.168.12」と名前「Howard」を割り当てたい 場合は、dnsmasqファイルに次のようなエントリを追加すればよい。

dchp-host=00:04:5A:84:EA:8D,192.168.168.12,howard

 続いて、DHCPを利用するようにこのマシンを設定し、dnsmasqを再起動する。

 「dhcp-host」の行は好きなだけ追加できる。実際、マシンごとに設定を行うよりは、この方法ですべての固定IPアドレスを割り当てたほうが便利だろう。そうすれば、ネットワークのすべてのアドレス情報を1つのファイル(dnsmasq.conf)で一元管理できる。それに、個々のクライアントでOSの再インストールを行っても、ネットワークの設定が保存される。

 ここで紹介した方法でdnsmasqの設定を行えば、ネットワークに関する機能をかなり強化できる。また、マシンを場当たり的に集めただけの環境から、拡張が容易で管理の行き届いた環境への移行をはかるうえでも大いに参考になるだろう。

Linux.com 原文(2008年10月03日)