本文首发于知乎:https://zhuanlan.zhihu.com/p/638910565
封面图:https://www.pixiv.net/artworks/99873699
2023.07.13 更新:修正了一些命令的错误。
2023.07.19更新:想做个国外云版的教程,但是有点忘记怎么买便宜域名和dns解析搬到cloudflare上了,最近有点忙先挖个坑
2023.08.02:海外服务器版本 大内网战略(6.5):自建 Tailscale DERP 中继服务器 海外版
2023.08.27:更新常见失败的检查步骤
2023.09.13:更新解决go版本太旧导致安装失败的问题
自建中继服务器
原文:tailscale自建derper服务器中转,使用自定义端口_独步-的博客-CSDN博客,欢迎去给这位大佬的博客点个赞
以下示例借鉴上面链接的方法,使用阿里云演示(阿里云给我打钱!),国内其他云服务提供商操作类似。如果使用国外的云,因为国外域名无需备案,有另一套脚本可以自动申请 SSL 证书:headscale保底设施之DERP中继服务器自建(我没用过,不保证一定 work)。
以下情况你应该考虑国内云:
- 希望照着我的作业抄。
- 希望低延迟。
- 你薅到了国内云的优惠(挺多的,特别是学生优惠,我这台就是几十块钱1年的阿里云学生机)。
以下情况你应该考虑国外云:
- 你薅到了微软的免费 azure 100 学生机(这个翻车率巨高,但是薅到就是血赚),或者 github 学生包的其他权益。
- 人在国外。
- 希望大带宽(远程看视频),而对延迟不敏感。显然,国外云延迟都很高(即使是香港,大部分时候也是不如境内云),而国内云便宜机子给的带宽一般都很小,不足以看 1080p 视频。
准备工作
知道怎么购置服务器、域名,以及做域名解析和 SSL 证书申请的可跳过
首先,买一台阿里云的便宜机子,最便宜那档就行。系统选 Ubuntu。
之后在管理界面设置root密码。

然后买一个域名,买最便宜的:
比如我买个 test23333.top ,.top 第一年 9 元,之后续费每年 29,应该是最便宜的后缀了。


买了域名之后要备案,按照阿里云的流程走就行了。很多人很抵触备案,其实备案速度挺快的,两三天就能搞定(至少在广东)。这里就不放图了,我总不能财大气粗到买个域名备个案,然后写完教程就抛弃吧。
(ICP备案和公安备案是两种不同的备案,都要做,先ICP后公安。公安备案的坑请见:公安备案中,“交互式”和“非交互式”怎么选?)
现在,你应该有一个服务器:
(记住服务器的 IP,待会解析要用)

以及一个域名:

接下来解析域名:

添加解析记录,主机记录填啥随你喜欢(我填derp,这样整个域名就是 derp.域名.top
),记录值填服务器的公网 IP,然后确定。

然后就是申请 SSL 证书。首先“立即购买”领取免费的 20 张证书额度,然后创建一个新的证书并填信息:

填好子域名和个人信息:

因为都是阿里云的东西,所以不用你自己去填解析记录,自动验证。出来“验证成功”就可以关掉了。

显示“已签发”,点击下载,下载 nginx 版


把下载的压缩包解压,并且重命名文件如下所示。把 .pem
后缀改为 .crt
,并且两个文件名都是子域名。
记得打开 windows 资源管理器的显示后缀名再修改!!!

然后上传这两个证书到服务器。
首先,回到服务器管理页面,把之前解析的子域名加到服务器上



然后用root账户远程连接,没反应就多点几下:

进入远程bash后,首先新建证书文件夹:
输入 sudo mkdir /usr/local/cert
并回车

然后打开文件管理:

把文件上传到 /usr/local/cert
里面去。一次只能选一个,把两个文件都传上去就行。

安装 Tailscale 客户端
首先在你的服务器上安装 tailscale 客户端。参考 tailscale 官网的命令,在阿里云的终端中输入
curl -fsSL https://tailscale.com/install.sh | sh
,因为下载速度很慢可能要很久。
安装成功后,先不要输入 sudo tailscale up
启动tailscale,因为启动后 iptables 会添加规则导致阿里云workbench无法使用。
安装 Golang
卸载旧版本
警告
如果你的服务器上有其他软件依赖旧版本的 go,将其升级为新版本可能会发生不可预料的后果,请务必仔细评估与衡量。
旧版本 golang 会极大概率导致 derp 安装失败。如果你运行 go version
显示的是旧版本:

那就要卸载重安;如果显示命令不存在或者是最新版本(怎么看在后面),就可以忽略这步。
卸载:
rm -rf /usr/local/go
最好重新启动服务器。
查看最新版本
打开网址 https://go.dev/doc/install
下面截图里显示最新版本是 1.21.1

方法一:直接下载
输入 wget https://go.dev/dl/go<最新版本号>.linux-amd64.tar.gz
并回车,出现以下文字就是下载成功。

如果出现下图,就是下载失败(被墙了),走方法二。

方法二:本机下载再传上去
下载 https://go.dev/dl/go<最新版本号>
.linux-amd64.tar.gz ,然后回到阿里云workbench,和之前上传证书文件一样使用“新文件管理”把下好的压缩包上传到服务器上。

不管用什么方法,总之现在你已经将golang的安装包弄到你的服务器上了。
回到workbench命令行,解压下载好或者上传好的文件:
sudo tar -C /usr/local -xzf $HOME/go
<最新版本号>
.linux-amd64.tar.gz

切换到英文输入法。输入sudo vim /etc/profile
并回车。
按下 i 键,并操控键盘方向键将光标跑到最后:

回车换一行,粘贴以下代码:
export GOROOT=/usr/local/go export GOPATH=/usr/local/gopath export GOBIN=$GOPATH/bin export PATH=$PATH:$GOROOT/bin export PATH=$PATH:$GOPATH/bin

按一下 esc
键退出编辑模式,再依次输入 :wq
然后回车就可以保存并退出vim:

自动跳回到服务器终端。输入source /etc/profile
,然后输入 go version
检查有无安装 go 语言成功:

安装 derper 服务
建立目录:sudo mkdir -p /usr/local/gopath/bin
分别输入并回车以下两行代码,设置go代理+安装
go env -w GOPROXY=https://goproxy.cn,direct
go install tailscale.com/cmd/derper@main

用vim建立启动脚本:sudo vim /usr/local/gopath/bin/runderper
一定要是英文输入法状态,按下 i 键进入编辑模式,然后粘贴以下代码:(自己修改为自己的域名,端口号56473也可以自己修改,随意的)
#!/bin/sh
cd /usr/local/gopath/bin
nohup ./derper -hostname <你的域名> -c=derper.conf -a :56473 -http-port -1 -certdir /usr/local/cert -certmode manual -verify-clients -stun > console.log 2>&1 &
echo $! > app.pid

参数
-verify-clients
用来防止别人(知道你的域名后)白嫖你的中继节点,只认服务器上 tailscale 客户端登录的账号。如果你有给朋友白嫖的需求,可以把这个参数去掉。
然后按一下 esc 再依次输入 :wq 然后回车,保存并退出。
然后输入下面脚本建立停止脚本:
sudo vim /usr/local/gopath/bin/stopderper.sh
一定要是英文输入法状态,按下 i 键进入编辑模式,然后粘贴以下代码:
#!/bin/sh
kill `cat app.pid`
rm -rf app.pid
然后按一下 esc 再依次输入 :wq 然后回车,保存并退出。
然后输入以下代码赋权
chmod +x /usr/local/gopath/bin/runderper
chmod +x /usr/local/gopath/bin/stopderper.sh
然后建立服务。输入 sudo vim /etc/systemd/system/derper.service
,按 i 进入编辑模式,然后粘贴:
Description=derper服务
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/gopath/bin/runderper
ExecStop=/usr/local/gopath/bin/stopderper.sh
[Install]
WantedBy=multi-user.target
保存并退出,不用说怎么操作了吧。
然后去阿里云控制面板,放行derp端口(TCP 56473 和 UDP 3478):


CMD SSH登录 & Tailscale 启动
接下来要使用 cmd ssh 登录服务器而不能接着在阿里云workbench上操作,因为启动tailscale后workbench就用不了了。
在 cmd 中输入 ssh root@服务器IP
回车,输入密码即可登录:

输入 sudo tailscale up
,把弹出的网址复制到浏览器中进行授权。

(可选)清除 tailscales自定义规则
输入 iptables -L --line-numbers
查看目前的规则,可以看到 Chain INPUT 有条 ts-input。
记住前面的 num ,输入 iptables -D INPUT <num>
(自行替换<num>,我这里是1)。
再输入 iptables -L --line-numbers
,可以看见 ts 规则没了,阿里云的 workbench 也能上去了。

详细请见:
启动服务
然后设置开机启动
systemctl start derper systemctl enable derper
这个时候,打开网址 https://<你的域名>:56473/
,出现以下页面就是部署成功。

添加中继节点
回到 Tailscale 网页控制台,打开 Access Controls,添加下面代码在 ssh 前面:
"derpMap": {
// OmitDefaultRegions 用来忽略官方的中继节点,一般自建后就看不上官方小水管了
"OmitDefaultRegions": true,
"Regions": {
// 这里的 901 从 900 开始随便取数字
"901": {
// RegionID 和上面的相等
"RegionID": 901,
// RegionCode 自己取个易于自己名字
"RegionCode": "阿里云-深圳",
"Nodes": [
{
// Name 保持 1不动
"Name": "1",
// 这个也和 RegionID 一样
"RegionID": 901,
// 域名
"HostName": "<你的域名>",
// 端口号
"DERPPort": 56473,
},
],
},
},
},
我的如下图所示(我之前已经有一个中继了,所以途中有两个节点)。不要忘记保存。

检查延迟
在自己的电脑上打开cmd(已经安装好了 tailscale 客户端),输入 tailscale netcheck

显示了中继节点名称,成功了!
没成功怎么办
- 检查域名和端口有没有正确
- 检查服务器防火墙和云安全面板有没有正确放行端口
- 国内域名和服务器需要备案
- 国外域名和主机检查域名和ip有没有被墙
- 域名不要套cdn
vim /usr/local/gopath/bin/console.log
查看 derp 服务有没有成功启动
Comments 4 条评论
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
问问E老师,自己搭的中继节点有可能在开了身份验证的前提下定向共享给其他人吗?
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
@Jibcuo 这个没有了解过。也许可以把其他人的帐户邀请到自己的tailnet,然后通过ACL设定共享规则?
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
headscale怎么搭建呢
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 367
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
Warning: Trying to access array offset on value of type null in /www/wwwroot/wordpress/wp-content/themes/Sakurairo-main/functions.php on line 368
@熊猫 目前我还没试过搭建headscale