架設自己的 Tailscale – Headscale

前言廢話

前面我們介紹了很多有關 Tailscale 的文章,但是這些都還是被 Tailscale 給限制住。有沒有一個可能,我們能繼續使用 Tailscale 的客戶端,但是我們自己架設一個控制器?

有的!在社群裡,有人開發了一款名為 Headscale 的控制器,就是開源版的 Tailscale。即便這個社群現在還很小,不過我是希望他能成長茁壯。

安裝 Golang

首先,我們必須先安裝 Go 語言,因為不論是 Tailscale 或是 Headscale 都是在 Go 上面開發的。

我們到 https://go.dev/dl/ 並複製 Linux 那格下方的 .tar.gz

001.jpg

使用 wget 把他現在下來(網址以筆者當下最新版撰寫)

wget https://go.dev/dl/go1.20.3.linux-amd64.tar.gz

刪除先前的 Golang 目錄(若存在),並解壓縮安裝 go1.20.3.linux-amd64.tar.gz 檔案。

rm -rf /usr/local/go && tar -C /usr/local -xzf go1.20.3.linux-amd64.tar.gz

將 Golang 加入 PATH 裡。

export PATH=$PATH:/usr/local/go/bin

接著,就可以檢查 Go 的版本啦!

go version

安裝 Headsacle

下載 Headscale 的檔案(網址中有些地方需要自己更換掉,點擊 這裡 查看 Release 紀錄)

wget --output-document=headscale.deb \
  https://github.com/juanfont/headscale/releases/download/v<HEADSCALE VERSION>/headscale_<HEADSCALE VERSION>_linux_<ARCH>.deb

使用 dpkg 執行安裝命令

sudo dpkg --install headscale.deb

使用 systemctl 命令讓 Headscale 在電腦開機時自啟動

sudo systemctl enable headscale

接者我們可以編輯 /etc/headscale/config.yaml 中的檔案,這個檔案裡面包括 Headscale 監聽的 Port、客戶端使用的 IP 範圍、Log、MagicDNS 等等。

vim /etc/headscale/config.yaml

以下簡單說明一下文件內的參數用途

---
# 這裡是伺服器的網址,你可以綁上自己的網域。
server_url: https://myheadscale.example.com:443

# Headscale 要綁定/監聽 的 Port
listen_addr: 0.0.0.0:443

# 這是用來監聽 /metrics 的
metrics_listen_addr: 127.0.0.1:9090

# 用來監聽 gRPC 使用
grpc_listen_addr: 0.0.0.0:50443

# 要為客戶端分配 IP 位址的 IP 段
ip_prefixes:
  - fd7a:115c:a1e0::/48
  - 100.64.0.0/10

# DERP 是 Relay 伺服器,當點對點無法作用時,就會使用 DERP 來連線
# https://tailscale.com/blog/how-tailscale-works/#encrypted-tcp-relays-derp
derp:
  server:
    # 如果這裡啟用,你必須配置此文件的其他部分,如 https、TLS
    enabled: false


# 自動檢查更新
disable_check_updates: false

# Headscale 也支援 Tailscale 的 MagicDNS,請參考以下文件
# - https://tailscale.com/kb/1054/dns/
# - https://tailscale.com/kb/1081/magicdns/
# - https://tailscale.com/blog/2021-09-private-dns-with-magicdns/
#
dns_config:
  # 是否要複寫用戶端本地的 DNS
  override_local_dns: true

  # 要傳給客戶端的 DNS 伺服器
  nameservers:
    - 1.1.1.1

  # 是否啟用 MagicDNS,在 https://tailscale.com/kb/1081/magicdns/ 了解更多
  magic_dns: true

上面都寫完後,退出 vim,並啟動 Headscale

sudo systemctl start headscale

查看 Headsacle 目前狀態

systemctl status headscale

建立使用者

我們每次都必須在 Headscale 建立一個使用者

headscale users create myfirstuser

客戶端連線方式

由於 Headscale 並沒有受到官方支援,因此連線方式比較曲折一些。不過還不算太難,下方提供幾個平台的教學。

Linux

安裝官方的 Tailscale。

curl -fsSL https://tailscale.com/install.sh | sh

輸入 tailscale up 命令,但在後面加上 --login-server 參數,並輸入你的網址(在上方的配置)

tailscale up --login-server <YOUR_HEADSCALE_URL>

接著,他會出現一行網址,要我們訪問,我們使用瀏覽器打開他。

002.jpg

在網站中,我們可以在最下方看到一行命令,我們需要將其複製起來並貼到 Headscale 的主機上(記得修改 USERNAME 的部分成你的使用者名稱)。

003.jpg

這樣就註冊完成囉!

Windows

Windows 的連線方式是我目前覺得最麻煩的其中之一,在安裝 Tailscale 之後,我們需要編輯 Regedit 來完成。

使用 Win + R 打開執行視窗,輸入 regedit

004.jpg

我們到路徑 Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Tailscale IPN 底下,用右鍵新增兩個字串。第一個字串 UnattendedMode 的內容是 always,而另一個字串 LoginURL 內容則是你的伺服器網址。

005.jpg

回到右下角 Tailscale 的 icon,右鍵選擇 Log in,他將會打開一個網站

006.jpg

在網站中,我們可以在最下方看到一行命令,我們需要將其複製起來並貼到 Headscale 的主機上(記得修改 USERNAME 的部分成你的使用者名稱)。

007.jpg

這樣就註冊完成囉!

Android

從 Play Store 下載 Tailscale 後,快速點擊右上角三個點即可變更伺服器。

004.gif

填入你的伺服器網址後,點選 Sign in with other,他一樣會打開一個網站。

005.png

在網站中,我們可以在最下方看到一行命令,我們需要將其複製起來並貼到 Headscale 的主機上(記得修改 USERNAME 的部分成你的使用者名稱),這樣就註冊完成囉。

Apple 裝置

請訪問你的伺服器網址,如 https://test.example.com/apple,那邊會有指導方式。

Headscale 常用指令

在你的 Headscale 主機中,有一些常用指令可以用,我們輸入 headscale 會有一些指南。

010.jpg

我最常用的其中一個指令是 headscale users list,他會列出現在有的使用者。

011.jpg

而另一個是 headscale nodes list,他可以列出分配的 IP 位址及上次看見的時間等等。

012.jpg

結語

這就是 Headscale 的安裝及使用方式啦!

說實在的其實我上禮拜(2023/04/16)才在研究。結果過不久(2023/04/18),Tailscale 官方就釋出了 訊息,表示免費用戶的裝置也能提升到 100 個。

這下子我就再也沒有想要自架了哈哈,不過這篇文章還是獻給有需求想要自架的人囉。