vCSA 7.0 をラボ環境用の簡易内部 DNS サーバとして利用する

はじめに

先日のエントリ で、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.confserver=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 がサポートする方法ではもちろんありませんが、追加でサーバやコンテナを立てる必要なくすぐに動かせるので、自宅ラボなどでは気軽で便利な解決策になるのではないでしょうか。

@kurokobo

くろいです。ギターアンサンブルやら音響やらがフィールドの IT やさんなアルトギター弾き。たまこう 48 期ぎたさん、SFC '07 おんぞう、新日本ギターアンサンブル、Rubinetto。今は野良気味。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です