Docker 搭建中继服务器 derp – 纯 IP 实现

1. 纯 IP 搭建关键

接之前 Docker 搭建中继服务器 derp,上次的文章需要有域名,并且申请好 ssl 证书。

原因在于 derp 服务器,在 tailscale/cmd/derper/cert.go 文件中需要验证域名,如果将验证的代码去掉,那么 derp 将不会出现证书不匹配的错误,也就是说此时可以使用 IP 或者域名都不会报错。

func (m *manualCertManager) getCertificate(hi *tls.ClientHelloInfo) (*tls.Certificate, error) {
        // 需要将下面的判断注释
        //if hi.ServerName != m.hostname {//      return nil, fmt.Errorf("cert mismatch with hostname: %q", hi.ServerName)
        //}

        // Return a shallow copy of the cert so the caller can append to its
        // Certificate field.
        certCopy := new(tls.Certificate)
        *certCopy = *m.cert
        certCopy.Certificate = certCopy.Certificate[:len(certCopy.Certificate):len(certCopy.Certificate)]
        return certCopy, nil
}

另外需要注意的是,tailscale 客户端也会进行证书验证,由于 derp 服务器生成的自签名证书肯定不可能与我们所使用的 IP 或者域名匹配,所以客户端直接连接 derp 肯定也会报错,所以需要客户端跳过域名验证。

总结来说,需要满足以下两点:

  • derp 服务器不验证域名
  • tailscale 不验证域名

2. derp 搭建

使用如下命令即可搭建一个不验证域名的 derp 服务器。

docker run -d \
--name derper \
--restart always  \
-p 12345:443 \
-p 3478:3478/udp  \
-d hausen1012/ip_derper

此时浏览器访问 https://IP:12345/ 将提示不安全的链接,因为域名不匹配。

64a0de00a8961-1

正因为如此,才需要配置 tailscale 跳过域名验证,否则还是不能用 derp。

3. 配置 headscale

除了 derper 之外,Tailscale 客户端还需要跳过域名验证,这个需要在 Headscale 中配置。

而 Headscale 的本地 YAML 文件即 derp.yaml 目前还不支持这个配置项,所以只能使用在线 URL 了,就和官方提供的 derp 服务器一样,也是给了一个 url 地址。

新建 derp.json

{
  "Regions": {
    "901": {
      "RegionID": 901,
      "RegionCode": "hh",
      "RegionName": "Hotiis Hongkong",
      "Nodes": [
        {
          "Name": "901",
          "RegionID": 901,
          "DERPPort": 12345,
          "HostName": "xx",
          "InsecureForTests": true
        }
      ]
    }
  }
}

HostName 填写 IP 或域名,最主要的就是配置 InsecureForTests 选项,目前 derp.yaml 中不支持,需要使用在线文件,所以需要将这个文件放在 nginx 或者其他 web 服务器下。

接下来修改 headscale 的配置文件:

# /etc/headscale/config.yaml
derp:
  # xxxx
  urls:
  #  - https://controlplane.tailscale.com/derpmap/default
    - http://xxx/derp.json
  paths:
  #  - /etc/headscale/derp.yaml
  # xxxx
  auto_update_enabled: true
  # xxxx
  update_frequency: 24h

http://xxx/derp.json 修改为可访问的在线链接,不能仅局域网可访问。

接下来重启 headscale 即可。

docker restart headscale

4. 验证

使用 netcheck 命令仅仅只是验证 3478 端口能通。

64a0fdffb88bc-1

当使用 web 页面访问 derp 时,会有 http: TLS handshake error 相关的错误,这个不影响使用。

如果看见 client [xxx]: readFrameHeader 相关的信息时,说明客户端可以连接上 derp 服务器了。

64a0ff6d644bf-1

通过 status 命令可以查看使用的中转服务器,使用 tailscale ping 命令也可以查看使用哪个中转服务进行转发。

64a12f579ae8c-1

阅读剩余
THE END