Tailscale 自定义 DERP 服务器

Tailscale 官方的 DERP 中继服务器全部在境外,距离最近的香港节点在国内的网络环境中也不一定能稳定连接。所以,还是很有必要建立自己的 DERP 服务器的。好在,操作起来并不难。

准备工作

  • 需要有自己的云服务器,有 docker 运行环境。
  • 需要有自己的域名。
  • 需要申请 SSL 证书。

安装

假设你的域名为 example.com,对应的证书为 example.com.crt,私钥为 example.com.key,DERP 对外提供服务的端口为 8443。
一行 docker 命令即可创建 DERP 服务器:

docker run -d \
--name derp \
--restart=always \
-p 0.0.0.0:3478:3478/udp \
-p 0.0.0.0:8443:8443 \
-v /path/to/example.com.crt:/app/certs/example.com.crt \
-v /path/to/example.com.key:/app/certs/example.com.key \
-e DERP_DOMAIN=example.com \
-e DERP_ADDR=:8443 \
-e DERP_CERT_MODE=manual \
fredliang/derper:latest

启动 3478 端口不要修改,8443 端口可以按照自己的喜好来改,DERP_ADDR 变量后面的端口好需要与之前的保持一致,但是这里的冒号不能丢。

接下来来到 Tailscale 管理页面 – Access controls 标签页中,将编辑区域的内容清空,并填入以下内容:

{
    "derpMap": {
        "Regions": {
            "900": {
                "RegionID":   900,
                "RegionCode": "bj",
                "RegionName": "Beijing",
                "Nodes": [
                    {
                        "Name":     "example.com",
                        "RegionID": 900,
                        "HostName": "example.com",
                        "DERPPort": 8443
                    }
                ]
            }
        }
    }
}

RegionCodeRegionName 可以自定义,建议使用纯字母。DERPPort 需要与启动 docker 时设置的端口一致。点击保存之后即可。

在本地终端或者命令提示符中运行 tailscale netcheck 命令检查一下,看你设置的节点是否出现在下方的列表之中。

Report:
    * UDP: true
    * IPv4: yes, *.*.*.*:*
    * IPv6: yes, [*:*:*:*:*:*:*:*]:*
    * MappingVariesByDestIP: true
    * HairPinning: false
    * PortMapping: 
    * CaptivePortal: false
    * Nearest DERP: Beijing
    * DERP latency:
        -  bj: 36ms    (Beijing)
        - hkg: 235.7ms (Hong Kong)
        - sea: 240.9ms (Seattle)
        - sfo: 247ms   (San Francisco)
        - syd: 253.2ms (Sydney)
        - sin: 259.5ms (Singapore)
        - tok: 260.3ms (Tokyo)
        - dfw: 271.5ms (Dallas)
        - blr: 277ms   (Bangalore)
        - mia: 295.4ms (Miami)
        - dbi: 314.6ms (Dubai)
        - nyc: 315.2ms (New York City)
        - tor: 326ms   (Toronto)
        - lax: 326.9ms (Los Angeles)
        - den: 333.1ms (Denver)
        - lhr: 347.6ms (London)
        - hnl: 350.9ms (Honolulu)
        - ord: 351.2ms (Chicago)
        - sao: 407.1ms (São Paulo)
        - fra: 487.8ms (Frankfurt)
        - mad: 493.2ms (Madrid)
        - par: 525ms   (Paris)
        - ams: 537.4ms (Amsterdam)
        - waw: 555.3ms (Warsaw)
        - jnb: 680.2ms (Johannesburg)

当使用 tailscale ping 命令去 ping 一个客户端的时候,就可以看到真正使用上了我们自己的节点。

pong from * (*.*.*.*) via DERP(bj) in 60ms
pong from * (*.*.*.*) via *.*.*.*:* in 58ms

防止被白嫖

如果你的云服务器的带宽、流量不是很大很多的话,做好客户端验证防止别人使用你的 DERP 服务器还是有用的。

首先在服务器上按照 Tailscale 官方安装手册安装客户端,在成功接入自己的局域网之后,本地会创建一个套接字接口 /var/run/tailscale/tailscaled.sock,之后需要做的就是调整一下 docker 的命令:

docker run -d \
--name derp \
--restart=always \
-p 0.0.0.0:3478:3478/udp \
-p 0.0.0.0:8443:8443 \
-v /path/to/example.com.crt:/app/certs/example.com.crt \
-v /path/to/example.com.key:/app/certs/example.com.key \
-v /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock \
-e DERP_DOMAIN=example.com \
-e DERP_ADDR=:8443 \
-e DERP_CERT_MODE=manual \
-e DERP_VERIFY_CLIENTS=true \
fredliang/derper:latest

调整之处为两个,一个是将套接字接口挂载进容器中,另一个是添加环境变量 DERP_VERIFY_CLIENTS,这样 DERP 就会验证连接的客户端是否与本机的客户端为同一个账号下,从而避免其他客户端白嫖服务器。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注