阪急奴の3分クッキング (dnsmasqを使ったDNSサーバの構築)

この記事はSLP KBIT Advent Calendar 2015の6日目の記事です。

はじめに

ある日、家でサーバをたてて公開したのですが、家の外からはグローバルIPドメイン名で繋がるのに家の中からローカルIPはつながらないという現象が起きました。原因は、ルータのNAT機能にありました。一般的な家庭用のルータだと、外(WAN側)からのアクセスの場合はNAT機能が働くのですが、中(LAN側)からのアクセスの場合はNAT機能が働かないのです。

対処法としてはいくつかあります。

  • LAN内で利用する全ての端末のhostsファイルにIPアドレスとホスト名を記述する
    → サーバが増えるごとに全ての端末のhostsファイルを書き換えないといけない。 → ノートPCに設定してしまうと外から繋がらなくなる
  • プロキシサーバを使う
    → せっかく家にサーバがあるのにスピードが遅くなる
  • LAN内にDNSサーバをたてて、LAN内のサーバの名前解決を行う
    →これが現実的?

しかし、DNSサーバといえばBINDが有名ですが、BIND設定が非常に複雑で面倒臭いのです。家の中のたかだか数台のサーバの名前解決のためとなるとコストが大きすぎます。

ここで便利なのがdnsmasqと呼ばれるものです。このdnsmasqは/etc/hostsを見て名前解決を行ってくれるのです。なので、サーバが増えたりしても安心。

ってことで、dnsmasqを導入してDNSサーバを作っていきましょう。

材料

  • CentOS 7.1 (minimalでインストール) ・・・ 1

作り方

1. まず、yumでdnsmasqをインストールします。
# yum install dnsmasq
2. hostsファイルを編集します。
# vi /etc/hosts

名前解決をしたいサーバのIPアドレス、ホスト名、ホスト名の別名(あれば)の順にスペース区切りで入力していきます。

192.168.0.10 hoge.example.com hoge  
192.168.0.11 piyo.example.com  
192.168.0.12 fuga.example.com fuga  
3. SELinuxとFirewalldを無効にします。

このDNSサーバ自体は外部に公開しないので、SELinuxとFirewalldを無効にしてしまいます。

# vi /etc/selinux/config
SELINUX=enforcing

SELINUX=disabled

に変更します。

  • Firewalldの無効化
# systemctl disable firewalld
4. dnsmasqが自動起動するようにします。
# systemctl enable dnsmasq
5. 設定を有効にするため、OSを再起動します
# reboot
6. ルータにDNSの例外設定をします。

上で登録したドメイン名の場合は、ローカルのDNSに聞くように設定します。

7. 完成

おまけ

すべての名前解決をローカルのDNSサーバにさせたい場合は、以下のようにします。

# vi /etc/resolv.conf

nameserverのあとにプロバイダのDNSなど、外のDNSIPアドレスを入力します。

nameserver 8.8.8.8

また、dnsmasqにはdhcp機能もあります。これを利用するとローカルネットワークに関する設定を一元化できるかもしれません。

まとめ

ね?簡単でしょ?