Tailscale部署derp服务器
操作系统要求: ubuntu22.04 ubuntu24.04 ubuntu20.04均可,OpencloudOS9.4也可以(理论上其它使用yum的系统也可以),只是其它系统未测试,
开放网络端口: udp: 3478(必须) tcp: 43587(自定义的https端口), ping端口
系统更新
aptupdate&&aptupgradederp服务器升级可以使用(拉取最新版本)
goinstalltailscale.com/cmd/derper@latest查看当前derp服务器的版本
~/go/bin/derper-version也可以直接去缓存目录看看下载的是哪个版本
ls~/go/pkg/mod/tailscale.com@*/本地检查tailscale可用的节点
tailscale netcheck如下图(自建上海节点):
下载GO
安装依赖
aptinstall-ywgetgitopensslcurl拉取 “go” 压缩包(官网地址: https://go.dev/dl/ )
wgethttps://go.dev/dl/go1.22.5.linux-amd64.tar.gz解压 “go” 压缩包
rm-rf/usr/local/go&&tar-C/usr/local-xzfgo1.22.5.linux-amd64.tar.gz查看 “go” 版本信息(验证是否安装成功 )
exportPATH=$PATH:/usr/local/go/bin go version添加环境变量
echo"export PATH=$PATH:/usr/local/go/bin">>/etc/profilesource/etc/profile安装tailscale derper
设置go代理+安装国内加速下载(中国最可靠的 Go 模块代理,官网:https://goproxy.cn/),
goenv-wGO111MODULE=on goenv-wGOPROXY=https://goproxy.cn,direct使用go模块拉取 “tailscale derper”
goinstalltailscale.com/cmd/derper@main进入安装目录修改证书文件
cd/root/go/pkg/mod/
再次访问
cdtailscale.com@v1.71.0-pre.0.20240730203925-949b15d85837/cmd/derper
编辑cert.go文件
vicert.go
使用的域名证书相同此段无需删除,此段主要是验证域名信息的
删除红框的代码再保存
cd/go/pkg/mod/tailscale.com@v1.71.0-pre.0.20240730203925-949b15d85837/cmd/derper在此目录开始编译derper
go build-o/etc/derp/derper验证是否编译成功
先cd到根目录
cd再执行下面验证代码 (显示derper说明配制成功)
ls/etc/derp
设置自签域名证书
设置域名信息,域名可以自定义也可以使用自己的域名
生成私有证书文件,证书的默认目录为 /etc/derp/
crt格式的证书
openssl req-x509-newkeyrsa:4096-sha256-days3650-nodes-keyout/etc/derp/derp.yu.key-out/etc/derp/derp.域名.xyz.crt-subj"/CN=derp.域名.xyz"-addext"subjectAltName=DNS:derp.域名.xyz"pem格式的证书(用此方法生成的crt证书好像不被derp识别,待验证与解决,暂使用crt格式的证书)
openssl req-x509-newkeyrsa:4096-sha256-days3650-nodes-keyout/etc/derp/derp.域名.key-out/etc/derp/derp.域名.xyz.pem-subj"/CN=derp.域名.xyz"-addext"subjectAltName=DNS:derp.域名.xyz"这条命令使用 OpenSSL 生成了一个自签名的 X.509 证书和相应的 RSA 私钥,具体参数解释如下:
- openssl req -x509: 这条命令的 req 部分通常用于生成证书签名请求(CSR),但加上 -x509
选项后,它会直接生成一个自签名的证书,而不是 CSR。 - newkey rsa:4096: 这个选项指示 OpenSSL 生成一个新的 RSA 私钥,密钥长度为 4096 位。这是一个相对安全的密钥长度,适用于需要较高安全性的场景。
- sha256: 指定使用 SHA-256 哈希算法对证书进行签名。SHA-256 是目前广泛使用的哈希算法之一,提供了比 SHA-1 更高的安全性。
- days 3650: 设置证书的有效期为 3650 天,即大约 10 年。请注意,自签名证书的有效期可以根据需要设置,但通常不建议设置过长,以免证书丢失或泄露后造成长期风险。
- nodes: 这个选项告诉 OpenSSL 在生成私钥时不需要密码保护(即没有密码短语)。这对于自动化脚本或服务很有用,但请注意,这可能会降低安全性。
- keyout /etc/derp/derp.域名.xyz.key: 指定私钥文件的保存位置和文件名。在这个例子中,私钥将被保存在 /etc/derp/derp.域名.xyz.key。
- out /etc/derp/derp.域名.xyz.crt: 指定生成的证书文件的保存位置和文件名。在这个例子中,证书将被保存在 /etc/derp/derp.域名.xyz.crt。
- subj “/CN=derp.域名.xyz”: 直接在命令行中指定证书的主题(subject)信息,这里只设置了通用名称(CN)为 derp.域名.xyz。通常,证书的主题信息还包括其他字段,如组织(O)、组织单位(OU)等,但在这个例子中只设置了 CN。
- addext “subjectAltName=DNS:derp.域名.xyz”: 这个选项用于向证书添加额外的扩展信息,这里添加的是 subjectAltName 扩展,其值为 DNS:derp.域名.xyz。这个扩展允许证书指定除了 CN 之外的其他域名或 IP地址,对于 HTTPS 服务器尤其重要,因为它允许服务器使用同一个证书为多个域名提供服务(如果证书和域名都经过正确配置)。
综上所述,这条命令生成了一个私钥文件和一个自签名的证书文件,私钥长度为 4096 位,证书有效期为 10 年,使用 SHA-256 算法签名,并直接指定了证书的主题信息和一个额外的 subjectAltName 扩展。这个证书和私钥可以用于 HTTPS 服务器、SSL/TLS 加密通信等多种场景。
以上步骤生成证书后可以替换为自己的域名证书
更换与上传证书
使用上传软件将证书文件上传到服务器的tmp目录,上面命令默认生成的证书文件位于 /etc/derp/目录下
到证书目录备份原证书文件
mvderp.域名.xyz.crt derp.域名.xyz.crt.bakmvderp.域名.xyz.key derp.域名.xyz.key.bak移动tmp目录中的证书文件到 /etc/derp/目录中
mv/tmp/derp.域名.xyz.key /tmp/derp.域名.xyz.crt /etc/derp/再重启derp服务,使新证书生效
systemctl daemon-reload systemctl restart derp配置DERP服务
将下面的代码复制到记事本里,端口修改为 “43587”,可随机使用,自己随便想一个
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.域名.xyz -a :43587 -http-port 43588 -certmode manual -certdir /etc/derp RestartPreventExitStatus=1 [Install] WantedBy=multi-user.target EOF启用DERP
重新加载DERP服务
systemctl daemon-reload
重启DERP服务
systemctl restart derp
设置开机自启
systemctl enable derp
检查DERP服务器状态
浏览器访问:云服务器的IP地址+端口号(“自己改的端口”)
ACL配置
进入tailscale网页端
进入ACL界面添加以下代码
"derpMap":{// OmitDefaultRegions 用来忽略官方的中继节点,一般自建后就看不上官方小水管了,false为启用官方节点,true为不启用官方节点"OmitDefaultRegions":false,"Regions":{// 这里的901从900开始随便取数字"901":{// RegionID 和上面的相等"RegionID":901, // RegionCode 自己取个易于自己名字"RegionCode":"shg","RegionName":"ShangHai","Nodes":[{// Name 保持1不动"Name":"1", // 这个也和 RegionID 一样"RegionID":901, // 域名"HostName":"derp.域名.xyz","IPv4":"*.*.*.*", // 端口号"DERPPort":43587,},],},},},以上方法搭建好后可以任意人使用,下面的方法为添加为自己使用的白名单derp服务器
防白嫖设置
如果服务器IP地址和端口泄露了 那么是可以被别人白嫖的,为了防止白嫖
在云服务器上安装tailscale客户端并加入到tailscale网络中
curl-fsSLhttps://tailscale.com/install.sh|sh安装步骤参考官网的安装的方法
修改DERP服务,开启连接验证
编辑derp.service
vim/etc/systemd/system/derp.service
最后面增加–verify-clients 注意空格,增加后保存即可
重新加载DERP服务
systemctl daemon-reload重启DERP服务
systemctl restart derp查看与验证
查看服务器监听端口
ss-tuln
如上图,显示udp的3478与tcp的43587处于正常监听状态,就是正常启动了
可以使用 ss -tuln 或者netstat -tuln
-t 表示显示TCP端口
-u 表示显示UDP端口
-l 表示显示正在监听的端口
-n 表示不解析服务名,直接显示端口号
什么是DERP
DERP 即 Detoured Encrypted Routing Protocol,这是 Tailscale 自研的一个协议,它是一个通用目的包中继协议,运行在 HTTP 之上,而大部分网络都是允许 HTTP 通信的。
它根据目的公钥(destination’s public key)来中继加密的流量(encrypted payloads)。
Tailscale 会自动选择离目标节点最近的 DERP server 来中继流量。
Tailscale 使用的算法很有趣: 所有客户端之间的连接都是先选择 DERP 模式(中继模式),这意味着连接立即就能建立(优先级最低但 100% 能成功的模式),用户不用任何等待。然后开始并行地进行路径发现,通常几秒钟之后,我们就能发现一条更优路径,然后将现有连接透明升级(upgrade)过去,变成点对点连接(直连)。因此, DERP 既是 Tailscale 在 NAT 穿透失败时的保底通信方式(此时的角色与 TURN 类似),也是在其他一些场景下帮助我们完成 NAT 穿透的旁路信道。换句话说,它既是我们的保底方式,也是有更好的穿透链路时,帮助我们进行连接升级(upgrade to a peer-to-peer connection)的基础设施。
来源: http://www.junyao.tech/posts/18297f50.html
测试tailscale是否经过DERP服务器作为中继
如果DERP证书到期,可以直接编辑/etc/derp/目录下的key与crt文件内容
vi模式下,可以直接输入:1,$d(清空保存的全部内容)
注意不要按i进入编辑模式,修改完成后重启服务
重启derp服务
systemctl restart derp刷新网站即可查询到证书是否更新
opencloudos系统安装
下载GO
安装依赖
yuminstall-ywgetgitopensslcurl拉取 “go” 压缩包(官网地址: https://go.dev/dl/ )
wgethttps://go.dev/dl/go1.25.1.linux-amd64.tar.gz其它步骤可以使用上面的,全部通用
自动证书更换方法
本教程使用docker部署的allinssl方案实现自动更换证书
系统使用ubuntu2404服务器,ubuntu用户名(root用户未开启远程登陆),需要sudo授权,ssh链接服务器
由于allinssl只支持pem格式的证书,因此有后置命令,
第一行命令移动生成的tmp目录中的证书文件到/etc/derp目录
第二行命令重命名pem格式的文件为crt格式
第三四行为重启derp服务,使旧证书更换为新证书服务
申请证书使用域名服务商的API,目录allinssl支持大部分服务商的API,如下图