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

<!-- wp:heading {"level":1} -->
<h1>はじめに</h1>
<!-- /wp:heading -->

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

<!-- wp:heading {"level":1} -->
<h1>ゴール</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>アドレスの直打ちではなく、名前入力だけで社内サーバーにアクセスできるようになる。</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>環境</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>MBP Sierra OS<br>
Ubuntu Server 16.04(DNSサーバー ドメイン名:hoge.local)<br>
Ubuntu Server 18.04(名前検索用サーバー　ホスト名:piyo)</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>coredns Ver.1.1.3</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>Goのインストール</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>corednsはGolangで動いているが、サーバーにGoを入れていなかったため、はじめにGoをインストールする</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ sudo apt install golang-1.9</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>Goの1.9を直接インストールした場合はリンクがついていないため、手動でリンクをつけないといけない</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ 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</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>この状態でならGoは起動するはず</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ go version
go version go1.9.2 linux/amd64</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":1} -->
<h1>corednsのインストール</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>corednsのインストールはdockerで行う方法もあるが、インストール途中で失敗（Makefileが無いとメセージが出る）したため、公式ドキュメントのgitをクローンして入れる。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://coredns.io/manual/toc/">CoreDNS 公式</a></p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ 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</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>インストールがうまくいけば下記コマンドが使える(makeしたパス内でしか動かない)</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ ./coredns -version
CoreDNS-1.1.3
linux/amd64, go1.9.2, 6fcb2dd</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":1} -->
<h1>corednsの設定</h1>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3>Corefileの記述</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>corednsは「Corefile」を参照して名前解決を行う。<br>
makeしたあとはこのCorefileがなかったため自作をする</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ 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
}</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3>/etc/hostsの設定</h3>
<!-- /wp:heading -->

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

<!-- wp:code -->
<pre class="wp-block-code"><code>$ sudo vi /etc/hosts

192.168.1.101 piyo.foo.local</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>これで準備は完了したため実際にcorednsを起動してみる</p>
<!-- /wp:paragraph -->

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

<!-- wp:code -->
<pre class="wp-block-code"><code>$ sudo ./coredns </code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":1} -->
<h1>mac側の設定</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>macのdns設定を今回設定したサーバーのアドレスに変更する</p>
<!-- /wp:paragraph -->

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

<!-- wp:paragraph -->
<p>でいける</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>mac側でnslookupを実行し、名前解決をしてみる</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ nslookup
Name:    piyo.foo.local
Address: 192.168.1.101</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>名前解決ができている</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>pingも同様に飛ばしてみるとちゃんと届くはず</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>最終操作</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>無事設定が終わったら、サーバーのバックグラウンドで動き続けるようにしておく</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ nohup sudo ./coredns &amp;</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":1} -->
<h1>終わりに</h1>
<!-- /wp:heading -->

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

<!-- wp:heading {"level":1} -->
<h1>つまづいたところ</h1>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3>corednsのインストール</h3>
<!-- /wp:heading -->

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

<!-- wp:heading {"level":3} -->
<h3>./coredns実行時のエラー</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Corefileを作った後に./corednsを実行しようとした時に以下のメッセージが出た。</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ sudo ./coredns
listen tcp :8080: bind: address already in use</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>8080ポートのサービスはもともと別のサービスが動いていたが、<br>
coredns内の設定で明記した箇所はない</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>調べてみると、当初Corefile内にpluginとして「health」を追加していたが、<br>
これがGoで動いており、この設定に8080ポートが指定されていた</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>このhealthを削除したところエラーがなくなったため、これでよしとした</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>参考ページ</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><a href="https://coredns.io/manual/toc/">coredns公式マニュアル</a><br>
<a href="http://blog.panicblanket.com/archives/4278">Ubuntu 16.04にGolang 1.9をインストール</a><br>
<a href="https://qiita.com/kanga/items/e74038f25d1f53ca6ade">CoreDNS入門</a></p>
<!-- /wp:paragraph -->