背景
仮想マシン名とゲストOSのホスト名が食い違っているときに困りました。VMを新規作成したときに,個々のマシンに設定を流し込むときに苦労しました.そこでESXiの仮想マシン名と仮想マシンに紐付いたIPアドレスをDNSで解決することにしました.
やりたいこと
VM名がexample
で,VMのIPアドレスが192.168.100.1
の場合は以下です.
$ nslookup example
192.168.100.1
NickNS
インターネットで探したものの,見つからなかったので自作しました.名前はNick Name ServerでNickNS(適当)です.
機能
- 正引き:仮想マシン名
example
→仮想マシンのIPアドレス192.168.100.1
- 逆引き:仮想マシンのIPアドレス
192.168.100.1
→仮想マシン名example
使い方
インストールします.
go get github.com/cdsl-research/nickns
事前にESXiのノードのSSHを開放して鍵認証でSSHできる状態にします.そして,以下の形式で設定ファイルを作成します.
hosts.toml
[host A]
address = "esxi.example.com"
port = "22"
user = "root"
identity_file = "/path/to/id_rsa"
[host B]
address = "esxi.example.com"
port = "22"
user = "root"
identity_file = "~/path/to/id_rsa"
DNSサーバとしての動作を設定ファイルで指定します.
config.toml
port = 5310
domains = ["local.", "example.com."]
ttl = 3600
バイナリを実行して起動させます.
$ nickns
2020/03/14 21:40:25 NickNS Starting at 5310/udp
試しにdigコマンドでチェックしてみます.
# Type A
$ dig A +short @127.0.0.1 -p 5300 elastic5.local
192.168.0.35
$ dig A +short @127.0.0.1 -p 5300 unbound.example.com
192.168.0.35
# Type PTR
$ dig +short @127.0.0.1 -p 5300 -x 192.168.0.35
unbound.local.
サーバ側でもログが出力されます.
$ nickns
2020/03/14 21:40:25 NickNS Starting at 5310/udp
2020/03/14 21:40:27 [QueryHit] elastic5.local. => 192.168.0.36
2020/03/14 21:40:30 [QueryHit] elastic5.example.com. => 192.168.0.36
実際の動作の様子
仕組み
ESXiノードにSSHして vim-cmd
を叩いています.
使用した技術
- Go言語
- DNSフレームワーク miekg/dns
終わりに
プロトタイプレベルの雑な実装になっているので,以下の機能を追加したいと思っています.
- DNSクエリのキャッシュ
- Graceful Restart
- コマンド引数によるパラメータ変更
GitHub: cdsl-research/nickns
PullReqやStarをいただけると嬉しいです.