共计 1908 个字符,预计需要花费 5 分钟才能阅读完成。
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/
将提示不安全的链接,因为域名不匹配。
正因为如此,才需要配置 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,
"StunPort": 3478,
"StunOnly": false,
"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 端口能通。
当使用 web 页面访问 derp 时,会有 http: TLS handshake error
相关的错误,这个不影响使用。
如果看见 client [xxx]: readFrameHeader
相关的信息时,说明客户端可以连接上 derp 服务器了。
通过 status
命令可以查看使用的中转服务器,使用 tailscale ping
命令也可以查看使用哪个中转服务进行转发。
提醒:本文发布于433天前,文中所关联的信息可能已发生改变,请知悉!