Headscaleサーバを動かす

2023年2月15日

Headscaleのサーバを動かしてみる。クライアント側はTailscaleのクライアントを使いながら、Tailscaleのサービスではなく、オープンソースの自前のサービスを使うことにより、完全にプロプライエタリなTailscaleから逃れることができる。なぜなら、Tailscaleのクライアントはすべてオープンソースだからだ。

ただし、Headscaleそのものは、かなり敷居が高い。まず、本家にはGUIクライアントがなく、コマンドラインで操作しないといけない。第三者がGUIクライアントを二つばかり作成しているが、それらは今後見ていくことにして、とりあえずは、サーバの起動とコマンドラインでの操作を行ってみる。

Docker-compose

適当なフォルダを作成し、docker-compose.ymlを作る。

例によって、Traefikをリバースプロキシとしている。むしろTraefik用の設定の方が多い。

version: '3.5'
services:
  headscale:
    container_name: headscale
    image: headscale/headscale:0.20.0
    volumes:
      - ./config:/etc/headscale/
      - ./data:/var/lib/headscale
    ports:
      # metrics test /metrics
      - 127.0.0.1:9091:9090
    command: headscale serve
    restart: unless-stopped
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.headscale.rule=Host(`hs.example.com`)"
      - "traefik.http.routers.headscale.entrypoints=websecure"
      - "traefik.http.routers.headscale.tls.certresolver=myresolver"
      - "traefik.http.services.headscale.loadbalancer.server.port=80"
networks:
  default:
    external:
      name: traefik-network

このフォルダで以下を行う。

mkdir -p ./config
touch ./config/db.sqlite
curl https://raw.githubusercontent.com/juanfont/headscale/main/config-example.yaml -o ./config/config.yaml

config.yamlを少々変更する。とりあえず必要なところだけ。

server_url: https://hs.example.com:443
listen_addr: 0.0.0.0:80
metrics_listen_addr: 0.0.0.0:9090

実行と状態の検証

docker-compose up -d

で実行する。なぜか、https://hs.example.comでは何も表示されない。https://hs.example.com/windowsを表示させると、以下のような表示がされる。

さらに、端末で「 curl http://localhost:9091/metrics」とすると、以下が確認できる。

# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 8.9127e-05
go_gc_duration_seconds{quantile="0.25"} 0.000171308
go_gc_duration_seconds{quantile="0.5"} 0.000238185
go_gc_duration_seconds{quantile="0.75"} 0.000370451
go_gc_duration_seconds{quantile="1"} 0.001290994
go_gc_duration_seconds_sum 0.002160065
go_gc_duration_seconds_count 5
# HELP go_goroutines Number of goroutines that currently exist.
# TYPE go_goroutines gauge
go_goroutines 24
# HELP go_info Information about the Go environment.
....

ユーザを作成する

最初に示した通り、GUIの操作画面は無い。すべて端末で行う必要があるが、Dockerを使用しているので、少々面倒な点がある。

以下は、ユーザを作成して確認したところ。

「docker exec headscale」はDockerのコマンドで、headscaleコンテナを指定して実行するという意味。残りの「headscale users create ysugimura」でユーザを作成している。これ移行も同様。

# docker exec headscale headscale users create ysugimura
User created
# docker exec headscale headscale users list
ID | Name      | Created            
1  | ysugimura | 2023-02-12 13:43:58

スマフォを登録してみる

Android用のTailscaleクライアントをインストールし、以下の操作をする。

Android用Tailscaleクライアントのコントロールサーバを変更する

もちろん、途中の操作はサーバ側で行わないといけない。例えば以下である。

# docker exec headscale headscale nodes register --user ysugimura --key nodekey:2f12c98097d98a06a7d7a******************ce6f66374e5a71f7c16

Linuxサーバを登録してみる

AlmaLinux8にインストールする。

Download Tailscaleにあるように、単に「curl -fsSL https://tailscale.com/install.sh | sh」とする。

次に以下を行う。

# tailscale up --login-server https://hs.example.com

To authenticate, visit:

        https://hs.jimakudaio.com:443/register/nodekey:d5860ef03896db********8868fadedccb354863d

上をブラウザで開くと、以下のような表示になる。

headscale
Machine registration
Run the command below in the headscale server to add this machine to your network:

headscale nodes register --user USERNAME --key nodekey:d5860ef03896dbd10589943bf34****************dccb354863d

これをサーバ側端末で実行する。

docker exec headscale headscale nodes register --user ysugimura --key nodekey:d5860ef03896dbd105899**********cb354863d
Machine v133-18-***** registered
[root@kagoya5 ~]# docker exec headscale headscale nodes list
ID | Hostname       | Name           | MachineKey | NodeKey | User      | IP addresses                  | Ephemeral | Last seen           | Expiration          | Online | Expired
1  | Pixel 5a       | pixel-5a       | [NslZ4]    | [LxLJg] | ysugimura | 100.64.0.1, fd7a:115c:a1e0::1 | false     | 2023-02-12 14:34:34 | 0001-01-01 00:00:00 | online | no     
2  | v133-18-****** | v133-18-****** | [PMGmR]    | [1YYO8] | ysugimura | 100.64.0.2, fd7a:115c:a1e0::2 | false     | 2023-02-12 14:34:35 | 0001-01-01 00:00:00 | online | no     

Alma Linux8からPixel 5aにpingしてみると、完全にうまく行く。

# ping 100.64.0.1
PING 100.64.0.1 (100.64.0.1) 56(84) bytes of data.
64 bytes from 100.64.0.1: icmp_seq=1 ttl=64 time=75.6 ms
64 bytes from 100.64.0.1: icmp_seq=2 ttl=64 time=64.7 ms
64 bytes from 100.64.0.1: icmp_seq=3 ttl=64 time=67.6 ms
64 bytes from 100.64.0.1: icmp_seq=4 ttl=64 time=70.10 ms
64 bytes from 100.64.0.1: icmp_seq=5 ttl=64 time=67.0 ms

一方、スマフォの方を見てみると、勝手に以下のように表示が変更されている。

まとめ

  • 現在のところ完全にうまく行っているようだ。
  • しかし、かなり登録がめんどくさい。
  • Tailscale上で振られていたIPアドレスは無視され、100.64.0.1から連番で振られる模様。
  • 現在のところDERPサーバについては考慮していない。つまり、直接的に接続できない場合に、リレーサーバを行うものなのだが、今回の実験でこれが使われているかは不明。
  • これに対するGUIが二つばかりあるようなので試してみることにする。