阪急奴の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を無効にしてしまいます。
- SELinuxの無効化
# 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など、外のDNSのIPアドレスを入力します。
nameserver 8.8.8.8
また、dnsmasqにはdhcp機能もあります。これを利用するとローカルネットワークに関する設定を一元化できるかもしれません。
まとめ
ね?簡単でしょ?