できること

ラズパイ(Raspberry Pi)とDnsmasqで作るDNSサーバ

ラズパイ(Raspberry Pi)は小型のマイコンボードとして人気が高く、Lチカや赤外線センサーを使ったセンサーライトなどの電子工作が数多く紹介されています。試したことがある方も多いのではないでしょうか?
しかしラズパイは、ただのマイコンボードではありません。その機能はLinuxを搭載したパソコンと同じです。Linuxはネットワークに強いOSとして知られ、ラズパイもその特徴を受け継いでいます。

今回は、このネットワークに強いという特徴を生かし、ラズパイでDNSサーバを構築してみます。
信頼性もあり、家庭用や小規模オフィスのネットワークでしたら、そのまま使用できるでしょう。
また、「DNSサーバってなに?」という方に向けて、DNSサーバの役割から説明します。

how-to-use-raspberry-pi-as-dns-server-01

ラズパイの外観

 

目次

  1. DNSサーバはネットワーク上の住所とIPアドレスを結びつける
    1. 1.1. DNSサーバとは
    2. 1.2. IPアドレスに対応する住所とは
  2. ローカルネットワーク内にDNSサーバを置く利点
    1. 2.1. Webサイトの閲覧速度をアップ
    2. 2.2. DNSフィルタリングで不快なWebサイトをブロック
    3. 2.3. 名前解決をhostsからDNSサーバへ
  3. DNSサーバの構築
    1. 3.1. ラズパイに固定IPアドレスを割り当てる
    2. 3.2. DNSサーバとしてDnsmasqを使用する
  4. Dnsmasqの設定
    1. 4.1. 設定ファイルを開く
    2. 4.2. 問い合わせをローカルネットワーク内に限定する
    3. 4.3. 上位のDNSサーバを指定する
    4. 4.4. DNSフィルタリングの設定
    5. 4.5. キャッシュサイズの設定
    6. 4.6. Dnsmasqの再起動
    7. 4.7. 構築したDNSサーバを使用する
  5. セキュリティーアップデートを有効にする
  6. まとめ

 

1. DNSサーバはネットワーク上の住所とIPアドレスを結びつける

1.1. DNSサーバとは

DNSサーバの「DNS」は「ドメインネームシステム(Domain Name System)」の略です。
DNSサーバは、ネットワーク上の機器同士が、通信相手を特定するために使用するIPアドレスを、人間が覚えやすい形式に対応付けるデータベースです。

例えば、ブラウザでデバプラのWebサイトを開くことを想定してください。アドレスバーには「deviceplus.jp」と入力します。

デバプラのサーバに割り当てられているIPアドレスは「52.196.216.170」なので、このIPアドレスを直接入力してWebサイトを開くこともできますが、deviceplus.jpの方が覚えやすいはずです。
(IPアドレスを使ってWebサイトにアクセスしようとするとブラウザから警告が出ます。悪意のあるWebサイトに接続してしまう場合もありますのでお勧めはしません。)

DNSサーバは、このdeviceplus.jpのような文字列とIPアドレス(ここでは52.196.216.170)の対応を記憶しておき、ブラウザなどから「deviceplus.jpのIPアドレスは?」という問い合わせに対して「52.196.216.170です」というように回答します。

これによって、人間がブラウザなどに入力する時には分かりやすい文字列を使用し、パソコンがインターネット上のサーバに接続する際にはIPアドレスを元に接続を行います。
分かりやすいように、これ以降、この文字列のことを「住所」と呼び説明を進めます。

このDNSサーバに対して「住所に対応するIPアドレスを問い合わせる」ことを「正引き」、反対に「IPアドレスから対応する住所を問い合わせる」ことを「逆引き」と呼びます。
正引き・逆引きは「名前解決」と呼ぶ場合もありますが、この場合のほとんどは正引きのことを指します。
また、DNSサーバが記憶する「住所とIPアドレスの対応」を「レコード」と呼びます。

1.2. IPアドレスに対応する住所とは

このIPアドレスに対応する住所のことを『FQDN(「Fully Qualified Domain Name」「完全修飾ドメイン名」)』と呼びます。
FQDNは「aaa.bbb」のような表記になっています。

aaaの部分を「ホスト名」と呼びます。ホストとはネットワークに接続される機器(サーバ・パソコン・デバイスなど)を識別するための名前です。
bbbの部分を「ドメイン名」と呼びます。ドメインは日本語に「領域」などと訳されます。
「ホスト名」と「ドメイン名」の区切り記号はドット(.)です。

aaa.bbbの意味は、「bbbという名前の領域の中にある、aaaという名前のホスト」となります。
ネットワークに接続する機器が多いときは、ドメインを階層構造にすることができます。aaa.bbb.cccと書けば、これは「領域cccの中にある、領域bbbの中にある、ホストaaa」という意味です。
区切り記号は同じくドットです。

人間社会の「住所」で例えると、「領域ccc」が都道府県、「領域bbb」が市町村、「ホストaaa」が家を特定する番地のようなものです。

ローカルネットワーク上では、ドメイン名(領域)は自由に決めることができます。インターネット上に公開する場合は、管理団体に申請し利用を許可してもらう必要があります。
上のaaa.bbb.cccの例で言うと、cccの部分は「トップレベルドメイン」と呼ばれ、それぞれに管理団体があります。com・net・co.jp・jpなどがトップレベルドメインです。

英語版のデバプラにアクセスするURLはhttps://www.deviceplus.comですが、これは「トップレベルドメイン(com)が管理している領域の中にdeviceplusがあり、その中にあるwwwという名前のホスト(WEBサーバ)」がWebページを管理しているという意味です。

ただし、FQDNという呼び方は、あまり一般的ではないようなので注意が必要です。
ホスト名を含めてドメイン名と呼んだり、ドメイン名を含めてホスト名と呼んだりするケースも多いので、何を指しているのかは注意が必要です。

また、DNSサーバはFQDNに対応するIPアドレスを回答しますが、ホスト名だけやドメイン名だけでも検索できます。

 

2. ローカルネットワーク内にDNSサーバを置く利点

あまり意識することはありませんが、皆さんも日常的にDNSサーバを使用しています。

一般的に家庭用のWi-Fiルーターなどは、プロバイダーが提供するネットワークにログインして、そこを出入り口にしてインターネットに接続できるようにします。このログインの際にプロバイダーから接続情報が提供されます。
情報にはDNSサーバも含まれ、通常はプロバイダーが提供するDNSサーバです。

パソコンやスマートフォンなどのデバイスをWi-Fiルーター(ネットワーク)に接続すると、IPアドレスと共に、このDNSサーバを使用するように指示されます。

ここでは、このプロバイダーが指定するDNSサーバではなく、ローカルネットワーク内にDNSサーバを構築する利点を紹介します。

2.1. Webサイトの閲覧速度をアップ

プロバイダーが提供するDNSサーバは、ネット回線を通した先にあります。
インターネットを介してFQDNとIPアドレスの対応(レコード)を問い合わせするよりも、ローカルネットワーク内の通信の方が高速なので、ローカルネットワーク内にDNSサーバを構築する方が高速化につながります。

条件にもよりますが、Webサイトの表示を数100msec(ミリ秒)程度短縮することができます。100msecは0.1秒です。遅延が0.1秒を超えると人間にも感じるようになります。

また、DNSサーバは一度問い合わせたレコードを一時的に保存(「キャッシュ」と呼びます)します。このキャッシュする時間をTTL(Time-To-Live)と呼びます。
キャッシュにより、頻繁にアクセスするWebサイトの表示はさらに高速化されます。

実を言うと、ほとんどのオペレーションシステムにも似たようなキャッシュの機能があるので、インターネットにアクセスする機器が1台だけの場合は、ローカルネットワーク内にDNSサーバを置いても高速化にはつながりません。
一方で、インターネットにアクセスする機器が複数台ある場合は、ローカルネットワーク内にDNSサーバを置く方が良いでしょう。ローカルネットワーク内にある全ての機器でキャッシュを共有することができます。

2.2. DNSフィルタリングで不快なWebサイトをブロック

ローカルネットワーク内のDNSサーバは、不快なWebサイトのブロックができます。
Webサイトの表示を遅くするような広告を配信するサーバや、家族に青少年がいる場合など、特定のFQDNにアクセスしたくないケースがあります。その場合は対象となるFQDNの一覧をDNSサーバに設定するだけで、ローカルネットワーク内の全ての機器からアクセスできなくなります。

この方法は、一般的に「DNSフィルタリング」と呼ばれています。海外では国中のDNSサーバにDNSフィルタリングを設定して、国内から都合の悪い海外のWebサイトにアクセス出来ないようすることもできます。

ローカルネットワーク内のDNSサーバを使ったDNSフィルタリングは手軽で効果的な方法ですが抜け道も存在します。使用している機器のネットワーク設定を変更して、DNSフィルタリングの設定がないDNSサーバを使用するようにしてしまえばブロックは無効にできます。

2.3. 名前解決をhostsからDNSサーバへ

ローカルネットワーク内に、ネットワークプリンターや自作のメディアサーバなどがある場合は、IPアドレスで直接アクセスするよりホスト名を使うと保守が容易になります。
この際に、ホストとIPアドレスの対応を使用しているDNSサーバに登録できれば良いのですが、プロバイダーが提供するDNSサーバに自分が名付けたホストを登録することはできません。

そこで、ローカルネットワーク内にDNSサーバがない場合、自分が名付けたホストに接続するためには、全ての機器のhostsと呼ばれるデータベースにレコードを追加する方法が取られます。
hostsはテキストファイルなので修正自体は簡単ですが、ネットワーク内に複数の機器がある場合、全ての機器でhostsの管理を行わなければなりません。

さらに問題となるのは、このホストに対応するIPアドレスが変わった場合です。
配置換えなどでホストのIPアドレスが換わった際には、その度に全ての機器でhostsの修正を行う必要があります。
ローカルネットワーク内にDNSサーバを設置すれば、対応するホストのレコードを変更するだけで対応できます。

 

3. DNSサーバの構築

DNSサーバの機能と、ローカルネットワーク内にDNSサーバを構築する利点について理解できたと思います。
それでは、ラズパイを使ってDNSサーバを構築しましょう。

3.1. ラズパイに固定IPアドレスを割り当てる

DNSサーバを構築するラズパイはIPアドレスを固定しましょう。
もし、DHCPによって自動的に割り当てられたIPアドレスを使用している場合は、将来的に問題が発生します。

DHCPはネットワークに接続する機器にIPアドレスなどを自動的に割り当てる機能ですが、割り当てたIPアドレスを、ほかの機器に再割当するケースがあります。特にネットワークにしばらく接続していない状態が続いたあとに再接続すると、別のIPアドレスが割り当てられることが多いようです。

DNSサーバには、直接IPアドレスを指定してアクセスするため、IPアドレスが変わってしまうとそれまで接続できていたDNSサーバにアクセスできなくなってしまいます。

そこで、DNSサーバを構築するラズパイには決まったIPアドレスを割り当てます。
ラズパイに限らず、ほかの機器からアクセスされるような用途ではIPアドレスを固定しておく方が安心です。IPアドレスを固定する方法は機器ごとに異なるので、それぞれのマニュアルを参照してください。

3.2. DNSサーバとしてDnsmasqを使用する

本記事ではDNSサーバとしてDnsmasqを使用します。ラズパイのIPアドレスを固定したらDnsmasqをインストールします。

DNSサーバとしてはbind(バインド)の方が有名で、インターネット上で稼働しているDNSサーバの半数はbindと言われています。
bindはセキュリティーにも配慮し、さまざまな利用方法を想定した複雑な設定ができます。

今回使用するDnsmasqはbindほど詳細な設定項目はありませんが、初心者でも容易に使えるのが特徴です。
詳細な設定ができないからと言って信頼性が低いわけではありません。家庭用や小規模オフィス向けでしたら、問題なく使うことができます。

Dnsmasqに限った話ではありませんが、ローカルネットワーク内にサーバを設置するのはセキュリティホールの影響を受けたり、外部から攻撃されたりする可能性もあります。サーバに余計なアプリケーションを入れないようにして、定期的なアップデートを心がけるなど、適切な管理を忘れないようにしましょう。

最初にラズパイのOSを最新の状態にします。ターミナル上から以下のコマンドを入力してください。

sudo apt update && sudo apt upgrade -y

続いて、Dnsmasqをインストールします。

sudo apt install dnsmasq -y

以上です。これでローカルネットワーク内にDNSサーバが構築できました。

 

4. Dnsmasqの設定

DnsmasqはインストールするだけでDNSサーバとして機能します。ただし初期設定の状態では、あまり便利とは言えないので、いくつか設定を変更します。
注意が必要な点を中心に解説します。

4.1.設定ファイルを開く

設定の変更は、設定ファイルを修正することで行います。
設定ファイルは、普通のテキストファイルなので、ターミナル上からテキストエディタを起動して修正します。
以下のコマンドを入力してください。nanoはターミナル上で動作するテキストエディタです。

sudo nano /etc/dnsmasq.conf

設定ファイル内のシャープ記号(#)から始まる行はコメントです。英語ですが設定項目の詳細が記載されているので参考になるでしょう。

4.2.問い合わせをローカルネットワーク内に限定する

会社のように、ネットワーク上に数多くのデバイスが存在する場合は、いくつかの領域に分割すると保守が容易になります。DNSサーバも領域ごとに置かれ、それぞれは領域内に接続されるホストのレコードを管理します。管理していないレコードの問い合わせは、さらに上の領域を管理するDNSサーバ(上位のDNSサーバ)に問い合わせを転送します。

通常、家庭用や小規模オフィスのネットワークであれば複数の領域に分割する必要性はありません。上位のDNSサーバには、プロバイダーが提供するDNSサーバを指定します。
独自に割り当てたホストとIPアドレスの対応をプロバイダーのDNSサーバに問い合わせても意味がないので、領域が指定されていないホストの問い合わせ(FQDNドメイン名を含まない場合)は、上位のDNSサーバに転送しないようにします。

設定ファイルの上の方に#domain-neededと#bogus-privの2行があるはずです。

how-to-use-raspberry-pi-as-dns-server-02

設定画面(1)

 

行の先頭にある、シャープ記号を削除すれば、設定が有効になります。
設定項目domain-neededを有効にすると、FQDNドメイン名を含まない問い合わせは上位のDNSサーバに転送しないようになります。

bogus-privを有効にするとプライベートIPアドレスを上位のDNSサーバに転送しないようになります。これはIPアドレスからホスト名を検索する問い合わせに対応します。domain-neededと同様の理由で、プライベートIPアドレスを上位のDNSサーバに問い合わせても意味がないからです。

4.3.上位のDNSサーバを指定する

上位のDNSサーバにはプロバイダーが提供するDNSサーバを指定します。

how-to-use-raspberry-pi-as-dns-server-03

設定画面(2)

 

先ほどの画面を下にスクロールしていくと、#no-resolvと書かれている行があります。この行の先頭にあるシャープ記号を削除して有効化します。
少し下に
#server=/localnet/192.168.0.1
という行があるので削除してください。

その後、使用している環境にあった値を新たに追記します。
ここは通常、プロバイダーから指定された値を使用するのが一般的ですが、ここではGoogleが提供しているパブリックDNSサーバを指定します。このDNSサーバは高速で信頼性が高いことで知られています。また、DNSサーバのIPアドレスが簡単な数字の組み合わせなので覚えておくと便利です。

以下の行を追加します。

server=8.8.8.8
server=8.8.4.4

プロバイダーが提供するDNSサーバや、ほかのパブリックDNSサーバを使用する場合は、IPアドレスの部分を書き換えてください。上位のDNSサーバを1台しか使用しない場合は、追加する行は1行でかまいません。

例えばCloudFlareが提供するDNSサーバのIPアドレスは1.1.1.1なので、これを使用する場合は
server=1.1.1.1
の1行となります。

そのほかのパブリックDNSサーバは一覧(英語)を参照してください。

4.4.DNSフィルタリングの設定

すぐ下に
#address=/double-click.net/127.0.0.1
の行があるはずです。

この設定は、自作の機器に便宜上ドメイン名をつけて管理する時に便利です。大規模なネットワークのように物理的に領域に分割して機器を管理するわけではありません。
ローカルネットワーク内のみからアクセスされる機器であれば、ドメイン名は何でも構いません。ただし、トップドメインの一覧にあるものは避けてください。

how-to-use-raspberry-pi-as-dns-server-03

設定画面(3)

 

独自のドメイン名にはlan・localdomain・localnetなどがよく使われます。以下はドメイン名にlanを使用した例です。

以下の1行を追加します。

address=/retropie.lan/192.168.0.6

これは、RetroPieをインストールしてゲームサーバを構築したラズパイにドメイン名を割り当てる場合の例です。
ラズパイのIPアドレスは192.168.0.6です。このラズパイにアクセスしやすいようにretropie.lanと名付けました。
これにより、ローカルネットワーク内ではretropie.lanの名前で、このラズパイにアクセス出来ます。

固定のIPアドレスを割り当てる際には、3桁目の数字まで(192.168.0.6の例では192.168.0の部分)はお使いのWi-Fiルーターと同じにする必要があります。
4桁目の数字は、ネットワーク内で重複しないように、1〜254の範囲で割り当てましょう。 一般的に1はルーターなので、2以降を使用します。

この設定をDNSフィルタリングに使う場合は次のようにします。

address=/www.nickelback.com/127.0.0.1

IPアドレスの127.0.0.1を変える必要はありません。Dnsmasqをインストールしたラズパイを指しています。
DNSフィルタリングしたいFQDNの数だけ、この行をコピーしてFQDNの部分を書き換えるだけです。

またこの方法は、Webアプリケーションのテスト時など、インターネット上の実在するサーバにアクセスすると問題が発生するようなケースにも役立ちます。
インターネット上に実在するサーバのFQDNをここに記述すればローカルネットワーク内だけでテストは完結します。

4.5.キャッシュサイズの設定

初期設定ではDnsmasqは150レコードまでFQDNとIPアドレスの対応を記録します。通常の利用方法では150でも問題はないでしょう。
この値を大きくすれば、インターネットへのアクセス時間が改善する可能性もありますが、その分メモリを使用するので環境に合わせて調整してください。

レコードは、1件あたり100Byte程度しか消費しません。ラズパイをDNSサーバ専用として使用するのであれば、メモリには余裕があるはずです。メモリ使用量を見ながらキャッシュのサイズを調整してみましょう。

how-to-use-raspberry-pi-as-dns-server-04

設定画面(4)

 

下の方にスクロールすると#cache-size=150の記述があるはずです。行頭のシャープ記号を削除して150の部分を大きな数値に変更します。
実験では15000としました。

4.6.Dnsmasqの再起動

これでカスタマイズは完了です。テキストエディタを保存して終了してください。
その後、Dnsmasqを再起動して設定を読み込み直します。以下のコマンドを入力してください。

sudo systemctl restart dnsmasq

4.7.構築したDNSサーバを使用する

設定ファイルの記述に間違いがなければ、起動後すぐにDnsmasqはDNSサーバとして機能します。
ネットワーク内にある全ての機器のネットワーク設定を変更して、今回構築したDNSサーバのIPアドレスを指定します。
この作業が面倒な場合は、Wi-Fiルーターが参照するDNSサーバを、プロバイダーから自動的に指定されたものから構築したDNSサーバに変更する方法もあります。難易度が高いのであまりお勧めしません。

 

5. セキュリティーアップデートを有効にする

セキュリティー対策も重要です。インターネットへのアクセスはDNSサーバを基点にするため、DNSサーバは悪意のあるハッカーに狙われやすいアプリケーションと言われます。

一般的にWi-Fiルーターなどのインターネットとの出入り口になる機器は、インターネット側からローカルネットワーク内へ勝手にアクセス出来ないように設定されています。
とはいえ、自動的にセキュリティーアップデートを行うことをお勧めします。

unattended-upgradesというパッケージ(アプリケーション)を使えば、自動的にセキュリティーアップデートを行えます。
インストールは簡単です。以下のコマンドを入力してください。

sudo apt install unattended-upgrades -y

ラズパイのOSのバージョンがBusterなら、毎日セキュリティーアップデートを行うように初期設定されています。

そのほかにも、ラズパイの初期パスワードを変更しておくのも有効なセキュリティー対策です。また、特定のパソコンのみSSH経由でラズパイにログイン出来るように設定するのもお勧めです。
ラズパイに初期設定されているパスワードの変更やSSH接続の有効化は、ターミナル上でraspi-configコマンドを入力します。使用方法は公式マニュアル(英語)を参照してください。

 

6. まとめ

インターネット上にあるラズパイの記事は、ほとんどがLチカなどの簡単な電子工作を紹介するものです。
ラズパイは、小型なマイコンボードとしても優秀ですが、その中身はLinuxが動作するパソコンです。

LinuxなどのUNIX系のOSは、ネットワークを構築するための機能が豊富であり、もちろんラズパイでも利用できます。
そのため本記事のようなDNSサーバも簡単に構築できるので、ぜひ、ラズパイの持つ機能を隅々まで活用してください。

アバター画像

エレクトロニクスやメカトロニクスを愛するみなさんに、深く愛されるサイトを目指してDevice Plusを運営中。

https://deviceplus.jp

IRKitではじめるIoT