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
」だけで参照できる。