Derp Server 简介

Tailscale 的终极目标是让任何位置的两台机器建立点对点连接,但现实中,大多数情况下,机器位于 NAT 和防火墙后面,这时就需要通过打洞实现 NAT 穿透。

Tailscale 的私钥仅保存在当前节点,因此 DERP 服务器无法解密流量,只能像其他互联网路由器一样,将加密流量从一个节点转发到另一个节点。DERP 使用了更先进的协议来防止滥用。

Tailscale 官方内置了多个 DERP 服务器,遍布全球,但不包括中国大陆,原因显而易见。这导致一旦流量通过 DERP 服务器中继,延迟将会显著增加。同时,官方的 DERP 服务器承载用户众多,存在一定的安全隐患。

为了实现低延迟和高安全性,我们可以参考 Tailscale 官方文档 自建私有 DERP 服务器。本文讲解的是一种无需域名的部署模式,可以直接使用 IP,但需要一些特殊的配置。

环境准备

  • 一台云服务器

这里云服务器我以 雨云 为例:

  1. 点击此链接 https://www.rainyun.com/NTEzMTM1_?s=csdn 并注册 雨云 账号
  2. 点击 云产品 → 云服务器 → 立即购买
    file
  3. 可以自己选择需要的带宽大小以及区域

    • 想要低延迟,可选择国内的服务器,但建议选择带宽大一点的,自行搭配即可

      file

  • 我这里选择2核2G的配置
    file
  1. 选择 Ubuntu 22.04 版本,并看情况选择是否原装 Docker

file

  1. 最后点击 立即购买 即可,也可以选择一元试用
  2. 购买后等待机器部署完毕后,点击购买的服务器,进入管理面板,找到远程连接相关信息

file

file

  1. 使用 PowerShell 远程连接

    • Win+R 输入 powershell

    file

-. 输入 ssh root@you_server_ip 例如 ssh root@154.9.227.239 回车后首次需要输入 yes 再次回车后即可登录服务器

file

安装

安装相关依赖

# 更新软件源
sudo apt update && sudo apt upgrade

# 安装相关依赖
sudo apt install -y wget git openssl curl

下载安装 golang

可打开 https://go.dev/dl/ 查看最新版本

如有新版本,可右键复制链接,此时我是 1.23.2 版本

file

# 下载安装包
wget https://go.dev/dl/go1.23.2.linux-amd64.tar.gz

# 解压
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.23.2.linux-amd64.tar.gz

# 添加到系统环境中并查看版本
echo "export PATH=$PATH:/usr/local/go/bin" >> /root/.bashrc
echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile
source /root/.bashrc
source /etc/profile
go version

# 让 go 使用国内代理源(国外云服务器忽略)
# go env -w GO111MODULE=on
# go env -w GOPROXY=https://goproxy.cn,direct

拉取并编译derper

go install tailscale.com/cmd/derper@main

进入到编译好的文件夹(不要直接复制命令,按实际情况填写,配合 Tab 按键补全路径)

cd /root/go/pkg/mod/tailscale.com@v1.76.1-xxxx/cmd/derper/

编辑 cert.go 文件

nano cert.go

找到以下内容并将部分代码注释

// 原始代码
func (m *manualCertManager) getCertificate(hi *tls.ClientHelloInfo) (*tls.Certificate, error) {

    if hi.ServerName != m.hostname {

        return nil, fmt.Errorf("cert mismatch with hostname: %q", hi.ServerName)

    }
    
// 改为
func (m *manualCertManager) getCertificate(hi *tls.ClientHelloInfo) (*tls.Certificate, error) {

    // if hi.ServerName != m.hostname {

    //     return nil, fmt.Errorf("cert mismatch with hostname: %q", hi.ServerName)

    // }

保存文件

  1. Ctrl + X 退出。
  2. Y 确认保存更改。

编译并输出到 /etc/derp/

go build -o /etc/derp/derper

查看是否存在 derper 文件

ls /etc/derp

自签证书

(derp.myself.com可随意编写,命令中四处需要一致)

openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout /etc/derp/derp.myself.com.key -out /etc/derp/derp.myself.com.crt -subj "/CN=derp.myself.com" -addext "subjectAltName=DNS:derp.myself.com"

开放端口(重要)

自行开放33445(tcp)、3478(udp)端口

设置开机自启

复制全部内容到命令行粘贴

cat > /etc/systemd/system/derp.service <<EOF

[Unit]

Description=TS Derper

After=network.target

Wants=network.target

[Service]

User=root

Restart=always

ExecStart=/etc/derp/derper -hostname **derp.myself.com** -a :33445 -stun -stun-port 3478 -http-port 33446 -certmode manual -certdir /etc/derp

RestartPreventExitStatus=1

[Install]

WantedBy=multi-user.target

EOF

设置开机自启

systemctl enable derp

启动derp服务

systemctl start derp

验证 DERP 服务

浏览器打开:https://ip+33445 页面正常显示 DERP 即可

file

修改 Tailscale 配置文件

打开 Tailscale 控制台,按照图中位置添加以下内容:

  • IPv4 修改为自己服务器的 IP
  • RegionCode 自定义即可
  • RegionName 自定义即可
"derpMap": {
        "OmitDefaultRegions": true,
        "Regions": {
            "901": {
                "RegionID":   901,
                "RegionCode": "ivwv·derp",
                "RegionName": "ivwv· Derper",
                "Nodes": [
                    {
                        "Name":             "901",
                        "RegionID":         901,
                        "IPv4":             "154.9.227.239",
                        "DERPPort":         33445,
                        "STUNPort":         3478,
                        "InsecureForTests": true,
                    },
                ],
            },
        },
    },

检查可用性

在任意链接 Tailscale 的电脑上终端输入 tailscale netcheck

PS C:\Users\Administrator> tailscale netcheck

Report:
        * UDP: false
        * IPv4: (no addr found)
        * IPv6: no, but OS has support
        * MappingVariesByDestIP:
        * PortMapping:
        * CaptivePortal: false
        * Nearest DERP: ivwv· Derper
        * DERP latency:
                - ivwv·derp: 157.4ms (ivwv· Derper)
PS C:\Users\Administrator>

看到 - ivwv·derp: 157.4ms (ivwv· Derper) 有回显延迟即正确部署完毕

或者在互相访问后输入 tailscale statu

PS C:\Users\Administrator> tailscale status
...
100.64.0.2   ubuntu    ***@ linux   active; relay "ivwv·derp", tx 93564 rx 101612
...

看到 relay "ivwv·derp", 即表示连接经过了我们搭建的 derp 服务器了

相关链接
雨云 - 新一代云服务提供商
我的博客:https://blog.ivwv.site
本文由博客一文多发平台 OpenWrite 发布!

买醉的荒野
1 声望0 粉丝