はじめに
先日のエントリ で、vCenter Server Appliance を 6.7 から 7.0 にアップグレードし、エントリの最後では vCSA 自身を自分専用の DNS サーバにする方法を紹介 しました。
が、前述の方法では外部からの DNS クエリは受け付けられず、vCSA 以外からは DNS サーバとしては使えません。とはいえ、ラボ内にいろいろ立てようとすると、どうしても自前の DNS サーバがないと不自由します。
そこで今回は、vCSA 7.0 を外から正引き・逆引きができる簡易内部 DNS サーバとして使うための設定 を紹介します。具体的には、以下を行います。
- Dnsmasq を構成して、ループバック IP アドレス以外でも待ち受けるようにする
- ファイアウォールを構成して、53 番ポートを開放する
当然ながら VMware はサポートしない 方法なので自己責任ではありますが、追加でサーバやコンテナを立てる必要なくすぐに動かせるので、ラボ環境などで使えるシーンもありそうです。
/etc/hosts
の修正
Dnsmasq は、/etc/hosts
の中身を名前解決のソースとして参照してくれる機能を持っています。つまり、Dnsmasq を導入したホスト(今回は vCSA)の /etc/hosts
に必要なホスト名と IP アドレスの対応付けを全部書いておけば、それを外部から DNS でクエリできるようになるわけです。
vCSA に SSH でログインし、まずは /etc/hosts
に情報を追加します。
# vi /etc/hosts
# cat /etc/hosts
...
192.168.0.200 kuro-qnap01.krkb.lab kuro-qnap01
192.168.0.201 kuro-vcs01.krkb.lab kuro-vcs01
192.168.0.202 kuro-esxi01.krkb.lab kuro-esxi01
192.168.0.203 kuro-esxi02.krkb.lab kuro-esxi02
192.168.0.210 kuro-vro01.krkb.lab kuro-vro01
Dnsmasq の構成
続けて、Dnsmasq の設定ファイルを修正します。行っているのは、次の 3 点です。
listen-address=127.0.0.1
をコメントアウトする- ループバック IP アドレス以外でも待ち受けさせるため
no-hosts
をコメントアウトする/etc/hosts
をソースとして参照させるため
bogus-priv
を追加する- プライベート IP アドレスの逆引きクエリを上位の DNS サーバにフォワーディングしないようにするため
# sed -i 's/^listen-address/#listen-address/' /etc/dnsmasq.conf
# sed -i 's/^no-hosts/#no-hosts\nbogus-priv/' /etc/dnsmasq.conf
# cat /etc/dnsmasq.conf
#listen-address=127.0.0.1
bind-interfaces
user=dnsmasq
group=dnsmasq
no-negcache
#no-hosts
bogus-priv
log-queries
log-facility=/var/log/vmware/dnsmasq.log
domain-needed
dns-forward-max=150
cache-size=8192
neg-ttl=3600
最後に、Dnsmasq を再起動します。
# systemctl restart dnsmasq
なお、Dnsmasq にとっての上位の DNS サーバは、自ホストの /etc/resolv.conf
を参照して判断されます。vCSA の /etc/resolv.conf
には vCSA の構築時に指定した DNS サーバ(以下の例では 192.168.0.1
)が入ります。この設定は、VAMI で変更できます。
# cat /etc/resolv.conf
...
nameserver 127.0.0.1
nameserver 192.168.0.1
よって、/etc/hosts
内と併せてインタネット上のホスト名も名前解決できるようにしたい場合は、VAMI で上位 DNS サーバを指定するか、もしくは 先ほど編集した /etc/dnsmasq.conf
に server=192.168.0.1
など上位 DNS サーバを指定する行を追記するとよいでしょう。
さて、この段階で、vCSA は 127.0.0.1
だけでなく外部 IP アドレス(この例では 192.168.0.201
でも 53 番ポートを待ち受けるようになります。自ホスト内であれば、すでに以下のように名前解決ができるようになっているはずです。
# ss -ltun | grep 53
...
udp UNCONN 0 0 127.0.0.1:53 0.0.0.0:*
udp UNCONN 0 0 192.168.0.201:53 0.0.0.0:*
...
tcp LISTEN 0 32 127.0.0.1:53 0.0.0.0:*
tcp LISTEN 0 32 192.168.0.201:53 0.0.0.0:*
# dig kuro-vro01 @192.168.0.201
...
;; ANSWER SECTION:
kuro-vro01. 0 IN A 192.168.0.210
...
# dig vmware.com
...
;; ANSWER SECTION:
vmware.com. 150 IN A 45.60.11.183
vmware.com. 150 IN A 45.60.101.183
...
ただし、ファイアウォールが動作しているため、外部からはまだ問い合わせができません(以下は Windows から問い合わせた例)。
> nslookup kuro-vro01 192.168.0.201
DNS request timed out.
timeout was 2 seconds.
サーバー: UnKnown
Address: 192.168.0.201
...
*** UnKnown への要求がタイムアウトしました
ファイアウォールの構成
vCSA では、標準でファイアウォールが動作しており、vSphere 的に不要なポートへのアクセスはすべて遮断されています。また、vCSA の VAMI にあるファイアウォールの設定機能では、ポート単位の変更はできず、今回の目的では使えません。
このため、GUI や CLI での構成ではなく、vCSA が起動時に読み込む生のファイアウォール用の設定ファイル群に、DNS サーバ用の 53 番ポートを開放する設定を追加して対応します。
ファイアウォール用の設定ファイル群は、/etc/vmware/appliance/firewall
ディレクトリ配下に置かれています。ここに JSON 形式で設定を記述したファイルを置くだけです。……今回の目的以外でもいろいろ遊べそうですね。
今回は DNS サーバなので、TCP と UDP の 53 番ポートを指定します。
# cat << EOF > /etc/vmware/appliance/firewall/vmware-dnsmasq
{
"firewall": {
"enable": true,
"rules": [
{
"direction": "inbound",
"protocol": "tcp",
"porttype": "dst",
"port": "53",
"portoffset": 0
},
{
"direction": "inbound",
"protocol": "udp",
"porttype": "dst",
"port": "53",
"portoffset": 0
}
]
}
}
EOF
ファイアウォールの設定を再読み込みさせます。
# /usr/lib/applmgmt/networking/bin/firewall-reload
これで、ファイアウォールの実体である iptables に設定が反映されます。実際に、TCP と UDP の 53 番ポートのルールが追加されている様子が確認できます。
# iptables -n --list | grep 53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
動作確認
これで、Windows など外部からも聴いたら答えてくれる DNS サーバができました。
> nslookup kuro-vro01 192.168.0.201
サーバー: kuro-vcs01.krkb.lab
Address: 192.168.0.201
名前: kuro-vro01
Address: 192.168.0.210
UDP でなく、TCP で問い合わせても返してくれます。
$ dig kuro-vro01 +tcp @192.168.0.201
...
;; ANSWER SECTION:
kuro-vro01. 0 IN A 192.168.0.210
...
逆引きもできます。
$ dig -x 192.168.0.210 @192.168.0.201
...
;; ANSWER SECTION:
210.0.168.192.in-addr.arpa. 0 IN PTR kuro-vro01.krkb.lab.
...
Dnsmasq の上位 DNS サーバが正しく構成できていれば、インタネット上のホスト名も解決できます。
$ dig vmware.com @192.168.0.201
...
;; ANSWER SECTION:
vmware.com. 150 IN A 45.60.101.183
vmware.com. 150 IN A 45.60.11.183
....
まとめ
vCSA 7.0 を、正引き・逆引きができる程度の簡単な内部 DNS サーバとして無理やり使う方法を紹介しました。
冒頭で書いた通り、VMware がサポートする方法ではもちろんありませんが、追加でサーバやコンテナを立てる必要なくすぐに動かせるので、自宅ラボなどでは気軽で便利な解決策になるのではないでしょうか。