使用白嫖的阿里云9年服务器(alpine,免域名)搭建Tailscale Derp

E= γ mc² Lv2

使用白嫖的阿里云9年服务器(alpine,免域名)搭建Tailscale Derp

参考

在满足一定条件(比如双方都拥有公网 IPV6 地址)的情况下, Tailscale 负责打洞实现 P2P 直连,否则将走官方提供的中转节点(称为 Derp 服务器)。 但是大部分情况下,官方的 Derp 服务延迟很高(最近的是 HongKong 和 Tokyo 节点),此时就需要一个自建 Derp 中转服务。

  • 使用 Tailscale 的机器环境变量中一定不要设置全局代理

  • 不推荐 Derp 节点加入 Tailscle 网络,会影响到 IPTABLES 规则

alpine部署tailscale的derp节点

编译自己的derp(推荐在性能较好的机器上编译)

这里我们对 Derp 官方的 GO 源码稍做改动,实现无需域名,直接通过公网服务器的 IP 地址来访问 Derp 服务。

安装 GO 环境(以archlinux为例)

1
sudo pacman -S go

然后获取 Derper 源码

1
git clone https://github.com/tailscale/tailscale.git --depth=1

进入到 tailscale/cmd/derper ,修改 cert.go 文件中的 getCertificate 函数

1
2
3
4
5
6
7
8
9
10
11
12
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)
//}

// Return a shallow copy of the cert so the caller can append to its
// Certificate field.
certCopy := new(tls.Certificate)
*certCopy = *m.cert
certCopy.Certificate = certCopy.Certificate[:len(certCopy.Certificate):len(certCopy.Certificate)]
return certCopy, nil
}

编译这个改动过的 Derper(需要静态编译,alpine用的不是glibc)

1
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./derper .

把编译出来的,当前目录下面的derper文件,上传到alpine机器的/usr/local/bin/目录下面,并赋予x权限

1
doas a+x /usr/local/bin/derper

配置 SSL 证书

安装 OpenSSL

1
doas apk add openssl

使用 OpenSSL 配置 SSL 证书

1
2
3
4
5
6
mkdir /usr/local/.ssl
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
-keyout /usr/local/.ssl/derp.test.com.key \
-out /usr/local/.ssl/derp.test.com.crt \
-subj "/CN=derp.test.com" \
-addext "subjectAltName=DNS:derp.test.com"

其中的 derp.test.com 是你的 Derp 服务域名,可以自行替换成任意域名。

配置 Derp 服务

创建并编辑 /etc/init.d/derper 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/sbin/openrc-run

name="TS Derper"
description="Tailscale Derper server"

command="/usr/local/bin/derper"
command_args="-hostname tailscale-derp.com -a :12345 -http-port 33446 -certmode manual -certdir /usr/local/.ssl"
command_user="root"

pidfile="/var/run/derper.pid"
output_log="/var/log/derper.log"
error_log="/var/log/derper.log"

command_background="yes"

depend() {
need net
}

start_pre() {
checkpath -f -o root:root /var/run/derper.pid
checkpath -f -o root:root /var/log/derper.log
}

在阿里云控制面板设置防火墙,放行 12345,33446,3478的tcp与udp协议,授权对象是所有IPv4(0.0.0.0/0)

启用并启动 Derp 服务

1
2
doas rc-update add derper default
doas rc-service derper start

访问 IP:12345 这个地址看是否生效,会看到一个 Derp 相关的网页


配置Tailscale

在 Tailscale 控制台管理界面 Access Control 中配置 Derp 服务的地址

直接在ssh配置前面加上这一段配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
"derpMap": {
"Regions": {
// 这里的 901 从 900 开始随便取数字
"901": {
// RegionID 和上面的相等
"RegionID": 901,
// RegionCode 自己取个易于自己名字
"RegionCode": "xxx",
"Nodes": [
{
"Name": "xxx",
// 这个也和 RegionID 一样
"RegionID": 901,
// 域名
//"HostName": "<你的域名>",
// 端口号
"DERPPort": 12345,
"STUNPort": 3478, // DERP 服务器 STUN 端口,用于 NAT 穿越的端口
"IPv4": "x.x.x.x", // 更换为自己的 IP地址
"InsecureForTests": true,
},
],
},
},
},

然后点击Save

更换derp节点需要客户端重启tailscale才能生效,不然使用的时候还是会用之前的derp节点

在客户端查询网络情况

1
tailscale netcheck
  • 标题: 使用白嫖的阿里云9年服务器(alpine,免域名)搭建Tailscale Derp
  • 作者: E= γ mc²
  • 创建于 : 2024-09-06 15:00:36
  • 更新于 : 2024-09-06 15:00:38
  • 链接: https://redefine.ohevan.com/2024/09/06/使用白嫖的阿里云9年服务器(alpine,免域名)搭建Tailscale Derp/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论