Tailscale 建立私有的中繼伺服器 – DERP

前言

在好久以前我們介紹過了 Tailscale 這款建立內網工具,從那之後我就一直用著。但是一直有一點非常不滿意,直到近期達到了高峰。

我們都知道,但 Tailscale 裝置跟裝置可能因為 NAT 問題無法建立自己的私人連線時,就會仰賴中繼伺服器,也稱為 DERP。這個伺服器通常是由 Tailscale 在全世界各地建置的。但由於今年初台灣連向國外的各種海纜大爆炸,因此造成在使用這些伺服器時,卡頓到非常不像話。

因此我就在尋找官方的文章,看看 DERP 伺服器能不能自己建置,這樣就不用仰賴別人所建置的,在延遲與資料安全來說會更有保障。結果官方還真的有提供這樣的方法,這篇文章就要來介紹他。

行前說明

建立自己的 DERP 伺服器時,我們需要準備一台伺服器,這台伺服器上須要有獨立的 IPv4 及 IPv6 位址,缺一不可。且需要對外開啟以下的 Port:

協定 埠號 說明
TCP 80 用於 HTTP
TCP 443 用於 HTTPS
UDP 3478 用於 STUN

準備就緒後,就要開始安裝 DERP 伺服器了!

安裝 Go

DERP 是由 Go 所寫出來的,所以我們必須先在我們的 Linux 上安裝 Go。你可以到 這裡 下載 Go 的安裝檔,並到 這裡 看安裝 Go 的教學。

安裝 DERP

安裝 DERP 相當簡單,在你安裝完 Go 之後,只需要一行命令就能將當安裝好。

go install tailscale.com/cmd/derper@main

執行 DERP

在我們開始執行 DERP之前,我們需要先有一個網域或子網域,並將該網域使用 A 及 AAAA 紀錄綁上你的 IPv4 及 IPv6 位址。接著就可以用以下命令來啟動啦!他會自動為你的網域生成一張 SSL 憑證。

sudo derper --hostname=derp.example.com

使用瀏覽器打開該網域,你就會看到一個歡迎頁面,代表他運作正常哦。

001.jpg

但是這樣的啟動方式有一個小問題,任何人都可以使用這個 DERP 伺服器,因此如果你只想讓你帳號的設備來使用,你必須先安裝 Tailscale,也就是之前的 這篇 教學文章。

在安裝完 Tailscale 之後,就可以使用以下命令來啟動啦!

sudo derper --hostname=derp.example.com --verify-clients

新增 DERP 到 Tailnet

當我們設定完後,此時你的機器仍然不會使用這個 DERP,我們必須管理介面的 Access Controls 新增他。

在文件的最後加上以下內容(以下為我的設定,請適當的修改):

{
    "derpMap": {
        "Regions": {
            "900": {
                "RegionID":   900,
                "RegionCode": "tpe",
                "RegionName": "Taipei",
                "Nodes": [
                    {
                        "Name":     "1",
                        "RegionID": 900,
                        "HostName": "derp.example.com"
                    }
                ]
            }
        }
    }
}

我們需要為每台 DERP 伺服器給予專屬 ID,而 Tailscale 將 900 ~ 999 都設為保留可自訂使用的範圍。RegionCodeRegionName 則是你為該節點取的名字。HostName 則是我們剛剛使用的網域。

設定完保存後,你應該就能在管理介面的設備中,看到他出現囉!

002.jpg

只使用自己的 DERP 伺服器

如果你只想使用自己的 DERP 伺服器,你可以在 derpMap 中加上以下內容:

{
    "derpMap": {
        "OmitDefaultRegions": true,
        "Regions": {}
    }
}

當加上 OmitDefaultRegions 時,你的機器就不會再使用 Tailscale 所提供的 DERP 伺服器,但你也必須要在 Regions 中加上你自己的,這麼一來就都會強制使用你自己的 DERP 伺服器囉!

移除 DERP 伺服器

大部分的 DERP 伺服器都應該是由 Tailscale 提供,而官方有提供他的伺服器列表:https://controlplane.tailscale.com/derpmap/default

在裡面,你可以看到各個節點的名稱以及各自的 ID,如果我們想要禁用某些伺服器,我們可以在 ACL 中的 derpMap 加上以下內容:

{
  "derpMap": {
        "Regions": {
            "1": null,
            "2": null
        }
    }
}

上面的命令,就是我們禁用了 ID 為 12 的 DERP 伺服器,對照上官方給的伺服器列表,也就是紐約及舊金山。

結語

這篇文章看起來又把 Tailscale 玩出新的高度囉,真的覺得這個軟體設計的很厲害,能讓我鑽研這麼久並一直自定義成我喜歡的樣子,由衷佩服 Tailscale 的開發團隊!