Tailscale国内自建derp中继实现P2P打洞直连
希望保底也有一定速度的用户看这里
电信用户推荐国内NAT类型的服务器
联通和移动用户推荐claw的7刀/年的服务器
南方走新加坡/日本 北方选日本
服务器购买指南
本教程采用Rainyun的宿迁NAT服务器进行搭建,已经自用了仨月了,稳定不掉线,一个月一包烟的
在雨云的服务器购买界面选择宿迁NAT服务器


别管我的为啥速度这么低因为在转亲戚没wifi只能连热点了,信号就3格还**4G
连接到服务器
点击上方链接下载Finalshell连接工具安装包,下载完成后双击安装完成后启动finalshell软件
点击文件夹标志

在弹出的第一个窗口中点击第一个文件夹

上边是个GIF动图,展示了完整的操作流程,文件大小约 1.6MB
主机名称:随便写
主机:服务器的ip地址-图中的顺序查看



复制上方的远程连接地址 粘贴到主机地址

接着更改端口,填写为地址冒号后面的数字
改完后如图

接着复制登录用的用户名和密码,点击确定保存。

此时我们在连接管理器中可以看到我们的服务器配选项,双击进行连接。
连接成功后如图所示

Tailscale安装
如果你还没有安装 Tailscale,建议先阅读Tailscale基础安装教程完成客户端的安装
首先更新系统软件包
sudo apt update && apt upgrade

终端会提示是否更新,输入Y后回车进行系统更新。
过程会比较久多等一会,可以起身喝口水上个厕所什么的
一般不会超过3分钟,如果看到终端输出这个卡很久,不要动,耐心等一会即可

安装Tailscale
复制以下命令并运行
国内加速脚本地址和官网地址,
curl -fsSL https://ts-mirror.xedge.cc/install.sh | sh
curl -fsSL https://tailscale.com/install.sh | sh
如果你在安装服务器的时候没有选择安装docker和docker-compose,那么请手动在雨云的控制面板中的以下位置选择docker并安装


容器运行需要开放两个端口,我们首先在Rainyun的控制面板开放端口
点击端口设置

点击新建规则

NAT主机的端口需要设置的稍微高一点才能保证内网端口一致,其实不设置一样的端口也没事(个人习惯不同,尽量按我的操作来就行)

安装DERP容器
容器运行需要开放两个端口,我们首先在Rainyun的控制面板开放端口
在电脑上新建一个TXT文件,复制下方的代码进去,根据配置开放端口
因为Rainyun(雨云)的NAT机默认是不提供10000以下的端口的,
因此我们需要先创建端口,然后修改下方的配置文件
services:
derper:
image: ghcr.io/yangchuansheng/ip_derper:latest
container_name: derper
restart: always
ports:
- "56678:56678" # 这里的56678请改成你自己在上面配置中创建的tcp+udp协议的端口
- "56679:56679/udp" #3478 为stun默认端口,如果你是用非NAT主机则改回3478,否则修改为上面创建的udp协议端口,然后在服务器提供商的端口控制界面放行这两个端口就好了
volumes:
- /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock # 映射本地的tailscale 客户端验证连接
environment:
- DERP_ADDR=:56678 # 此处需要与上面的同步修改
- DERP_CERTS=/app/certs
- DERP_VERIFY_CLIENTS=true
修改好后我们保存,重新命名文件夹为下面的名称
docker-compsoe.yaml
确保当前Finalshell的预览文件框位置如图

在空白处右键点击上传,将我们修改好的配置上传到服务器,上传完成之后点击刷新就可以看到我们的配置文件

在终端中输入下面的命令启动derp节点
docker-compose up -d
接着输入下面的命令检查容器状态
docker ps -a
期待的输出应该和图中的差不多

修改ACL配置
修改地址:Tailscale ACL配置页面
ACL的配置相当于告诉每一个节点找谁去问如何找到目标节点+权限管理,修改前记得备份哦
修改提示都写好了,你可以将页面中的配置按提示换成自己的即可,建议操作步骤
- 先备份原配置
- 复制这份配置覆盖原有配置
- 保存检查是否出现语法错误(会有提示的)
{
// Declare static groups of users. Use autogroups for all users or users with a specific role.
// "groups": {
// "group:example": ["[email protected]", "[email protected]"],
// },
"derpMap": {
"OmitDefaultRegions": true,//这里的true是不开启官方derp节点,如果需要则改为false,不过由于这些节点都在境外所以我们还是不启用了
"Regions": {
"900": {
"RegionID": 900,//不用改
"RegionCode": "001",//不用改
"RegionName": "SQrainyun",//不用改
"Nodes": [
{
"Name": "fff",
"RegionID": 900,
"HOSTName": "rack1.raincs.cc",//这里将引号内的域名改成图1中的域名
"IPv4": "103.40.13.68",//这里写NAT主机的ip地址
"DERPPort": 56678,//这里写tcp+udp协议的端口
"STUNPort": 56679,//这里改为udp协议的端口
"InsecureForTests": true,
},
],
},
},
},
// Define the tags which can be applied to devices and by which users.
// "tagOwners": {
// "tag:example": ["autogroup:admin"],
// },
// Define access control lists for users, groups, autogroups, tags,
// Tailscale IP addresses, and subnet ranges.
"acls": [
// Allow all connections.
// Comment this section out if you want to define specific restrictions.
{"action": "accept", "src": ["*"], "dst": ["*:*"]},
// Allow users in "group:example" to access "tag:example", but only from
// devices that are running macOS and have enabled Tailscale client auto-updating.
// {"action": "accept", "src": ["group:example"], "dst": ["tag:example:*"], "srcPosture":["posture:autoUpdateMac"]},
],
// Define postures that will be applied to all rules without any specific
// srcPosture definition.
// "defaultSrcPosture": [
// "posture:anyMac",
// ],
// Define device posture rules requiring devices to meet
// certain criteria to access parts of your system.
// "postures": {
// // Require devices running macOS, a stable Tailscale
// // version and auto update enabled for Tailscale.
// "posture:autoUpdateMac": [
// "node:os == 'macos'",
// "node:tsReleaseTrack == 'stable'",
// "node:tsAutoUpdate",
// ],
// // Require devices running macOS and a stable
// // Tailscale version.
// "posture:anyMac": [
// "node:os == 'macos'",
// "node:tsReleaseTrack == 'stable'",
// ],
// },
// Define users and devices that can use Tailscale SSH.
"ssh": [
// Allow all users to SSH into their own devices in check mode.
// Comment this section out if you want to define specific restrictions.
{
"action": "check",
"src": ["autogroup:member"],
"dst": ["autogroup:self"],
"users": ["autogroup:nonroot", "root"],
},
],
// Test access rules every time they're saved.
// "tests": [
// {
// "src": "[email protected]",
// "accept": ["tag:example"],
// "deny": ["100.101.102.103:443"],
// },
// ],
}
这里默认你已经在电脑上登陆了Tailscale,如果没有可以去看本教程的上一篇。
搭建完成之后就结束了,接下来验证是否搭建成功
输入
tailscale netcheck
如果输入和我差不多,能看到自建的节点名称则说明成功了

检验成果
Tailscale提供了magicdns这个功能,该功能可以让我们直接使用设备名来进行访问而无需每次都手打ip
- 使用Win+R ,输入cmd,打开命令行界面
- 输入tailscale ping
nas的设备名
这里我将两台设备都放在四层nat后,并且关闭ipv6(有v6就直连了),模拟最差的网络环境,可以看到via后面的就是连接方式,这里就是通过我们自建的derp节点进行转发访问,我们搭建derp中转的保底服务就完成了。
