debian系列 搭建tailscale DERP server(中继服务器)之傻瓜书
本文最后更新于 105 天前,其中的信息可能已经有所发展或是发生改变,如有失效可到评论区留言。

因为tailscale在国内没有官方的中继服务器(原因你懂的),所以虽然基本上还是可以使用(用国外的中继),但是延迟显示却非常高,而且从心底来讲,公用中继服务器让人不爽(内裤大家一起穿?)。想要低延迟、想要专用的中继服务器怎么办?只能自己动手搭了,如果家庭宽带有公网IP地址,或者有现成的云主机,那么你就可以有属于你自己的DERP服务器了。

1、安装最新版本的go

因为DERP是go开发的,所以需要先安装go的环境。

先根据自己的系统下载对应的下载包,go的官网链接为:https://go.dev/dl/
image.png

官网有不同的系统安装包,因为我的轻量级服务器是 debian 11:

image.png

所以下载红框中的go1.21.2.linux-amd64.tar.gz这个包,并上传到了root目录中,进入root目录,然后运行以下命令(需要以 root 身份登录或通过 sudo 运行该命令):

rm -rf /usr/local/go && tar -C /usr/local -xzf go1.21.2.linux-amd64.tar.gz

使用rm -rf /usr/local/go是为了删除以前版本的go,如果以前没有安装过go,可以不用rm命令。然后tar命令将go1.21.2.linux-amd64.tar.gz这个压缩包解压到了/usr/local/go目录下,如下:

image.png

在 PATH 环境变量中添加go的路径/usr/local/go/bin ,以便能运行go命令:

export PATH=$PATH:/usr/local/go/bin

注意:该方式只是在当前环境临时添加环境变量,如果要开机自动添加,需要编辑~/.bashrc文件并将上述环境变量添加到文件最后一行并保存退出。

打开命令提示符并键入以下命令,确认是否已安装 Go:

go version

确认命令正确打印了 Go 的安装版本:
image.png

2、安装DERP server

运行以下命令将最新的 DERP 服务器安装到 $HOME/go/bin:

go install tailscale.com/cmd/derper@main

但是遇到报错:

image.png

直接访问上图中的url,得到如下结果:
image.png

172.217.160.113应该是google cdn的ip地址,这表示无法访问(原因你懂的),这个时候需要临时添加一个goproxy:

export GOPROXY=https://goproxy.io

或者:

export GOPROXY=https://goproxy.cn

再次运行命令,成功:
image.png

在运行二进制文件之前,您需要一个指向服务器的域名。有了域名和二进制文件,就可以在你的域名上运行 DERP 服务器了。

这个时候,如果你有一个没有占用的443端口和80端口的云服务器,就可以直接运行以下命令启动derper:

sudo /root/go/bin/derper -c=/root/derper.conf -hostname=ab.cd.ef -a=:443 -stun 

-hostname:有效的公网域名,derper 会自动为这个域名申请 let’s encrypt 证书

-a:指定 derper 监听的 tcp 端口,默认为 443(如果要使用443端口,域名需要备案),可以指定其他非443端口(域名不需要备案)

-stun:stun 协议的 udp 端口,health check 的时候会用到,默认3478

这将启动 DERP 服务器,其端口为 443(或者你指定的监听端口),然后,就可以按照第3步 中的操作将 DERP 服务器添加到你的tailsacle网络。

关于443端口的问题:如果要使用443端口,则域名一定要备案,不然云供应商会根据TLS handshake里的SNI信息取得你的域名之后和备案数据库比对,如果不在其库中就会reset你的TLS握手,所以我推荐不要使用443端口。我在家里也部署了一个DERP,没有80和443端口一样正常工作,只是这种方式就不能使用let’s encrypt自动更新证书(必须要443端口),而且必须手动指定证书文件夹(其实这个也不是很所谓,阿里云和腾讯云都提供免费的1年证书,1年折腾一次,分分钟的事情,也还可以接受)。

有了443端口并且域名备了案只是大前提,如果云主机已经用nginx(也有可能是Apache,这个更麻烦)部署了站点占用了443端口,则需要nginx上使用steam进行4层反向代理(TLS工作在传输层),这样DERP的443才能和其他站点共存,如果nginx安装的时候没有加载steam相关的模块,又需要重新编译。。反正就是折腾,我比较懒,想想还是算了,如果是个全新的云服务器倒是可以一开始就规划好,但是现在云主机上也跑了一堆应用,就懒得弄了,如果有这个需要(主要是使用 let’s encrypt自动更新证书时间,这样不需要每年去手动更新有效期只有1年的免费证书)大家可以自行研究下,我在本文中就以非443端口来部署了。

这种方式也适合有公网IP地址的家庭宽带,当然最好同时有公网IPv4和IPv6,这样适用性更广(对单v4、单v6以及双栈客户端都能派上用场)。如果同时有v4和v6公网IP且想充分发挥作用,则需要在域名供应商同时添加A记录和AAAA记录指向DERP使用的域名。

请提前准备好DERP使用的域名解析以及该域名对应的证书(如果购买了阿里云或者腾讯云的域名,可以方便的白嫖1年期免费证书)。

所以在不使用443端口和80端口的情况下命令格式如下:

sudo /root/go/bin/derper -c=/root/derper.conf -hostname=ab.cd.ef -a=:45678 -http-port -1 -stun -certmode=manual -certdir=xxx

-a=:45678 修改监听端口为45678(这个大家根据自己环境进行修改)

-http-port -1 不使用http 80端口

-certmode manual 表示手动指定证书

-certdir yourcertpath 指定你证书的存放目录的路径,并且其中的证书命名一定不能错,假如你的域名是example.com,则证书名称必须是example.com.crt,私钥名称必须是example.com.key

-verify-clients 如果你要确保这个DERP服务器只有你一个人能访问,并且在安装DERP服务器的云主机上也安装了tailscale客户端并正常登录了你的账号,则加上这个参数就行了。如果除了自己还要给其他朋友使用,则不能添加这个参数,不过,如果是云主机,有固定公网IP,还是要小心一点。

命令运行成功以后,可以使用https://ab.cd.ef:45678进行访问,成功的话显示如下:
image.png

如果要设置DERP开机启动,详见另一篇文章:debian系列 设置命令或脚本开机启动的3种常见方式


注意:为了与 Tailscale 客户端更新保持兼容,最好需要定期更新 DERP 服务器,方法是重新运行前面的安装命令: go install tailscale.com/cmd/derper@main


3、添加DERP服务器到你的tailscale网络

每个区域都有一个唯一的区域 ID。区域 ID 值 900-999 保留给用户指定的自定义区域使用,Tailscale 自身不会使用。

例如,以下配置将启用域名为 example.com 的自定义 DERP 服务器:

{ 
 // ... other parts of ACL/Policy JSON 
 "derpMap": {
   "Regions": { 
     "900": { 
       "RegionID": 900, 
       "RegionCode": "myderp", 
       "Nodes": [ 
         {
           "Name": "1", 
           "RegionID": 900, 
           "HostName": "example.com", 
           "DERPPort": 45678,
          } 
        ] 
      } 
    } 
  } 
}

在上面的代码中,其实主要就是下图中的红框部分内容,复制到官网tailscale admin的Access Controls里,注意是在最后一个”}”之前:

image.png

修改的时候注意格式,主要是行最后的”,”。

上面的配置中,真正必须要修改的只有”HostName”和”DERPPort”(如果只有这一个RegionID的话),前者是你的域名,后者是前面derp服务器指定的监听端口,还有一个默认的stun udp 3478,这2个端口都需要在你的云主机的防火墙上打开。

在安装了tailscale的终端上(linux或者win)上运行命令查看使用的derp情况:

tailscale netcheck

显示如下:
image.png

这里显示的就是上面代码中你自己定义的”RegionCode”名称,我这里因为有2个DERP服务器,一个是腾讯云上的轻量级服务器,一个是家宽中的macmini。不过这里的检测其实只是检测udp 3478端口,这个显示可用也未必真可用,最后还是要DERP监听的https端口可用才行(文章前面提到的用浏览器能正常打开https://域名:自定义端口)。

也可以在tailscale的官网Machine Details中查看,如下,可以看到使用的Region ID(上面代码中定义的):
image.png

如果有多个DERP服务器,可以用多个Region的方式进行添加,进行备份,比如我添加了2个区域,ID是900和901:

image.png

则在Machine Details里显示如下:
image.png

另外介绍几个常用的tailsacle终端命令:

tailscale status  #查看tailscale终端之间的连接状态:在线或者离线,直接连接direct或是通过relay以及通过哪个relay

image.png

tailscale ping  #可以直接看到是否是通过DERP以及通过哪个DERP服务器连接

这里其实还可以拓展一下,如何监测DERP服务器的健康性的问题?最简单的方法就是监控https://DERP域名:指定端口的链接,具体可以参看我的另一篇文章:docker系列 搭建基于uptime和bark的应用实时健康监测及报警系统

另:我在家的DERP是用macos搭建的,配置过程和debian大同小异,并且是在软路由之后做的映射,所以搭建DERP也可以在内网通过出口设备上的公网IP映射来做(映射udp 3748和指定的TCP监听端口进来即可,并且映射的内外网端口要一致),并不一定非要直接搭建在有公网IP的云主机上,动态域名最好支持API的更新方式,毕竟腾讯云和阿里云的免费1年期证书还是很香的。

博客内容均系原创,转载请注明出处!更多博客文章,可以移步至网站地图了解。博客的RSS地址为:https://blog.tangwudi.com/feed,欢迎订阅;如有需要,可以加入Telegram群一起讨论问题。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
       

本站已禁用鼠标右键和各种快捷键,代码块内容可以直接在右上角点击复制按钮进行复制

zh_CN