本文偏向实践,具体原理可以参考官方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=xxxxxx为申请的域名

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内容

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,
          },
        ],
      },
    },
  },

EDIT

查看并验证是否成功

官网检查

如下图:官网已经查看使用了自建服务器
Latency
命令行查看是否连接到自建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 证书标签显示正常可用
打开URL测试

防止 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会出现如下报错
    error

参考文章

Tailscale 基础教程:部署私有 DERP 中继服务器

最后修改:2024 年 03 月 31 日
如果觉得我的文章对你有用,请随意赞赏