部署DERP中继服务器

首先要在这台机器上安装Tailscale客户端,添加Tailscale官方的存储库安装即可,此举是为了后续能启用DERP服务的鉴权功能,防止被其他人滥用:

wget https://pkgs.tailscale.com/stable/debian/bookworm.noarmor.gpg -O /usr/share/keyrings/tailscale-archive-keyring.gpg
wget https://pkgs.tailscale.com/stable/debian/bookworm.tailscale-keyring.list -O /etc/apt/sources.list.d/tailscale.list
apt -y update
apt -y install tailscale

确保tailscaled服务正常运行:

systemctl status tailscaled.service

登录到我们自建的Headscale控制服务器:

tailscale up --login-server https://headscale.example.com

在Headscale控制服务器上注册我这台甲骨文ARM的机器:

headscale nodes register--user imlala --key nodekey:xxxxx

安装Golang:

curl -L https://go.dev/dl/go1.21.1.linux-amd64.tar.gz -o go1.21.1.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.21.1.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' > /etc/profile.d/golang.sh
source /etc/profile.d/golang.sh

新建一个derp用户登录到这个用户:

useradd -r -m -d /opt/derp -s /bin/bash derp
su - derp

安装DERP,完成之后退出当前用户:

go install tailscale.com/cmd/derper@main
exit

[可选]让DERP服务可以绑定低位端口,例如80、443,由于后续我将使用反向代理所以这个步骤可以省略:

setcap 'cap_net_bind_service=+ep'/opt/derp/go/bin/derper

[可选]做一个软链接方便使用:

ln -s /opt/derp/go/bin/derper /usr/local/bin/derper

新建systemd服务:

vim /etc/systemd/system/derper.service

写入如下配置,你只需要将derp.example.com修改成你自己的域名即可:

[Unit]
Description=DERP Server
After=network.target

[Service]
User=derp
Group=derp
AmbientCapabilities=CAP_NET_BIND_SERVICE
WorkingDirectory=/opt/derp
ExecStart=/opt/derp/go/bin/derper -hostname=derp.example.com -c /opt/derp/derper.conf -a 0.0.0.0:9981 -http-port -1 --verify-clients
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

[重要]–verify-clients参数务必要保留,鉴权需要,否则任何人都能连接上你的DERP服务。
启动DERP服务并设置开机自启:

systemctl enable --now derper.service

检查运行状态确保正常运行:

systemctl status derper.service

新建NGINX站点配置文件:

vim /etc/nginx/sites-available/derper

写入如下配置:

server {
    listen       80;
    server_name  derp.example.com;

    location / {
        proxy_pass http://127.0.0.1:9981;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    error_log /var/log/nginx/derp-proxy-error.log;
    access_log /var/log/nginx/derp-proxy-access.log;
}

启用站点:

ln -s /etc/nginx/sites-available/derper /etc/nginx/sites-enabled/derper

签发SSL证书:

certbot --nginx

访问DERP服务的域名,如果能看到说明DERP服务正常运行

回到Headscale控制服务器,新建一个DERP服务配置文件:

vim /etc/headscale/derp.yaml

写入如下内容,注意derp.example.com修改为你自己的域名:

regions:
  900:
    regionid: 900
    regioncode: kr
    regionname: oraclekr
    nodes:
      - name: 900a
        regionid: 900
        hostname: derp.example.com
        stunport: 3478
        stunonly: false
        derpport: 443

编辑Headscale控制服务器的配置文件:

vim /etc/headscale/config.yaml

注释掉如下URL以禁用Tailscale官方的DERP服务器,指定刚才新建的DERP服务配置文件:

derp:
  server:
    enabled: false
...
  urls: []
  #  - https://controlplane.tailscale.com/derpmap/default
...
  paths:
    - /etc/headscale/derp.yaml
...

重启Headscale:

systemctl restart headscale

在客户端执行如下命令查看当前的网络状态:

tailscale netcheck

如果两台设备之间通过DERP服务器中继连接,那么也可以执行下面的命令查看连接状态:

tailscale status