Tailscale DERP 中继服务器部署指南
Tailscale 的终极目标是让两台处于网络上的任何位置的机器建立点对点连接(直连)。但现实世界中,大部分机器都位于 NAT 网络地址和防火墙后面,因此需要通过“打洞”来实现直连,即 NAT 穿透。
NAT穿透原理
1. STUN (用于 Easy NAT)
对于 Easy NAT(如完全圆锥型 NAT),我们只需要提供一个第三方服务,告诉客户端“它在公网看到的 IP 和端口是什么”,并将此信息告知通信对端(Peer)。对端利用这个地址即可建立连接。这种服务称为 STUN (Session Traversal Utilities for NAT)。
2. DERP 中继 (用于 Hard NAT)
对于 Hard NAT(如对称型 NAT,通常为企业级防火墙),STUN 往往无法生效。因为防火墙只允许特定的入向包通过,即使对端知道了 IP 和端口也无法建立连接。
在这种情况下,我们需要一种折衷方案:中继服务器 (Relay Server)。
- 客户端与中继服务器通信。
- 中继服务器将数据包转发(Relay)给通信对端。
中继的性能与协议
- 性能: 如果无法直连,中继是唯一的选择。虽然延迟和带宽会受限,但相比完全无法连接,这是可接受的。
- DERP 协议: Tailscale 自研的
Detoured Encrypted Routing Protocol。- 它是一个运行在 HTTP 之上的通用数据包中继协议(因为大部分网络允许 HTTP/HTTPS 流量)。
- 它根据目标公钥中继加密流量。
- 连接建立初期,Tailscale 会优先使用 DERP 模式(保证 100% 连通),随后并行尝试打洞,一旦成功则无缝升级为 P2P 直连。
部署步骤(以阿里云VPS 为例)
前提条件
- 一台拥有公网 IP 的云服务器。
- 一个域名(国内服务器需备案),并已解析到服务器 IP。
- 端口开放:服务器防火墙/安全组需开放 TCP 80, 443 和 UDP 3478。
第一步:安装 Docker
以阿里云镜像加速为例(如果是非国内服务器,可直接使用官方脚本):
# 安装 Docker
curl -fsSL [https://get.docker.com](https://get.docker.com) | bash -s docker --mirror Aliyun
# 启动并设置开机自启
systemctl start docker
systemctl enable docker
# 检查安装状态
docker info
第二步:Docker 部署 DERP
我们将 DERP 运行在容器内部的 3565端口,并映射到宿主机的 81 端口(后续通过 Nginx 反代到 443)。
注意:请将 derp.yourdomain.com 替换为您自己的域名。
docker run --restart always \
--name derper \
-p 81:3565\
-p 3478:3478/udp \
-e DERP_ADDR=:3565\
-e DERP_DOMAIN=derp.yourdomain.com \
-d ghcr.io/yangchuansheng/derper:latest
# 查看容器日志确保运行正常
docker logs -f derper
第三步:申请 SSL 证书 (Certbot)
使用 Certbot 为域名申请证书。
# 1. 确保防火墙放行 80 和 443
# (根据您的系统,可能是 ufw 或 iptables/firewalld)
# sudo ufw allow 80
# sudo ufw allow 443
# 2. 安装 Certbot
sudo apt update
sudo apt install certbot -y
# 3. 申请证书
# 注意:申请时 80 端口必须未被占用(如果 Nginx 已启动,需先 stop)
sudo systemctl stop nginx
sudo certbot certonly --standalone -d derp.yourdomain.com
# 证书生成路径通常为:/etc/letsencrypt/live/derp.yourdomain.com/
第四步:配置 Nginx 反向代理
使用 Nginx 进行反向代理有两个好处:
- 方便在同一台服务器部署多个 Web 服务。
- 统一管理 HTTPS 证书,比 DERP 自带的证书处理更灵活。
安装 Nginx:
sudo apt install nginx -y
创建配置文件:
新建文件 /etc/nginx/conf.d/derper.conf,填入以下内容(请替换域名):
server {
listen 443 ssl;
server_name derp.yourdomain.com;
charset utf-8;
# SSL 证书路径
ssl_certificate /etc/letsencrypt/live/derp.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/derp.yourdomain.com/privkey.pem;
# SSL 安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:!aNULL:!MD5:!RC4';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;
keepalive_timeout 70;
location / {
proxy_redirect off;
proxy_pass http://127.0.0.1:81
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;
}
}
启动 Nginx:
systemctl start nginx
systemctl enable nginx
证书续期提示: Let's Encrypt 证书有效期为 3 个月。续期时需先停止 Nginx (
sudo systemctl stop nginx),运行certbot renew,然后再启动 Nginx (sudo systemctl start nginx)。
第五步:Tailscale 控制台配置
登录 Tailscale 网页控制台,进入 Access Controls,替换原内容为以下内容(注意修改为自己的域名)

// Example/default ACLs for unrestricted connections.
{
// Declare static groups of users beyond those in the identity service.
"Groups": {
"group:example": ["user1@example.com", "user2@example.com"],
},
// Declare convenient hostname aliases to use in place of IP addresses.
"Hosts": {
"example-host-1": "100.100.100.100",
},
"ACLs": [
// Match absolutely everything. Comment out this section if you want
// to define specific ACL restrictions.
{"Action": "accept", "Users": ["*"], "Ports": ["*:*"]},
],
"derpMap": {
"OmitDefaultRegions": true,
"Regions": {"900": {
"RegionID": 900,
"RegionCode": "my-custom-derp",
"RegionName": "MyCustomNode",
"Nodes": [{
"Name": "1",
"RegionID": 900,
"HostName": "derp.yourdomain.com",
"DERPPort": 443,
}],
}},
},
}
保存后,稍等片刻,在客户端运行 tailscale netcheck 即可看到自定义的 DERP 节点。
客户端配置示例:群晖 (Synology) NAS
如果您需要在群晖上使用 Tailscale 并确保其利用该 DERP 节点:
- 准备工作: 开启群晖 SSH,使用 Root 权限登录。
- 创建持久化目录:
sudo mkdir -p /docker/tailscale/lib sudo mkdir -p /docker/tailscale/tun - tailscale官网获取auth-key

- 修改compose文件内容后运行 Tailscale 容器:
version: "3"
services:
tailscale:
image: tailscale/tailscale:latest
container_name: tailscale
# 容器名字
hostname: dsm918
# 主机名,这里修改为设备的名字,在网页上就会显示对应的名字
privileged: true
cap_add:
- NET_ADMIN
- NET_RAW
environment:
- TS_STATE_DIR=/var/lib/tailscale
# 需要修改,默认90天有效,90天后重新获取启动容器
- TS_AUTH_KEY=123456
# 需要修改,192.168.1.0/24为本机所在的局域网网段,注意修改
- TS_ROUTES=192.168.8.0/24
# 允许本机作为流量出站点,在tailscale找到该设备对应名称,点击设置(三个点),点击Edit route settings,勾选子网地址,可以访问同局域网其他设备
- TS_EXTRA_ARGS=--advertise-exit-node
volumes:
- ./lib:/var/lib
- ./tun:/dev/net/tun
network_mode: host
restart: unless-stopped
其他设备
tailscale官网下载客户端登陆账号或者app应用商店下载tailscale登陆账号即可使用
评论