文章目录
- 整体大纲
- 目的:为什么要建立 Derp 中转服务器
- 云服务器安装 Derp
- Derp 中转服务器介绍
- 安装 Go 环境
- 通过 Go 安装 Derp
- 处理证书文件
- 自签一个域名给 Derp
- 验证 Derp 是否启动
- 云服务器安装并登录 Tailscale
- 第一种组合: `官方 Tailscale 账号` + 自己的 `Derp` 中转
- 第二种组合:自建 Headscale + 自建 Derp (无域名版本)
- 其他的一些配置
- 自建 Derp 提供 IPv6 的支持(隧道版本,不推荐,延迟高)
- 防止 Derp 被白嫖(添加客户端验证)
- 参考
- 以上的操作命令合集
整体大纲
目的:为什么要建立 Derp 中转服务器
- 官方给你的公用服务器一般情况下不在大陆,所以
延迟高
- 并且因为是公用的,可能会
拥挤
,导致不稳定
在大陆的情况下,为了降低延迟
,提高带宽
,所以要自建 Derp
云服务器安装 Derp
以下是个人的操作,仅供参考~
Derp 中转服务器介绍
Tailscale
使用的算法很有趣: 所有客户端之间的连接都是先选择 DERP 模式(中继模式),这意味着连接立即就能建立(优先级最低但 100% 能成功的模式),用户不用任何等待。然后开始并行地进行路径发现,通常几秒钟之后,我们就能发现一条更优路径,然后将现有连接透明升级(upgrade)过去,变成点对点连接(直连)
因此, DERP
既是 Tailscale
在 NAT
穿透失败时的保底通信方式(此时的角色与 TURN
类似),也是在其他一些场景下帮助我们完成 NAT
穿透的旁路信道。换句话说,它既是我们的保底方式,也是有更好的穿透链路时,帮助我们进行连接升级(upgrade to a peer-to-peer connection
)的基础设施。
Tailscale
官方内置了很多 DERP
服务器,分步在全球各地,惟独不包含中国大陆,原因你懂得。这就导致了一旦流量通过 DERP 服务器进行中继,延时就会非常高。而且官方提供的 DERP 服务器是万人骑,存在安全隐患
安装 Go 环境
根据官方安装手册,需要先安装 go
先更新软件包列表,然后升级已安装的软件包
apt update && apt upgrade
等了大半年终于安完了,然后安装所需的软件,包括 wget、 git、 openssl、 curl
apt install -y wget git openssl curl
然后安装 go
语言(这里有一个坑,我没有安装最新版本的 go
, 导致安装 Derp
的时候报错了,解决的办法就是 安装最新的 go
,没关系可以继续往下看我是怎么处理的,你也可以在这里安装最新版的 go
)
wget https://go.dev/dl/go1.20.5.linux-amd64.tar.gz
我这里的云服务器 linux
连不上这个网,所以在本地直接下载了,然后传到服务器上面
然后参考 go 官方的安装手册
运行这行代码
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.20.5.linux-amd64.tar.gz
这里的 go1.20.5.linux-amd64.tar.gz
需要写成你下载的 go
版本
然后临时添加到环境变量
export PATH=$PATH:/usr/local/go/bin
之后验证一下是否安装成功
go version
如果想要永久添加到环境变量中,可以这样做
echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile
source /etc/profile
解释一下上面的操作:
- 虽然 export 命令和 source 命令都涉及修改 PATH,但它们的作用范围和持久性不同。
- export 只对当前 shell 会话有效。
- echo 命令将 export 命令写入配置文件,使其永久生效。
- source 命令则使配置文件中的更改立即生效。
通过 Go 安装 Derp
安装 Derp
的时候报错了
可以看到报错信息,让你匹配 go 1.23
,我刚才安装的是1.20.5
,没关系,在安装 go
的最新版本,去官网重新下载一个最新版(我当前的是 2024-11-19
号,最新版为 1.23.3
)
然后安装,注意版本号,要是你当前最新的
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.23.3.linux-amd64.tar.gz
然后 go version
看一下版本,可以看到安装完之后是直接生效的,不用添加什么环境变量了,因为之前已经永久加过了
之后接着用 go
运行下载 Derp
的命令
go install tailscale.com/cmd/derper@latest
处理证书文件
安装好之后,我们要解决一下域名的校验问题
看一下这个路径下的证书文件
把框框中的三行代码注释掉
可以简单看一下,这是验证域名的用途,因为我们是没有域名,纯ip,所以这个地方注释掉,不要去校验
然后重新用 go
编译一下,并输出到指定目录
自签一个域名给 Derp
接着我们用命令自签一个 Https
的域名 derp.myself.com
cat > /etc/systemd/system/derp.service <<EOF
[Unit]
Description=TS Derp
After=network.target
Wants=network.target
[Service]
User=root
Restart=always
ExecStart=/etc/derp/Derp -hostname derp.myself.com -a :33445 -http-port 33446 -certmode manual -certdir /etc/derp
RestartPreventExitStatus=1
[Install]
WantedBy=multi-user.target
EOF
把云服务的 tcp
33445
(HTTPS 需要)和udp
的3478
(STUN需要)的端口打开
然后输入如下命令,打开自启,以及立即启动 Derp
服务
systemctl enable derp
:启用 derp 服务,使其在系统启动时自动启动。
systemctl start derp
:立即启动 derp 服务
如果你是用 宝塔的话,不仅是云服务器那边需要开启相对应的端口,宝塔的安全也要开启相应端口!
验证 Derp 是否启动
在浏览器中输入https://your ip:33445/
即可
云服务器安装并登录 Tailscale
在服务器安装 Tailscale
sudo apt install tailscale
如果下载太慢,参考这个解决apt install 下载速度太慢,配置一个国内的源
检查网络
tailscale netcheck
可以看到我们用的
Derp
列表都是国外的,延迟比较高,下文会逐步讲解到添加自建的Derp
然后可以用 tailscale status
查看状态,这里我的 linux
还没有登录 Tailscale
这里有两种组合
- 一个是
官方账号
+ 自己的Derp
:简单,但是不够自由,比方说我要让别人添加到我的局域网中,我就没研究明白这个… - 另一个是
自己建的 Headscale
+自己的 Derp
:复杂一些,但是可控性更高,可以让其他人加入到我的局域网
第一种组合: 官方 Tailscale 账号
+ 自己的 Derp
中转
登录官网 tailscale
,并用你的账号登录,之后在你组的网络中,添加一个 linux
设备
生成 install 的 script
然后返回 linux
中运行
然后再 Access controls
中指定你的 Derp
,把其他的节点都屏蔽掉
这样就可以了
第二种组合:自建 Headscale + 自建 Derp (无域名版本)
自建 Headscale 教程我在另一篇文章有讲过,具体可以在这里查看 ,我这里接着讲
如果是自己没有域名,那么可以用自签的 IP
,这种情况下,配置 Headscale
的 config.yaml
注意:
- 只能用
json
,只能用json
,只能用json
!!! - 只能用
json
,只能用json
,只能用json
!!! - 只能用
json
,只能用json
,只能用json
!!!
配置 path
指定为 derp.yaml
是不好使的!!!
TM的 试了好久的
yaml
,都他妈不好使
应该是个bug
吧?大概
无论是那种办法,我们的目的是:让 headscale
拿到我自建的 Derp
服务器的信息
那么,我的思路就是:用 Nginx
建立一个反向代理,然后指定到 derp.json
,用 Nginx
代理一下
这里是 derp.json
的内容
其他的一些配置
自建 Derp 提供 IPv6 的支持(隧道版本,不推荐,延迟高)
这个是效果,虽然能够使用 IPv6
,但是是通过隧道的模式,选择香港的节点,还是延迟很高,所以我放弃了,这里简单的说明一下
如果你的服务器自带 IPv6
,就直接配置你的地址即可
代码如下
network:version: 2tunnels:he-ipv6:mode: sitremote: 216.218.221.6local: 内网ipaddresses:- "2001:470:18:e6d::2/64"routes:- to: defaultvia: "2001:470:18:e6d::1"
可以看到已经可以直联了
还是根据视频的步骤来,但是我这里选择的 linux
然后大概长成这个样子:
然后保存, reboot
一下服务器
防止 Derp 被白嫖(添加客户端验证)
具体的原理参考一下这个大佬的博客
进入服务器 /etc/systemd/system
路径下的
–verify-clients: 这个选项要求客户端进行验证,但具体的验证机制没有详细说明。如果只是简单的验证,可能不足以防止未授权访问
保存文件之后,重启一下 Derp
参考
- 官方自建 Derp
- 解决apt install 下载速度太慢
- Tailscale玩法之内网穿透、异地组网、全隧道模式、纯IP的双栈DERP搭建、Headscale协调服务器搭建,用一期搞定,看一看不亏吧?
- 纯 IP 配置 Derp 提供帮助的帖子:headscale组网自建derp中继节点,国内也可以
- Tailscale 基础教程:部署私有 DERP 中继服务器
以上的操作命令合集
————局域网1设置部分tailscale up --netfilter-mode=off --advertise-routes=局域网网段 --accept-routes————群晖设置部分sudo -iecho -e '#!/bin/sh -e \ninsmod /lib/modules/tun.ko' > /usr/local/etc/rc.d/tun.sh
chmod a+x /usr/local/etc/rc.d/tun.sh
/usr/local/etc/rc.d/tun.sh
ls /dev/net/tun参考ZeroTier群晖的安装
资料:https://docs.zerotier.com/devices/synologydocker run -d \--name=ts \--restart=always \-v /var/lib:/var/lib \-v /dev/net/tun:/dev/net/tun \--network=host \--cap-add=NET_ADMIN \--cap-add=NET_RAW \--env TS_STATE_DIR=/etc/ts \--env TS_SOCKET=/var/run/tailscale/tailscaled.sock \--env TS_USERSPACE=false \--env TS_ROUTES=局域网网段 \--env TS_EXTRA_ARGS="--accept-routes --advertise-exit-node --reset" \--env TS_AUTHKEY=API密钥 \
tailscale/tailscaleiptables -I FORWARD -i eth0 -j ACCEPT
iptables -I FORWARD -o eth0 -j ACCEPT
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
iptables -I FORWARD -i tailscale0 -j ACCEPT
iptables -I FORWARD -o tailscale0 -j ACCEPT
iptables -t nat -I POSTROUTING -o tailscale0 -j MASQUERADEsleep 1m————云服务器derp中转服务器搭建部分apt update && apt upgradeapt install -y wget git openssl curlwget https://go.dev/dl/go1.20.5.linux-amd64.tar.gzrm -rf /usr/local/go && tar -C /usr/local -xzf go1.20.5.linux-amd64.tar.gzexport PATH=$PATH:/usr/local/go/bin
go versionecho "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile
source /etc/profilego env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,directgo install tailscale.com/cmd/Derp@maingo build -o /etc/derp/Derpls /etc/derpopenssl 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"cat > /etc/systemd/system/derp.service <<EOF
[Unit]
Description=TS Derp
After=network.target
Wants=network.target
[Service]
User=root
Restart=always
ExecStart=/etc/derp/Derp -hostname derp.myself.com -a :33445 -http-port 33446 -certmode manual -certdir /etc/derp
RestartPreventExitStatus=1
[Install]
WantedBy=multi-user.target
EOFsystemctl enable derp
systemctl start derp"derpMap": {"OmitDefaultRegions": true,"Regions": {"901": {"RegionID": 901,"RegionCode": "Myself","RegionName": "Myself Derp","Nodes": [{"Name": "901a","RegionID": 901,"DERPPort": 33445,"IPv4": "服务器IP","InsecureForTests": true,},],},},},"1": null,"2": null,"3": null,"4": null,"5": null,"6": null,"7": null,"8": null,"9": null,"10": null,"11": null,"12": null,"13": null,"14": null,"15": null,"16": null,"17": null,"18": null,"19": null,"20": null,"21": null,"22": null,"23": null,"24": null, "25": null,tailscale netchecktailscale statustailscale ping ping6 240C::6666tailscale down tailscale upcurl -fsSL https://tailscale.com/install.sh | shnano /etc/systemd/system/derp.service--verify-clientssystemctl daemon-reloadsystemctl restart derp————headscale搭建部分wget --output-document=headscale.deb \https://github.com/juanfont/headscale/releases/download/v0.22.3/headscale_0.22.3_linux_amd64.debsudo dpkg --install headscale.debsudo systemctl enable headscalenano /etc/headscale/config.yamlapt install -y nginxmap $http_upgrade $connection_upgrade {default keep-alive;'websocket' upgrade;'' close;
}
server {listen 3355;listen [::]:3355;server_name 云服务器IP;location / {proxy_pass http://127.0.0.1:8080;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;proxy_set_header Host $server_name;proxy_buffering off;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;}location /web {index index.html;alias /var/www/web;}
}wget https://github.com/gurucomputing/headscale-ui/releases/download/2023.01.30-beta-1/headscale-ui.zipunzip -d /var/www headscale-ui.zipsystemctl start headscalesystemctl restart nginxheadscale apikeys create --expiration 9999dtailscale logout
tailscale up --login-server=http://云服务器IP:3355touch /var/www/derp.json{"Regions": {"901": {"RegionID": 901,"RegionCode": "Myself","RegionName": "Myself Derp","Nodes": [{"Name": "901a","RegionID": 901,"DERPPort": 33445,"IPv4": "IP地址","IPv6": "IP地址","InsecureForTests": true}]}}
}server {listen 80;listen [::]:80;server_name 127.0.0.1;root /var/www;index index.html index.htm index.nginx-debian.html;location /d {alias /var/www;autoindex on;}location / {try_files $uri $uri/ =404;}
}- http://127.0.0.1/d/derp.jsonsystemctl restart nginx
systemctl restart headscaletailscale logout
tailscale up --login-server=http://你的云服务器ip:端口————改善github下载速度慢的解决方案下面代码可以放到/etc/hosts文件的末尾,然后重启云服务器就可以20.205.243.166 github.com
159.24.3.173 gist.github.com
185.199.110.153 assets-cdn.github.com
185.199.110.153 raw.githubusercontent.com
185.199.110.153 gist.githubusercontent.com
185.199.110.153 cloud.githubusercontent.com
185.199.110.153 camo.githubusercontent.com
185.199.110.153 avatars0.githubusercontent.com
185.199.110.153 avatars1.githubusercontent.com
185.199.110.153 avatars2.githubusercontent.com
185.199.110.153 avatars3.githubusercontent.com
185.199.110.153 avatars4.githubusercontent.com
185.199.110.153 avatars5.githubusercontent.com
185.199.110.153 avatars6.githubusercontent.com
185.199.110.153 avatars7.githubusercontent.com
185.199.110.153 avatars8.githubusercontent.com不过需要注意,ip可能之后需要更新,可以去站长工具,ping后面的域名来获取。