跳到主要内容

Tailscale国内自建derp中继实现P2P打洞直连

提示

希望保底也有一定速度的用户看这里

电信用户推荐国内NAT类型的服务器

联通和移动用户推荐claw的7刀/年的服务器

南方走新加坡/日本 北方选日本

服务器购买指南

本教程采用Rainyun的宿迁NAT服务器进行搭建,已经自用了仨月了,稳定不掉线,一个月一包烟的

在雨云的服务器购买界面选择宿迁NAT服务器

购买地址

雨云服务器购买页面 - 宿迁NAT服务器选择界面 服务器网络测速结果 - 显示上传和下载速度
备注

别管我的为啥速度这么低因为在转亲戚没wifi只能连热点了,信号就3格还**4G

连接到服务器

下载Finalshell SSH连接工具

点击上方链接下载Finalshell连接工具安装包,下载完成后双击安装完成后启动finalshell软件

点击文件夹标志

Finalshell界面 - 点击新建连接文件夹图标

在弹出的第一个窗口中点击第一个文件夹Finalshell新建连接窗口 - 选择第一个系统文件夹

Finalshell完整操作流程演示 - 从新建连接到配置服务器信息
备注

上边是个GIF动图,展示了完整的操作流程,文件大小约 1.6MB

主机名称:随便写

主机:服务器的ip地址-图中的顺序查看

雨云控制面板 - 服务器IP地址信息展示 雨云控制面板 - 服务器远程连接详细信息 雨云控制面板 - 远程连接地址复制按钮位置

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

Finalshell连接配置 - 主机地址输入框位置

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

改完后如图

Finalshell连接配置 - 端口号设置完成状态

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

雨云控制面板 - 服务器登录凭据(用户名密码)展示

此时我们在连接管理器中可以看到我们的服务器配选项,双击进行连接。

连接成功后如图所示

Finalshell终端界面 - 成功连接到远程服务器

Tailscale安装

提示

如果你还没有安装 Tailscale,建议先阅读Tailscale基础安装教程完成客户端的安装

首先更新系统软件包

sudo apt update && apt upgrade
Linux终端 - 执行系统更新命令的输出

终端会提示是否更新,输入Y后回车进行系统更新。

提示

过程会比较久多等一会,可以起身喝口水上个厕所什么的

一般不会超过3分钟,如果看到终端输出这个卡很久,不要动,耐心等一会即可

Linux终端 - 系统更新过程等待界面

安装Tailscale

复制以下命令并运行

国内加速脚本地址和官网地址,

curl -fsSL https://ts-mirror.xedge.cc/install.sh | sh
curl -fsSL https://tailscale.com/install.sh | sh
提示

一般会在下图的这里卡很久,这是因为安装的软件包地址在国外,右侧会显示剩余时间,如果速度为0了没有关系

按 Ctrl+C 强制退出安装过程,重新复制指令安装一次,不会清理掉上一次的缓存,多试几次就好了。

Linux终端 - Tailscale安装过程等待下载界面

当看到这里的时候就说明安装成功了

Linux终端 - Tailscale安装成功提示界面

登录Tailscale

执行以下命令登录Tailscale:

tailscale up

这里会看到终端给出一个网址

Linux终端 - Tailscale登录授权链接显示界面

完整的复制下来到浏览器中访问,会看到如图的内容

Tailscale网页登录界面

登录成功后终端中会提示我们登录成功了

配置DERP中继节点

提示

如果你还不了解DERP的工作原理,可以查看Tailscale官方文档或者本站的另一篇教程

如果你在安装服务器的时候没有选择安装docker和docker-compose,那么请手动在雨云的控制面板中的以下位置选择docker并安装

雨云控制面板 - Docker安装选项 雨云控制面板 - 确认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的预览文件框位置如图

Finalshell文件预览 - 上传配置文件

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

Finalshell文件预览 - 刷新配置文件

在终端中输入下面的命令启动derp节点

docker-compose up -d 

接着输入下面的命令检查容器状态

docker ps -a

期待的输出应该和图中的差不多

DERP服务启动成功界面

修改ACL配置

修改地址:Tailscale ACL配置页面

注意

ACL的配置相当于告诉每一个节点找谁去问如何找到目标节点+权限管理,修改前记得备份哦

修改提示都写好了,你可以将页面中的配置按提示换成自己的即可,建议操作步骤

  1. 先备份原配置
  2. 复制这份配置覆盖原有配置
  3. 保存检查是否出现语法错误(会有提示的)
{
// 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节点列表查看

检验成果

提示

Tailscale提供了magicdns这个功能,该功能可以让我们直接使用设备名来进行访问而无需每次都手打ip

  • 使用Win+R ,输入cmd,打开命令行界面
  • 输入tailscale ping nas的设备名

这里我将两台设备都放在四层nat后,并且关闭ipv6(有v6就直连了),模拟最差的网络环境,可以看到via后面的就是连接方式,这里就是通过我们自建的derp节点进行转发访问,我们搭建derp中转的保底服务就完成了。

DERP中继测试结果