本文偏向实践,具体原理可以参考官方Custom DERP Servers文档,小白按照步骤一定可以成功!建议先参考ZeroTier&Tailscale无公网IP实现p2p穿透教程和内网穿透|nps-p2p模式正确的姿势,了解内网穿透以及Tailscale基础用法。另外,本文讲的是在无法p2p情况下,使用中继服务器,如果可以使用p2p,穿透效果大大提升。可用性:p2p>derp(自建)>derp(官方)
需要准备
- 一个具有公网Ip的服务器(家宽亦可)
- 一个国内可以访问的域名,并且申请了 SSL 证书
- 服务器安装Docker
- 一些linux基础知识
使用命令行查看与通信对端的连接方式
C:\Users\jakob> tailscale status
100.94.18.76 jakob-desktop windows -
100.99.18.85 desktop-hao-company windows active; direct 58.23.199.203:21328, tx 4467264 rx 4244288
100.85.68.117 openwrt-yjjy linux active; direct 58.20.125.250:41641, tx 2708596 rx 2444012
注意:按照我这里查询出的结果,所有在线设备均可以通过p2p连接,不需要使用中继服务器(DERP),这里direct 58.23.199.203:21328
后的ip:port为对方设备的ip和端口
C:\Users\jakob> tailscale status
100.94.18.76 jakob-desktop windows -
100.99.18.85 desktop-hao-company windows active; relay "thk"; offline, tx 1608 rx 1552
100.85.68.117 openwrt-yjjy linux active; direct 58.20.125.250:41641, tx 2708596 rx 2444012
注意:按照我这里查询出的结果,100.99.18.85
服务器使用中继服务器(DERP)中继服务器名称为thk
,此DERP为Tailscale官方中继服务器,由于官方在国内没有服务器,最近的节点为jp/hk/sg,但是速度都不太理想,本文教如何用在自己的服务器上搭建中继服务器。
将ssl证书上传到服务器文件夹
关于证书部分需要重点说明:假设你的域名是 xxx.com
,那么证书的名称必须是 xxx.com.crt
,一个字符都不能错!同理,私钥名称必须是 xxx.com.key
,一个字符都不能错!
使用docker安装DERP中继服务器 docker仓库
由于官方没有docker版本,使用fredliang/derper
docker run --restart always \
--name derper -p 12345:12345 -p 3478:3478/udp \
-v /root/derper:/app/certs \
-e DERP_CERT_MODE=manual \
-e DERP_ADDR=:12345 \
-e DERP_DOMAIN=xxx \
-d fredliang/derper
修改上面的/root/derper
为你存放证书的文件夹,修改DERP_DOMAIN=xxx
中xxx
为申请的域名
root@OpenWrt:~/derper# docker logs derper
2023/07/15 16:31:12 no config path specified; using /var/lib/derper/derper.key
2023/07/15 16:31:12 derper: serving on :12345 with TLS
2023/07/15 16:31:12 running STUN server on [::]:3478
运行上面命令查看日志,有上面三行为成功启动
修改tailscale页面上的Access Controls内容
添加如下内容,具体按照说明修改,第一次配置请完全复制修改,出错无法使用保存
注意:其中参数OmitDefaultRegions
默认为false,参考官方功能翻译:OmitDefaultRegions为了保证您的流量仅流经您自己的 DERP 节点,您可以通过在 DERP 映射中设置标志来删除 Tailscale 的所有默认 DERP 区域,大白话就是删除所有官方中继服务器,只使用自建中继服务器。
"derpMap": {
//"OmitDefaultRegions": true,
"Regions": {
"902": {
"RegionID": 902,
"RegionCode": "home",
"RegionName": "Home",
"Nodes": [
{
"Name": "902a",
"RegionID": 902,
"DERPPort": 12345,
"HostName": "xxx", //xxx修改为申请的域名
"InsecureForTests": true,
},
],
},
},
},
查看并验证是否成功
官网检查
如下图:官网已经查看使用了自建服务器
命令行查看是否连接到自建DERP
C:\Users\jakob>tailscale netcheck
Report:
* UDP: true
* IPv4: yes,
* IPv6: yes,
* MappingVariesByDestIP: false
* HairPinning: false
* PortMapping:
* CaptivePortal: false
* Nearest DERP: Home
* DERP latency:
- home: 11ms (Home)
- tok: 102.9ms (Tokyo)
打开URL测试
直接打开 DERP 服务器的 URL:https://xxxx:12345,如果看到如下页面,且地址栏的 SSL 证书标签显示正常可用
防止 DERP 被白嫖
默认情况下 DERP 服务器是可以被白嫖的,只要别人知道了你的 DERP 服务器的地址和端口,就可以为他所用。按照下面两个步骤防止被白嫖:
- 在 DERP 服务器上安装 Tailscale
修改docker启动加上参数
--verify-clients
docker run --restart always \ --name derper -p 12345:12345 -p 3478:3478/udp \ -v /root/derper:/app/certs \ -v /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock \ //这一行不能少 -e DERP_CERT_MODE=manual \ -e DERP_ADDR=:12345 \ -e DERP_DOMAIN=xxx \ //xxx修改为申请的域名 -e DERP_VERIFY_CLIENTS=true \ -d fredliang/derper
如果docker启动缺少
/var/run/tailscale/tailscaled.sock
会出现如下报错