蓝易云

Docker 搭建中继服务器 derp – 需要域名并配置 ssl

1.3K+次阅读
2条评论

共计 2846 个字符,预计需要花费 8 分钟才能阅读完成。

了解Derp

在搭建 derp 之前,前提是你应该了解并搭建了 headscale 服务端,否则请先看文章 Docker 搭建 headscale 异地组网完整教程

已经加入 headscale 的异地组网的客户端可以使用如下命令查看当前的 derp 服务器。

# docker 运行的客户端
docker exec -it tailscaled tailscale netcheck
# 非 docker 运行的客户端
tailscale netcheck

Docker 搭建中继服务器 derp - 需要域名并配置 ssl

可以看见当前离我最近的 derp 是 tokyo 即东京的节点,那新加入的节点为了保底能够进行网络连接,都会先使用 tokyo 的节点进行连接,如果能够直连再切换成直连。

使用 tailscale status 命令可以查看到当前网络的状态。

# docker 运行的客户端
docker exec -it tailscaled tailscale status
# 非 docker 运行的客户端
tailscale status

Docker 搭建中继服务器 derp - 需要域名并配置 ssl

从图中可以看见,我目前的客户端 mylinux 与其他有两个客户端能够直连,与一个客户端需要经过中继服务器,使用 ping 命令可以更清晰的看见。

Docker 搭建中继服务器 derp - 需要域名并配置 ssl

搭建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 页面。

Docker 搭建中继服务器 derp - 需要域名并配置 ssl

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 不能重复。
  • 每个 nodename 不能重复。
  • 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 节点,如果是使用国内的服务器搭建,那么一般这个服务器是最近的。

Docker 搭建中继服务器 derp - 需要域名并配置 ssl

一段时间后,中继服务器切换为最近的节点即刚刚搭建的节点。

Docker 搭建中继服务器 derp - 需要域名并配置 ssl

提醒:本文发布于531天前,文中所关联的信息可能已发生改变,请知悉!

AD:【腾讯云服务器大降价】2核4G 222元/3年 1核2G 38元/年
正文完
 0
阿蛮君
版权声明:本站原创文章,由 阿蛮君 于2023-06-30发表,共计2846字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(2条评论)
jolly 评论达人 LV.1
2024-09-11 16:52:32 回复

请教一下能否自定义使用哪个derp服务器中转呀,我用国外的机器带宽够,就是延迟高,但是胜在稳定,想试一试。方便的话联系邮箱指导一下

 Windows  Chrome  澳大利亚维多利亚墨尔本Optus
    阿蛮君 博主
    2024-09-12 09:21:32 回复

    @jolly 修改 config.yaml 里面的 paths 就可以了啊,记得注释掉 url 就行。

     Windows  Edge
Copyright © 2022-2024 阿蛮君博客 湘ICP备2023001393号
本网站由 亿信互联 提供云计算服务 | 蓝易云CDN 提供安全防护和加速服务
Powered by Wordpress  Theme by Puock