はじめに
社内では、ネットワークはあっても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をクローンして入れる。
$ 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を削除したところエラーがなくなったため、これでよしとした