HeadscaleのMagicDNS

MagicDNSとは

MagicDNSという機能はもともとTailscaleにある機能なのだが、Tailnetに登録されたマシンをIPアドレスではなく、名前で参照することのdきる機能だ。例えば、あるマシンを登録し、それにultramanという名前をつけ、100.64.0.6という固定IPアドレスが付与されたとする。MagicDNSがONの場合には、このマシンを100.64.0.6ではなく、ultramanという名前で参照できる。

当然だが、ultramanがウェブサーバを立ち上げているとすれば、「http://100.64.0.6」だけではなく、「http://ultraman」と参照することができる。

この機能がHeadscaleにも受け継がれている。

Headscaleでの設定

Tailscaleでは、MagicDNSをONにしないと有効にならないのだが、HeadscaleではデフォルトでONになっている。これが、config.yamlにある。以下が該当する箇所だ。

## DNS
#
# headscale supports Tailscale's DNS configuration and MagicDNS.
# Please have a look to their KB to better understand the concepts:
#
# - https://tailscale.com/kb/1054/dns/
# - https://tailscale.com/kb/1081/magicdns/
# - https://tailscale.com/blog/2021-09-private-dns-with-magicdns/
#
dns_config:
  # Whether to prefer using Headscale provided DNS or use local.
  override_local_dns: true

  # List of DNS servers to expose to clients.
  nameservers:
    - 1.1.1.1

  # NextDNS (see https://tailscale.com/kb/1218/nextdns/).
  # "abc123" is example NextDNS ID, replace with yours.
  #
  # With metadata sharing:
  # nameservers:
  #   - https://dns.nextdns.io/abc123
  #
  # Without metadata sharing:
  # nameservers:
  #   - 2a07:a8c0::ab:c123
  #   - 2a07:a8c1::ab:c123

  # Split DNS (see https://tailscale.com/kb/1054/dns/),
  # list of search domains and the DNS to query for each one.
  #
  # restricted_nameservers:
  #   foo.bar.com:
  #     - 1.1.1.1
  #   darp.headscale.net:
  #     - 1.1.1.1
  #     - 8.8.8.8

  # Search domains to inject.
  domains: []

  # Extra DNS records
  # so far only A-records are supported (on the tailscale side)
  # See https://github.com/juanfont/headscale/blob/main/docs/dns-records.md#Limitations
  # extra_records:
  #   - name: "grafana.myvpn.example.com"
  #     type: "A"
  #     value: "100.64.0.3"
  #
  #   # you can also put it in one line
  #   - { name: "prometheus.myvpn.example.com", type: "A", value: "100.64.0.3" }

  # Whether to use [MagicDNS](https://tailscale.com/kb/1081/magicdns/).
  # Only works if there is at least a nameserver defined.
  magic_dns: true # <====================================デフォルトでON状態

  # Defines the base domain to create the hostnames for MagicDNS.
  # `base_domain` must be a FQDNs, without the trailing dot.
  # The FQDN of the hosts will be
  # `hostname.user.base_domain` (e.g., _myhost.myuser.example.com_).
  base_domain: example.com # <============================= ベースドメインに注意

HeadscaleでのMagicDNSの注意事項

Tailscaleもこういう仕様だったかは忘れたのだが、異なるユーザの所有するマシンを参照する場合にはFQNを指定しなければならない。どういうことかというと、以下のケースを考えてみる。

  • マシンultramanとspidermanは、ユーザuserAと指定されている。
  • マシンhulkとnatashaは、ユーザuserBと指定されている。

この場合、ultraman中でspidermanを参照する場合には、単純にspidermanと書けるのだが、他の二つのマシンは、hulk.userB.example.com、natasha.userB.example.comと指定しなければならない。単純にhulk, natashaとは書けない。

これでは面倒なので、ユーザを統一してしまい(例えばmachine)、各マシン名称に実際のユーザ名を付けた方が簡単だろう。つまり、全マシンをmachineという単一のユーザに所有させた上で、以下の名前にする。

  • A-ultraman
  • A-spiderman
  • B-hulk
  • B-natasha

こうすると、全マシンが同じドメインに属することになるので、単純名だけで参照できることになる。そして、example.comというデフォルトの名称は使われないので、自分のドメインに変更する必要も無いだろう。

追加のDNS

上記のように実際のマシン名での参照のほか、固定IPに名称をつける機能がある。説明にあるように、以下のように記述する。

  # Extra DNS records
  # so far only A-records are supported (on the tailscale side)
  # See https://github.com/juanfont/headscale/blob/main/docs/dns-records.md#Limitations
  # extra_records:
  #   - name: "grafana.myvpn.example.com"
  #     type: "A"
  #     value: "100.64.0.3"
  #
  #   # you can also put it in one line
  #   - { name: "prometheus.myvpn.example.com", type: "A", value: "100.64.0.3" }
  extra_records:
    - { name: "test.machine.example.com", type: "A", value: "100.64.0.3" }

nameとしては、FQNを記述しないといけない。つまり、ユーザ名とベースドメインもあわせて記述しておく。既にA-ultramanはuserの所有になっているので、このマシンからは、このアドレスを「test
」だけで参照できる。