headscale服务自建derp服务器,加速双端连接效率

背景

自建tailscale服务接入headscale服务器实现异地组网中,我们搭建了自己的tailsacale服务器,接下来就是互联的问题,headscale默认使用了官方提供的derp服务器,各个地区都有,在两端无法nat打洞的情况下,会使用derp服务器作为中转,一端请求另一端时,会优先连接对端最近的derp服务器,所以derp服务器需要对两端的线路都要能连接上,因为国内对世界各地的互联网连接性并没有那么好,所有我们需要自己建立derp服务器,选择自己对国内与国外互联性较好的服务器作为中转derp服务器

环境准备

  • 一个备案过的域名(或者海外平台注册域名)
  • 一台国内服务器(如果使用海外平台注册域名则需要海外服务器)
  • ssh连接工具
  • 勤劳的小手

搭建步骤

准备证书
  1. 因为我是在腾讯云备案的,所以我演示腾讯云如何下载证书,如果是海外的朋友,可以借助acme等工具生成ssl证书,后面步骤是一样的,我也不再赘述,访问腾讯云ssl证书页面,,依次点击我的证书->申请免费证书,

    image-20231020091912468.png

  2. 提交证书申请,输入证书绑定域名,域名验证方式选择自动DNS验证,然后等待下发域名证书即可

    image-20231020092746336.png

  3. 在我的证书列表中点击在签发后的域名中点击下载,选择常用的nginx格式,点击下载解压,这样我们证书就准备好了

    image-20231020092650124.png

  4. 我们通过xshell工具将ssl证书上传到文件服务器
  5. 跳转到主目录
cd ~
mkdir certs && cd certs
  1. 将<derp_domain>_bundle.crt跟<derp_domain>.key文件拖拽到xshell中去
  2. 将crt的文件名格式与key文件保持一致
mv <derp_domain>_bundle.crt <derp_domain>.crt
使用docker启动derp服务器
  1. 使用命令启动derp服务器
docker run --restart always \
  --name derper -p 12345:12345 -p 3478:3478/udp \
  -v ~/certs/:/app/certs \
  -e DERP_CERT_MODE=manual \
  -e DERP_ADDR=:12345 \
  -e DERP_DOMAIN=<derp_domain> \
  -d fredliang/derper:latest
  1. 启动成功后如果没有报错,到浏览器输入https://<derp_domain>:12345,就会有一下页面提示,说明部署完成了

    image-20231020100521547.png

修改headscale配置文件使derp服务器绑定到headscale服务器
  1. 新建derp.yaml配置文件
    nano /etc/headscale/derp.yaml
    
  2. 将内容粘贴到配置文件中,填写完成后输入ctrl+x,提示是否保存再按y回车
    regions:
      900:
        regionid: 900
        regioncode: cn
        regionname: Tencent Guangzhou
        nodes:
          - name: 900a
            regionid: 900
            hostname: <derp_domain>
            stunport: 3478
            stunonly: false
            derpport: 12345
    
    • regions 是 YAML 中的对象,下面的每一个对象表示一个可用区,每个可用区里面可设置多个 DERP 节点,即 nodes
    • 每个可用区的 regionid 不能重复。
    • 每个 node 的 name 不能重复。
    • regionname 一般用来描述可用区,regioncode 一般设置成可用区的缩写。
    • stunonly: false 表示除了使用 STUN 服务,还可以使用 DERP 服务。
    • 将derp_domain替换为自己的derp域名
  3. 编辑headscale配置文件,再nano编辑器输入ctrl+w查找derp字段,按下回车
    nano /etc/headscale/config.yaml
    
  4. 将derp下的server跟url注释,paths打开,指定derp.yaml的位置,配置完成后保存
    derp:
      #server:
        # If enabled, runs the embedded DERP server and merges it into the rest of the DERP config
        # The Headscale server_url defined above MUST be using https, DERP requires TLS to be in place
       # enabled: false
    
        # Region ID to use for the embedded DERP server.
        # The local DERP prevails if the region ID collides with other region ID coming from
        # the regular DERP config.
        #region_id: 999
    
        # Region code and name are displayed in the Tailscale UI to identify a DERP region
        #region_code: "headscale"
        #region_name: "Headscale Embedded DERP"
    
        # Listens over UDP at the configured address for STUN connections - to help with NAT traversal.
        # When the embedded DERP server is enabled stun_listen_addr MUST be defined.
        #
        # For more details on how this works, check this great article: https://tailscale.com/blog/how-tailscale-works/
        #stun_listen_addr: "0.0.0.0:3478"
    
      # List of externally available DERP maps encoded in JSON
      #urls:
       # - https://controlplane.tailscale.com/derpmap/default
    
      # Locally available DERP map files encoded in YAML
      #
      # This option is mostly interesting for people hosting
      # their own DERP servers:
      # https://tailscale.com/kb/1118/custom-derp-servers/
      #
      paths:
        - /etc/headscale/derp.yaml
      #paths: []
    
  5. 重启headscale服务
    systemctl restart headscale
    
测试效果

打开连接到headscale的客户端,输入命令查看是否配置到了derp服务器,可以看到显示为自建的derp服务器

tailscale netcheck

Report:
        * UDP: true
        * IPv4: yes, ***.***.***.***:56324
        * IPv6: no, but OS has support
        * MappingVariesByDestIP: false
        * HairPinning: false
        * PortMapping:
        * Nearest DERP: Vps DE
        * DERP latency:
                -  de: 170ms   (Vps DE)

不通过derp服务器直连的的ping值为

ping box.wuan.me
正在 Ping box.wuan.me [172.234.25.151] 具有 32 字节的数据:
来自 172.234.25.151 的回复: 字节=32 时间=340ms TTL=47
来自 172.234.25.151 的回复: 字节=32 时间=333ms TTL=47
来自 172.234.25.151 的回复: 字节=32 时间=295ms TTL=47
来自 172.234.25.151 的回复: 字节=32 时间=320ms TTL=47

通过derp服务器连接的ping值为

tailscale ping 100.64.0.7
pong from ds918plus (100.64.0.7) via DERP(de) in 193ms
pong from ds918plus (100.64.0.7) via DERP(de) in 193ms
pong from ds918plus (100.64.0.7) via DERP(de) in 197ms
pong from ds918plus (100.64.0.7) via DERP(de) in 192ms
pong from ds918plus (100.64.0.7) via DERP(de) in 194ms
pong from ds918plus (100.64.0.7) via DERP(de) in 194ms
pong from ds918plus (100.64.0.7) via DERP(de) in 193ms
pong from ds918plus (100.64.0.7) via DERP(de) in 193ms
pong from ds918plus (100.64.0.7) via DERP(de) in 193ms
pong from ds918plus (100.64.0.7) via DERP(de) in 193ms

总结

在使用derp服务器后,如果两端nat打洞不通的情况下,使用derp中转服务器能大大提高两端的连接性,如果在海外的朋友可以使用官方定义的derp服务器,遍布各个地区,国内的朋友很建议自己搭建derp服务器,体验会好很多

点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注

×
订阅图标按钮