ホームラボのいいところは、一度環境を作ってしまえば周辺環境をいちいち作成する必要がなく、また、使いやすい環境を育てていくことが可能ということである。仕事などの効率性からすると全然違う。ある意味仕事のパフォーマンスにも影響する。
今回は、Dynamic DNSについて。
名前解決はGoogleに任せておけと思うかもしれないが、DNSサーバをホームラボに立てておく価値がある
- 逆引きの空っぽのゾーンが定義できる
- ホスト名解決ができる
逆引きの空っぽのゾーンは実は思いのほか重要で、あるソフトウェアが接続時に逆引きの名前解決(例 192.168.100.21にアクセスした場合でも、192.168.100.21のホスト名、例えばtest01-hostを調べる)を要求した場合でも、「無い」という応答をすぐに返せるので、全体的な通信パフォーマンスがよくなる。この逆引きのゾーンの重要性はあまり知られていないような気がする。
ホスト名解決は、/etc/hostsなどに登録すればいいかもしれないが、台数が多いとそのhostsファイルの内容を同一に保たなければならない。となるとDNSに実際に登録していく必要がある。また、パブリッククラウドの多くは、ホスト名でサービスのエンドポイントを出しているし、基本的にインスタンスのIPアドレスはDHCPで配布となっている。つまり、今の時代、IP直アクセスがしにくい、ナンセンスになってきている。
さらに、本番環境だとDNSの更新ミスが起きると致命的。シリアルの更新を忘れてしまい、セカンダリDNSへの同期が停止とか、書式ミスでDNSサービスが立ち上がらず、DNSサービスの停止、つまり、全てのサービス停止がおきるなど。DNSの更新はある意味、辞表片手に行うべき作業かと思う。
DNSというと、Bindの設定ファイルかぁとなるが、Bindが難しければ、AWSのRoute53をホームラボのDNSとして使うことも可能。ただし、外から検索されてしまう。内部IPしか返らないので直接アクセスすることはできない。ホームラボ的には問題は少ないがセキュリティ的にはよくない。
閑話休題
Dynamic DNSを立てて使ってみるということをする。Dyamic DNSは、LinuxだとBindを使わなければならないが、Windowsなら簡単である。単にDNSサーバの役割を追加するだけ。デフォルトだとセキュリティ保護された環境からしか更新を受け付けないが、セキュリティのチェックは外せる。セキュリティのチェックが外れれば、どのホストもDNSの動的更新が可能となる。
WindowsでのDNSサーバの設定
これだけ!Linuxに比べると100倍楽。
プロパティの動的更新を非セキュリティ保護およびセキュリティ保護にする。(余談だが、逆引き参照ゾーンもちゃんと作っている。)
これだけでDNSの更新を受け入れ放題になる。
次にクライアント側の設定について記載するが、別にWindowsのDNSサーバだけの話ではなく、LinuxのBindで動的更新を設定したものに対しても同様に行うことができる。
Windowsクライアント側の設定
Windowsの場合は、ドメイン参加すれば自動的に登録されるが、別にドメインへの参加は必須ではなく、ドメインに参加していないホストからの登録は以下のように
「このコンピューターのプライマリDNSサフィックス」にDNSドメイン名を入れて、再起動をする。
コンピュータ名を変更するときに、同時に設定するのが便利。もし、それでも登録されない場合は、手動で登録ができる ipconfig /registerdnsをコマンドプロンプトで実行してみる。いずれにせよ、Windowsは簡単。(更新すべきDNSサーバを勝手に調べてくれる。)
Linuxクライアント側の設定
DHCP環境で、DHCPサーバからFQDNとDNSの設定が配布されていれば勝手に登録される様子だが、自分の環境の場合、DHCPサーバからくるDNSの情報が、該当するDNSサーバのIPではなく、全体のDNSを取りまとめているDNS IPがきてしまう。(正確にはEdgeRouterのDNSmasq)要するに、DHCPだけを使っていて、DHCPからの配布情報で構成されているのであれば、DNSの動的更新が使える。一つでも条件が合わないと手動更新が必要となる。
LinuxからDNSの手動更新をするには、nsupdateコマンドを使う。対話型でも、コマンドラインでも設定ができる。
以下の例で対話型の更新と非対話型の更新を記載する
DNSサーバ: 192.168.19.2
更新したいホスト名: host.ent1.cloudshift.corp
更新したいIPアドレス: 192.168.19.200
対話型の更新例(手動更新)
/usr/bin/nsupdate
#接続するサーバを指定
server 192.168.19.2
#エントリ自体の動的更新ができないので、まずは既存のレコードを消す。(既存になくても消す)
update delete host.ent1.cloudshift.corp
#ゾーンを記載する。bindの書き方なので、注意
update add host.ent1.cloudshift.corp 3600 IN A 192.168.19.200
# Enterキーを押すかsendと入力して、Enterキー
#CTRL-Dで抜ける。
以下で名前解決ができているかを確認
host host.ent1.cloudshift.corp 192.168.19.2
非対話型の更新例(手動更新)
事前に入力するコマンドを列記しておく。最後に改行を忘れないこと
vi /tmp/nsupdate.txt
server 192.168.19.2
update delete host.ent1.cloudshift.corp
update add host.ent1.cloudshift.corp 3600 IN A 192.168.19.200
<改行>
ファイルを引数にして実行するだけ
nsupdate /tmp/nsupdate.txt
まとめると
- DNSサーバの構成はWindowsだとすぐできて楽ちん
- クライアントから簡単にホスト名のDNS自動登録ができる。ゾーンファイルとの格闘もゾーンファイルの更新ミスが事実上起きえない
- ホスト名アクセスに移行できるので、IP直打ちを抹殺できる。これはパブリッククラウドへシステムを移行する場合にかなり重要
なので、ダイナミックDNSを率先して使いましょう!
と言っているのだが、自分に周りだけかもしれないが、誰も気にしてなかった。。。
1つだけ注意点
LinuxのBindサーバでDNSの動的更新をしている場合、Bindのゾーンファイルには更新されたホストのエントリは全く表示されない。すべてジャーナルファイルに入っている。つまり、そのホストが既に存在しているかどうかはゾーンファイルをみただけではわからない。また、手動で編集した場合、そのシリアルが最新かどうかも保証がない。よって、ゾーンファイルを直接いじるのは避けたほうがいい。サービスを停止して、編集すればいい?それもダメでやはりジャーナルにはいったままなので意味はない。どうなっているのかが理解できていないのであれば確実にゾーンファイルを破壊すると思う。
ゾーンファイルを直接編集する場合は、rdncコマンドで停止、同期してからであればゾーンファイルを直接編集できる。(詳細は、LinuxのDyamic DNSサーバのページで。今度書く予定。。。)