Derp Server 简介
Tailscale 的终极目标是让任何位置的两台机器建立点对点连接,但现实中,大多数情况下,机器位于 NAT 和防火墙后面,这时就需要通过打洞实现 NAT 穿透。
Tailscale 的私钥仅保存在当前节点,因此 DERP 服务器无法解密流量,只能像其他互联网路由器一样,将加密流量从一个节点转发到另一个节点。DERP 使用了更先进的协议来防止滥用。
Tailscale 官方内置了多个 DERP 服务器,遍布全球,但不包括中国大陆,原因显而易见。这导致一旦流量通过 DERP 服务器中继,延迟将会显著增加。同时,官方的 DERP 服务器承载用户众多,存在一定的安全隐患。
为了实现低延迟和高安全性,我们可以参考 Tailscale 官方文档 自建私有 DERP 服务器。本文讲解的是一种无需域名的部署模式,可以直接使用 IP,但需要一些特殊的配置。
环境准备
- 一台云服务器
这里云服务器我以 雨云 为例:
- 点击此链接 https://www.rainyun.com/NTEzMTM1_?s=csdn 并注册 雨云 账号
- 点击 云产品 → 云服务器 → 立即购买
可以自己选择需要的带宽大小以及区域
想要低延迟,可选择国内的服务器,但建议选择带宽大一点的,自行搭配即可
- 我这里选择2核2G的配置
- 选择 Ubuntu 22.04 版本,并看情况选择是否原装 Docker
- 最后点击 立即购买 即可,也可以选择一元试用
- 购买后等待机器部署完毕后,点击购买的服务器,进入管理面板,找到远程连接相关信息
使用 PowerShell 远程连接
- Win+R 输入
powershell
- Win+R 输入
-. 输入 ssh root@you_server_ip
例如 ssh root@154.9.227.239
回车后首次需要输入 yes
再次回车后即可登录服务器
安装
安装相关依赖
# 更新软件源
sudo apt update && sudo apt upgrade
# 安装相关依赖
sudo apt install -y wget git openssl curl
下载安装 golang
可打开 https://go.dev/dl/ 查看最新版本
如有新版本,可右键复制链接,此时我是 1.23.2 版本
# 下载安装包
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)
// }
保存文件
Ctrl + X
退出。- 按
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 即可
修改 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 发布!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。