共计 2846 个字符,预计需要花费 8 分钟才能阅读完成。
了解Derp
在搭建 derp 之前,前提是你应该了解并搭建了 headscale 服务端,否则请先看文章 Docker 搭建 headscale 异地组网完整教程。
已经加入 headscale 的异地组网的客户端可以使用如下命令查看当前的 derp 服务器。
# docker 运行的客户端
docker exec -it tailscaled tailscale netcheck
# 非 docker 运行的客户端
tailscale netcheck
可以看见当前离我最近的 derp 是 tokyo 即东京的节点,那新加入的节点为了保底能够进行网络连接,都会先使用 tokyo 的节点进行连接,如果能够直连再切换成直连。
使用 tailscale status
命令可以查看到当前网络的状态。
# docker 运行的客户端
docker exec -it tailscaled tailscale status
# 非 docker 运行的客户端
tailscale status
从图中可以看见,我目前的客户端 mylinux 与其他有两个客户端能够直连,与一个客户端需要经过中继服务器,使用 ping
命令可以更清晰的看见。
搭建derp
1. 启动derp容器
其实 derp 搭建是有必要的,因为上面的 derp 都是官方的节点,如果遇到高峰期挤占带宽会变得很慢,体验非常差。即使自己搭建的 derp 节点,延迟可能比官方某些节点高,但带宽是自己独享的。
使用如下命令即可搭建 derp 服务器。
docker run -d \
--name derper \
-p 12345:12345 \
-p 3478:3478/udp \
-e DERP_ADDR=:12345 \
-e DERP_DOMAIN=derper.your-domain.com \
-e DERP_VERIFY_CLIENTS=false \
--restart always \
yangchuansheng/derper
derper.your-domain.com
修改为自己的域名。设置环境变量 DERP_VERIFY_CLIENTS
是为了验证域名,这里考虑到有些人不一定需要所以设置为 false,如果真正自己使用还是建议设置为 true。
2. 配置nginx
nginx 创建一个 derp.conf
配置文件,内容如下。
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name derper.your-domain.com;
ssl_certificate /etc/nginx/conf.d/cert/your-domain.com/your-domain.com.cer;
ssl_certificate_key /etc/nginx/conf.d/cert/your-domain.com/your-domain.com.key;
location / {
proxy_pass http://localhost:12345/;
proxy_redirect https:// https://;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header Content-Security-Policy upgrade-insecure-requests;
}
}
server {
listen 80;
server_name derper.your-domain.com;
rewrite ^(.*)$ https://$host:443$1 permanent;
}
这里阿蛮君设置了强制跳转 https,如果有需要可以不设置,如果没有域名请不需要配置。
配置修改后,记得重启下 nginx,这里需要使用域名或者 ip + 端口能够访问到 derp 页面。
3. 创建derp.yaml
需要告诉 headscale 服务器我们创建的 derp 节点的地址,否则客户端不知道地址将无法使用。
如果你是按照我之前的教程搭建的 headscale,那么运行如下命令,否则需要自己注意配置文件的位置。
cat << EOF > /home/docker/headscale/config/derp.yaml
regions:
900:
regionid: 900
regioncode: ts
regionname: Tencent Shanghai
nodes:
- name: 900a
regionid: 900
hostname: derper.your-domain.com
# ipv4: ip
stunport: 3478
stunonly: false
derpport: 443
EOF
这里的域名替换为自己的域名,如果没配置域名就使用 ip。另外需要注意的是,如果你使用域名配置了 https,那么这里的 derpport 一般填写 443,否则应该使用上面启动容器时指定的 12345 端口。
记得开放3478端口!!!
阿蛮君不保证使用 ip 的方式能够成功,因为这个能成是听群友说的。
regions
是 YAML 中的对象,下面的每一个对象表示一个可用区,每个可用区里面可设置多个 DERP 节点,即nodes
。- 每个可用区的
regionid
不能重复。 - 每个
node
的name
不能重复。 regionname
一般用来描述可用区,regioncode
一般设置成可用区的缩写。ipv4
字段不是必须的,如果你的域名可以通过公网解析到你的 DERP 服务器地址,这里可以不填。如果你使用了一个二级域名,而这个域名你并没有在公共 DNS server 中添加相关的解析记录,那么这里就需要指定 IP(前提是你的证书包含了这个二级域名,这个很好支持,搞个泛域名证书就行了)。stunonly: false
表示除了使用 STUN 服务,还可以使用 DERP 服务。
4. 修改headscale配置文件
修改 config.yaml 文件,paths 指定 derp.yaml 文件的位置,urls 下面的链接是官方提供的中继服务器,根据自己判断是否需要注释。
# /etc/headscale/config.yaml
derp:
# xxxx
urls:
# - https://controlplane.tailscale.com/derpmap/default
paths:
- /etc/headscale/derp.yaml
# xxxx
auto_update_enabled: true
# xxxx
update_frequency: 24h
修改文件后记得重启 headscale。
docker restart headscale
验证
再次执行 netcheck
命令,可以看见自己搭建的 derp 节点,如果是使用国内的服务器搭建,那么一般这个服务器是最近的。
一段时间后,中继服务器切换为最近的节点即刚刚搭建的节点。
提醒:本文发布于511天前,文中所关联的信息可能已发生改变,请知悉!