- Headscaleは、Tailscaleのコントロールサーバー機能をセルフホスティングできるようにしたオープンソースの代替プロジェクト
- TailscaleはWireGuardベースのモダンなVPNソリューションで、NAT環境でも動作するオーバーレイネットワークを構成可能
- 元のTailscale Controlサーバーはクローズドソースのソフトウェアだが、Headscaleはこれを置き換えられる自由に導入可能なサーバーソフトウェアとして開発されている
- Windows、macOS、iOSクライアントは引き続きTailscaleのGUIを必要とする
Headscaleの目的と特徴
- Headscaleは個人および小規模なオープンソース組織が利用できるよう、1つのtailnet(仮想プライベートネットワーク)のみをサポート
- 自前のサーバーを運用したいユーザーや自由ソフトウェア愛好家に適したソリューション
- 設計範囲を狭く定めることで、保守と管理を容易にしている
主な機能
- クライアントノード間のWireGuard公開鍵交換
- 各ノードへのIPアドレス割り当てと境界設定
- ユーザー間でのマシン共有機能
- ノードのルート広告管理
- 公式機能一覧はこちらで確認可能
サポートされるクライアントOS
- Headscaleと互換性のあるOSおよびクライアント一覧は公式ドキュメントで確認可能
インストールと実行に関する案内
- リバースプロキシ(reverse proxy)やコンテナベースでの実行は公式には推奨されていない
- 実行方法と設定は公式ドキュメントを参照
コミュニティと貢献
開発環境とコードスタイル
- 開発に必要な主なツール:
- 最新版のGo
- Buf(Protobufジェネレーター)
- Nixを使った開発環境の構築が可能(
nix developコマンド)
- コードスタイル:
- Goコード:
golangci-lint、golines、gofumptを使用
- Protoコード:
buf、clang-formatを使用
- その他のファイル:
prettierで整形
- コミット前には
make lint、make fmtでコード整形が必須
ビルドとテスト
- Protobufコードを変更した場合、Goコードの再生成が必要:
make generate
- テスト実行:
make test
- ビルド:
nix build
- または
make buildコマンドを使用
その他の情報
- 2023年のFOSDEMでHeadscaleに関する発表を実施: 動画を見る
- このプロジェクトはTailscale Inc.と直接の関係はないが、Tailscale所属のコントリビューターが参加しており、独立してコードレビューと方向性の策定が行われている
1件のコメント
Hacker Newsのコメント
数か月おきにこのリポジトリを見に来て、Tailnet lock が動作するようになったか、あるいはセキュリティ監査が進んだかを確認している。残念ながらどちらも進展がなく、このシステムをインフラの中核部分として信頼できるのか確信が持てなくなっている
オーケストレーションサーバーのセルフホスティングに関心があるなら、Netbird を見てみるとよい。このツールは非常によく似ているが、サーバーがオープンソースで提供されている。したがって、有料版のすべての機能を備えたセルフホストのコントロールサーバーと、優れた GUI を持つことができる
Headscale がインスタンス間のピアリング/フェデレーションを許可するとよいと思う(ACL の作り直し後でも)。主な問題のひとつはアドレス衝突だ
プロジェクト名の Headscale をタイトルに追加すべきだ
Plan 9 で動くのか気になる
Headscale が大好きだ。私たちはこれを本番導入したが、とても良かった
Tailscale コーディネーションサーバーが侵害され、tailnet lock が有効になっている場合、自分のデバイスが侵害されるリスクがどれくらいあるのか気になる
多くのユースケース(モバイルアクセス、macOS の GUI)では、公式 Tailscale クライアントはコントロールサーバーを設定できる能力に依存している
この構成が wireguard + openwrt の構成と比べて、どんな付加価値を提供するのか気になる
「Tailscale 実装について、コントロールサーバーがクライアントに指示する内容をユーザーが理解したり拒否したりする手段を提供しないまま、サーバーコードをまったく監査しないのは大胆に見える」という記述は、Headscale コントロールサーバーのソースコードを公開するだけでは、ユーザーが「コントロールサーバーがクライアントに指示する内容を理解したり拒否したりできる」ための十分条件にならないことを示唆している