corednsを使って30分で作る社内用DNS


はじめに

社内では、ネットワークはあってもDNSを立てていなかったので、社内サーバーにアクセスするときは常にアドレスの直打ちをしていた。
その方法だとサーバーのアドレスが変更した時などの周知が大変になるなど、運用に難があったため、さくっと社内用のDNSを立てようとなった。
使うDNSは最近kubernetes関係で流行っているcorednsを使う。

ゴール

アドレスの直打ちではなく、名前入力だけで社内サーバーにアクセスできるようになる。

環境

MBP Sierra OS
Ubuntu Server 16.04(DNSサーバー ドメイン名:hoge.local)
Ubuntu Server 18.04(名前検索用サーバー ホスト名:piyo)

coredns Ver.1.1.3

Goのインストール

corednsはGolangで動いているが、サーバーにGoを入れていなかったため、はじめにGoをインストールする

$ sudo apt install golang-1.9

Goの1.9を直接インストールした場合はリンクがついていないため、手動でリンクをつけないといけない

$ sudo ln -s /usr/lib/go-1.9/bin/go /usr/bin/go
$ sudo ln -s /usr/lib/go-1.9/bin/gofmt /usr/bin/gofmt

この状態でならGoは起動するはず

$ go version
go version go1.9.2 linux/amd64

corednsのインストール

corednsのインストールはdockerで行う方法もあるが、インストール途中で失敗(Makefileが無いとメセージが出る)したため、公式ドキュメントのgitをクローンして入れる。

CoreDNS 公式

$ export GOPATH=${GOPATH-~/go}
$ mkdir -p $GOPATH/src/github.com/coredns
$ cd $GOPATH/src/github.com/coredns/
$ git clone https://github.com/coredns/coredns.git
$ cd coredns
$ make CHECKS= godeps all

インストールがうまくいけば下記コマンドが使える(makeしたパス内でしか動かない)

$ ./coredns -version
CoreDNS-1.1.3
linux/amd64, go1.9.2, 6fcb2dd

corednsの設定

Corefileの記述

corednsは「Corefile」を参照して名前解決を行う。
makeしたあとはこのCorefileがなかったため自作をする

$ sudo vi Corefile

. {
    errors
    log . {
        class denial
    }
    cache
    whoami
    proxy . 8.8.8.8:53 {
        protocol https_google
    }
}

 local {
    hosts /etc/hosts local {
      192.168.1.101 piyo.foo.local
    }
    errors
    log
    whoami
}

/etc/hostsの設定

今回は名前解決するクライアントが少なかったため、静的にhostsファイルを追加していくスタイルにした。

$ sudo vi /etc/hosts

192.168.1.101 piyo.foo.local

これで準備は完了したため実際にcorednsを起動してみる

特にオプションを記載しなければポートは53,設定ファイルはCorefileを読むようになっている

$ sudo ./coredns 

mac側の設定

macのdns設定を今回設定したサーバーのアドレスに変更する

主な手順は
Wifiのアイコンから「ネットワーク環境設定を開く」→詳細のDNSタブにサーバーのアドレスを追加して適用

でいける

mac側でnslookupを実行し、名前解決をしてみる

$ nslookup
Name:    piyo.foo.local
Address: 192.168.1.101

名前解決ができている

pingも同様に飛ばしてみるとちゃんと届くはず

最終操作

無事設定が終わったら、サーバーのバックグラウンドで動き続けるようにしておく

$ nohup sudo ./coredns &

終わりに

kubernetesの環境によく使われるcorednsだが、社内用dnsとしてもとても簡単に使える
動的な設定ではetcdを使うそうだが、今回は使わなかったためネットワークが大きくなった際にまた挑戦したい

つまづいたところ

corednsのインストール

公式ドキュメントのインストール方法にはバイナリ、docker、ソースから引っ張る(wget,git clone)という方法が推奨されていたが、git clone以外の方法が全て失敗したため今回この方法をとった。
いずれもMakefileがないというメッセージが出て止まってしまった

./coredns実行時のエラー

Corefileを作った後に./corednsを実行しようとした時に以下のメッセージが出た。

$ sudo ./coredns
listen tcp :8080: bind: address already in use

8080ポートのサービスはもともと別のサービスが動いていたが、
coredns内の設定で明記した箇所はない

調べてみると、当初Corefile内にpluginとして「health」を追加していたが、
これがGoで動いており、この設定に8080ポートが指定されていた

このhealthを削除したところエラーがなくなったため、これでよしとした

参考ページ

coredns公式マニュアル
Ubuntu 16.04にGolang 1.9をインストール
CoreDNS入門