UnboundでCNAMEレコードを返却する


Unboundを使って、任意のドメインに対してCNAMEで別のドメインを返却し、そのドメインの名前解決を外部DNSへ再帰問い合わせする、という機能が実現できるか調査した。

結論

仕様として意図された振る舞いかどうかは不明だが、local-zoneのtype(local-dataに合致しない問い合わせへの応答方法)をredirectに設定すると、CNAMEレコードに設定した外部ドメインを再帰問い合わせして返却できる。(typeをtransparentに設定すると再帰問い合わせが行われない。)

local-zone: "cname.dummy" redirect
local-data: "cname.dummy. CNAME google.com."

unboundのマニュアルからはauth-zoneとstub-zone(もしくはforward-zone)を設定するのが本来の使い方のようであるが、下記の設定では再帰問い合わせが実現できなかった。

auth-zone:
  name: cname.dummy
  zonefile: ./zone.conf
forward-zone:
  name: google.com
  forward-addr: 8.8.8.8

zone.conf

cname.dummy. IN CNAME google.com.

検証方法・結果

docker-compose.yml
version: '3'
services:
  unbound:
    image: mvance/unbound
    hostname: unbound
    ports:
      - 53:53/udp
      - 53:53/tcp
    volumes:
      - ./local-zone.conf:/opt/unbound/etc/unbound/a-records.conf
    restart: always
  shell:
    tty: true
    build:
      context: .
    depends_on:
      - unbound
    command: dig @unbound cname.dummy
local-zone.conf
local-zone: "cname.dummy" redirect
local-data: "cname.dummy. CNAME google.com."
実行結果
# docker-compose up
...
shell_1    | ;; QUESTION SECTION:
shell_1    | ;cname.dummy.                      IN      A
shell_1    |
shell_1    | ;; ANSWER SECTION:
shell_1    | cname.dummy.               3600    IN      CNAME   google.com.
shell_1    | google.com.                300     IN      A       172.217.25.206
...

参考