1.不使用Docker
准备工作
购置服务器、域名,并做好域名解析和 SSL 证书申请(最新版 Tailscale DERP 只需要公网 IP 即可)。
服务器选阿里云,系统用 Ubuntu 24.04;域名在 DNSPod 购买,同时完成域名解析和 SSL 证书申请。
安装 Tailscale 客户端
先在服务器上安装 Tailscale 客户端,命令参考 Tailscale 官网。
安装成功后,先 不要 输入 sudo tailscale up 启动 Tailscale,因为启动后 iptables 会添加规则,导致阿里云 Workbench 无法使用。
安装 Golang
如果你的服务器上有其他软件依赖旧版本的 go,将其升级为新版本可能会发生不可预料的后果,请务必仔细评估与衡量。
旧版本 Golang 大概率会导致 derp 安装失败,最新版 Golang 可以正常编译。
安装 derper 服务
建立目录:sudo mkdir -p /usr/local/gopath/bin
分别输入以下两行代码,设置 Go 代理并安装:
go env -w GOPROXY=https://goproxy.cn,direct
go install tailscale.com/cmd/derper@main
用vim建立启动脚本:sudo vim /usr/local/gopath/bin/runderper
#!/bin/sh
cd /usr/local/gopath/bin
nohup ./derper -hostname <你的域名> -c=derper.conf -a :56473 -http-port -1 -certdir /usr/local/cert -certmode manual -verify-clients -stun > console.log 2>&1 &
echo $! > app.pid
参数
-verify-clients用来防止别人(知道你的域名后)白嫖你的中继节点,只认服务器上 Tailscale 客户端登录的账号。如果你有给朋友白嫖的需求,可以把这个参数去掉。
再建立停止脚本:
sudo vim /usr/local/gopath/bin/stopderper.sh
#!/bin/sh
kill `cat app.pid`
rm -rf app.pid
然后赋权:
chmod +x /usr/local/gopath/bin/runderper
chmod +x /usr/local/gopath/bin/stopderper.sh
接着建立服务,输入 sudo vim /etc/systemd/system/derper.service:
Description=derper服务
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/gopath/bin/runderper
ExecStop=/usr/local/gopath/bin/stopderper.sh
[Install]
WantedBy=multi-user.target
最后去阿里云控制面板放行 derp 端口(TCP 56473 和 UDP 3478)。
CMD SSH 登录
这里要改用 cmd ssh 登录服务器,不能继续在阿里云 Workbench 上操作,因为启动 Tailscale 后 Workbench 就用不了了。
在 cmd 中输入 ssh root@服务器IP,回车后输入密码即可登录。
IP冲突解决
找到 Tailscale 注入的规则
sudo iptables -S | grep 100.64
-A ts-input -s 100.64.0.0/10 ! -i tailscale0 -j DROP
根源:RFC 6598 与阿里云 CGNAT 地址
什么是 CGNAT
100.64.0.0/10 在 RFC 6598 中被保留为 运营商级 NAT (Carrier-Grade NAT) 地址段,用于 ISP 做 NAT 时避免与内网冲突。Tailscale 把它当成“只允许来自 Tailscale 接口的地址段”是符合规范的。
阿里云为何用 CGNAT 当内网 DNS
阿里云在 VPC 内把 100.100.2.136、100.100.2.138 作为内网 DNS 服务地址,初衷是:
- 地址在公网不可路由,避免外泄;
- 与经典网络互通时不会冲突。
但这与 RFC 6598 的本意并不完全一致,于是和 Tailscale 的默认防火墙策略撞上了。
五种可行方案与利弊对照
下面是五种试过可行的方案,按“侵入性”从低到高排序。按自己的业务场景挑一条即可。
| 方案 | 一句话描述 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| ① 手动删除 DROP 规则 | iptables -D ts-input ... | 立即生效 | 每次重启 Tailscale 会恢复 | 临时调试 |
| ② 顶部插入白名单规则 | iptables -I ts-input ... 允许 100.100.2.136 | 对业务无感 | 规则可能被 Tailscale 覆盖 | 单台机器、不频繁重启 |
| ③ 脚本轮询维护 | cron 每分钟检查并修复 | 自动化 | 系统复杂度增加 | 多台机器、能写脚本 |
| ④ 改走公共 DNS | 把 /etc/resolv.conf 换成 8.8.8.8、1.1.1.1 | 根治冲突 | 无法解析阿里云内网域名,OSS、RDS 内网地址失效 | 不使用阿里云内网产品 |
| ⑤ 关闭 Tailscale 防火墙 | tailscale up --netfilter-mode=off | 不碰 iptables | 失去子网路由、exit-node 等高级功能 | 仅做点对点互联 |
如何快速验证方案是否生效
DNS 测试
dig @100.100.2.136 example.com +short出现 IP 即成功。
外网连通性
curl -I https://example.comTailscale 功能
tailscale ping some-node tailscale status规则持久化 重启机器或
systemctl restart tailscaled后再次检查,确保规则仍在。
2.使用Docker
启动 Docker 镜像
使用
GitHub - yangchuansheng/ip_derper: 无需域名的 derper 大佬做好的 Docker image。
Docker compose 文件编写
services:
derper:
image: ghcr.io/yangchuansheng/ip_derper:latest
container_name: derper
restart: always
ports:
- "12345:12345" # 这里的12345请改成你自己想要的10000以上的高位端口
- "3478:3478/udp" # 3478 为stun端口,如果不冲突请勿修改
volumes:
- /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock # 映射本地 tailscale 客户端验证连接,用来验证是否被偷
environment:
- DERP_ADDR=:12345 # 此处需要与上面的同步修改
- DERP_CERTS=/app/certs
- DERP_VERIFY_CLIENTS=true # 启动客户端验证,这是防偷的最重要的参数
新建文件 docker-compose.yml。
在该文件夹内执行 docker compose up -d 即可启动。
如果服务器在国内,可以把 ghcr 的链接替换一下,比如南大的镜像(替换第三行的 image):
services:
derper:
image: ghcr.nju.edu.cn/yangchuansheng/ip_derper:latest
修改 tailscale ACL 配置启用第三方 DERP
- 进入 ACL 编辑页面:Tailscale
- 加入新配置文件
"derpMap": {
"OmitDefaultRegions": false, // 可以设置为 true,这样不会下发官方的 derper 节点,测试或者实际使用都可以考虑打开
"Regions": {
"900": {
"RegionID": 900, // tailscale 900-999 是保留给自定义 derper 的
"RegionCode": "abc1",
"RegionName": "abcc1",// 这俩随便命名
"Nodes": [
{
"Name": "fff",
"RegionID": 900,
"IPv4": "1.1.1.1", // 你的VPS 公网IP地址
"DERPPort": 12345, //上面 12345 你自定义的端口
"InsecureForTests": true, // 因为是自签名证书,所以客户端不做校验
},
],
},
"901": {
"RegionID": 901, // 加入新 derp 的时候记得修改
"RegionCode": "abc2",
"RegionName": "abcc2",
"Nodes": [
{
"Name": "kkk",
"RegionID": 902,
"IPv4": "8.8.8.8", // 你的VPS 公网IP地址
"DERPPort": 4000, //上面 12345 你自定义的端口
"InsecureForTests": true, // 因为是自签名证书,所以客户端不做校验
},
],
},
},
},
找到一个在用 tailscale 的客户端,输入 tailscale netcheck
3.远程桌面
延迟:使用 Windows 远程桌面时,如果两端环境支持,打洞直连效果最好;使用自建 derp 中继服务器反而会有操作延迟和不稳定。有延迟的环境下,Windows 远程桌面体验不如其他远程软件。
中继和直连延迟差不多,但是直连效果更好,说明和网络稳定性有很大关系。
中继服务器
tailscale ping yoga
pong from yoga (100.69.xxxx) via DERP(abc1) in 62ms
pong from yoga (100.69.xxxx) via DERP(abc1) in 62ms
pong from yoga (100.69.xxxx) via DERP(abc1) in 65ms
pong from yoga (100.69.xxxx) via DERP(abc1) in 63ms
pong from yoga (100.69.xxxx) via DERP(abc1) in 59ms
pong from yoga (100.69.xxxx) via DERP(abc1) in 130ms
直接连接
tailscale status
100.77.xxxx yangless windows -
100.115.xxxx izbp11pb148b02kc6runz linux -
100.69.xxxx yoga windows active; direct [2409:8924:4841:6a91:58b1:e07f:692]:41641, tx 810398896 rx 14154500
tailscale ping yoga
pong from yoga (100.69.xxxx) via [2409:8924:4841:6a91:58b1:e07f:692b:b385]:41641 in 87ms
画质:Windows 远程桌面的画质和屏幕适配吊打其他远程连接。
4.总结
从外网访问内网服务,大致有三种方案:
- 获取公网 IP + DDNS 解析
- 这种方案的可行性越来越低。IPv4 地址紧张,国内宽带运营商越来越少给家庭用户分配公网 IP,很多家宽拿到的都是内网地址,DDNS 也就失去了用武之地。
- 隧道穿透
- 隧道穿透就是通过一台有公网 IP 的服务器做跳板,把内网服务暴露到公网。优点是访问稳定,带宽取决于公网服务器;缺点是配置偏重,需要在服务器上安装相关服务,也要在内网服务端写配置。同时它对部分网络协议支持一般,尤其是 HTTPS,配起来很繁琐。
- 构建虚拟局域网
- 构建虚拟局域网,就是把分处不同网络的设备拉进同一个虚拟局域网,实现基于内网 IP 的互访。好处是不太受网络协议限制,客户端部署简单,也支持私有化部署;缺点是这类服务的厂商多在国外,国内网络环境下稳定性一般。
运营商 UDP 流量封得越来越狠,IPv4 地址大多是假的公网 IP,IPv6 又封端口,最后还是得走自建服务器配合隧道穿透。