Tailscale国内自建derp中继实现P2P打洞直连
论坛的markdown编辑器不支持一些语法,推荐去这里看,更清晰一些
fnnas.wiki 在网络配置里第三个就是了
服务器购买指南
本教程采用Rainyun的宿迁NAT服务器进行搭建,已经自用了仨月了,稳定不掉线,一个月一包烟的
在雨云的服务器购买界面选择宿迁NAT服务器


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

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

 
- 
::note
上边是个GIF动图,展示了完整的操作流程,但可能有点大(40MB)
 
- ::
 
主机名称:随便写
主机:服务器的ip地址-图中的顺序查看



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

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

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

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

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

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

### 安装Tailscale
复制以下命令并运行
国内加速脚本地址和官网地址,
curl -fsSL https://ts-mirror.xedge.cc/install.sh | sh
curl -fsSL https://tailscale.com/install.sh | sh
:::tip
一般会在下图的这里卡很久,这是因为安装的软件包地址在国外,右侧会显示剩余时间,如果速度为0了没有关系
按 Ctrl+C 强制退出安装过程,重新复制指令安装一次,不会清理掉上一次的缓存,多试几次就好了。

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

登录Tailscale
执行以下命令登录Tailscale:
tailscale up
这里会看到终端给出一个网址

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

登录成功后终端中会提示我们登录成功了
配置DERP中继节点
- :::tip
 
- 如果你还不了解DERP的工作原理,可以查看我们的Tailscale网络架构详解
 
- ::
 
如果你在安装服务器的时候没有选择安装docker和docker-compose,那么请手动在雨云的控制面板中的以下位置选择docker并安装


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

点击新建规则

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

安装DERP容器
容器运行需要开放两个端口,我们首先在Rainyun的控制面板开放端口
- 在电脑上新建一个TXT文件,复制下方的代码进去,根据配置开放端口
 
- 
::warning
因为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配置页面
 
- 
::warning
ACL的配置相当于告诉每一个节点找谁去问如何找到目标节点+权限管理,修改前记得备份哦
 
- ::
 
修改提示都写好了,你可以将页面中的配置按提示换成自己的即可,建议操作步骤
- 先备份原配置
 
- 复制这份配置覆盖原有配置
 
- 保存检查是否出现语法错误(会有提示的)
 
{
    // Declare static groups of users. Use autogroups for all users or users with a specific role.
    // "groups": {
    //      "group:example": ["alice@example.com", "bob@example.com"],
    // },
    "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": "alice@example.com",
    //          "accept": ["tag:example"],
    //          "deny": ["100.101.102.103:443"],
    //      },
    // ],
}
- :::tip
 
- 这里默认你已经在电脑上登陆了Tailscale,如果没有可以去看本教程的上一篇。
 
- ::
 
搭建完成之后就结束了,接下来验证是否搭建成功
输入
tailscale netcheck
如果输入和我差不多,能看到自建的节点名称则说明成功了

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