HeadscaleサーバをTailscaleクライアントにする際の問題

あるマシンにおいてHeadscaleサーバを動作させており、このURLはhttps://hs.exmaple.comになっている。しかし、このマシン自体でTailscaleクライアントを動作させないと、このマシンがTailnetに入らない。つまり、TailnetのIPアドレスでアクセスすることができない。これは当然だ。

起動順序問題

しかし、HeadscaleサーバはDockerで動作させており、tailscaleクライアントはシステムサービスとして動作している。

Headscale

# docker container list | grep headscale
6916a40625a5   ghcr.io/gurucomputing/headscale-ui:2023.01.30-beta-1   "/bin/sh -c '/bin/sh…"   25 hours ago   Up 30 minutes             443/tcp                                                                                                                                                                                                                                                                                                                                              hsui
cc0889bfafe5   headscale/headscale:0.21.0                             "headscale serve"        25 hours ago   Up 30 minutes             8080/tcp, 127.0.0.1:9091->9090/tcp                                                                                                                                                                                                                                                                                                                   headscale

Tailscale

# systemctl status tailscaled.service
● tailscaled.service - Tailscale node agent
   Loaded: loaded (/usr/lib/systemd/system/tailscaled.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2023-03-31 17:17:40 JST; 29min ago
     Docs: https://tailscale.com/kb/
  Process: 819 ExecStartPre=/usr/sbin/tailscaled --cleanup (code=exited, status=0/SUCCESS)
 Main PID: 1112 (tailscaled)
   Status: "Connected; machine; fd7a:115c:a1e0::3 100.64.0.3"
    Tasks: 12 (limit: 23644)
   Memory: 128.8M
   CGroup: /system.slice/tailscaled.service
           └─1112 /usr/sbin/tailscaled --state=/var/lib/tailscale/tailscaled.state --socket=/run/tailscale/tailscaled.sock --port=41641

Tailscaleクライアントは、–login-serverとしてhttps://hs.example.comを指定しているのだが、Dockerが起動しないと、このURLはサービスされない。

ここに起動順序問題があるのだが、これに関しては今のところ解決できていると思われる。Tailscaleクライアントは、ログインサーバが起動するまで待ち続ける(らしい)からだ。

resolve.conf問題

しかし、もっと重大な問題がある。Tailscaleクライアントが、/etc/resolve.confを書き換えてしまうことだ。これは、サーバ側でMagicDNSの使用が指定されている時に起こる。そして、HeadscaleではデフォルトでこれがONになっているし、非常に便利な機能なのでOFFにしたくはない。

この問題は、Why is resolv.conf being overwritten?に記述がある。

マシンとして使用しているAlma Linux8では、systemd-resolvedが使われていないため(入れたくもないが)、このサーバ内でMagicDNSを使わせるために、Tailscaleは/etc/resolv.confを直接書き換えてしまうのである。

以下のような具合だ。

# resolv.conf(5) file generated by tailscale
# For more info, see https://tailscale.com/s/resolvconf-overwrite
# DO NOT EDIT THIS FILE BY HAND -- CHANGES WILL BE OVERWRITTEN

nameserver 100.100.100.100
search user.example.com

Tailscaleをダウンさせると、/etc/resolv.confは元に戻る。例えば以下のような記述である。

nameserver 1.1.1.1

しかし、サーバを再起動した場合には、Tailscaleはresolv.confを元に戻さずに、変更された状態で起動してしまう。しかし、そこにある100.100.100.100というネームサーバのアドレスは特別なもので、Tailscaleクライアント自身が処理しているものだ。Tailscaleクライアントの起動に必要なものが、その起動後にしか提供されないのである。したがって、ログインサーバのhs.example.comに到達することができなくなる。

パソコンやスマフォではMagicDNSを使いたいが、このサーバには、そもそも不要なのである。

この問題の解決方法としては、このサーバだけMagicDNSを使わせないようにすることである。先の記事を見ると答えがあった。

tailscale set --accept-dns=false

これで、DNSの書き換えはしなくなり、MagicDNSは使えなくなるが、hs.example.comの名前解決ができることになる。