如今异地组网工具百花齐放,像 ZeroTier、NetBird、Tailscale、WireGuard 等都是很出色的组网工具,用户随便选择上面的任意一款都能够简单的实现自己的组网需求。从有了组网的需求后,几款主流的软件也曾一一试过,最终选择 Tailscale 的原因只是稳定、简单、够用。
安装
在 Linux 平台只需要一条命令就能安装,像 Mac、Window、移动端也都有各自的安装包。
curl -fsSL https://tailscale.com/install.sh | sh
启动 tailscale 也仅需一条命令
tailscale up
点击弹出的授权链接,在授权成功后我们的设备就会显示为 connected
。(控制台)
至此,所有的客户端都会获得一个由 tailscale 分配的 IP,通过此地址实现异地机器的互通。
root@k7x4d8:~# tailscale ip -4
100.101.204.77
实现 HTTPS 访问
实现异地组网的基础功能后,我们还可能想要通过域名(HTTPS)而非 IP 来访问我们暴露的服务。虽然我们可以认为内网中暴露的服务是可信任的,但是浏览器端却无法感知这一点,由此可能会出现浏览器的不安全警告,甚至拒绝提供服务。为此,tailscale 提供了 acme 功能,可以自动申请 Let’s Encrypt 证书。
控制台启用 HTTPS 和 MagicDNS
MagicDNS——相对于 tailscale 分配的 ip 地址,tailscale 提供了一个 magicdns 的功能,我们可以直接用 tailscale 分发的域名解析到该 IP。
我们可以从控制台直接看到分发的域名,通过访问下面的域名即可访问到对应的设备。
k7x4d8.mau-wahxx.ts.net
如 ssh [email protected]
等同于 ssh [email protected]
k7x4d8
一般是自动生成的,一般是设备的主机名(可自定义)。
mau-wahoo
是 tailscale 分配给用户的二级域名,可以通过摇号的方式再次刷新获取。
ts.net
是该 FQDN 的一级域名,为 Tailscale 所有。
为域名申请证书
root@k7x4d8:~# tailscale cert --cert-file=/etc/nginx/cert/cert.pem --key-file=/etc/nginx/cert/key.pem k7x4d8.mau-wahxx.ts.net
Wrote public cert to /etc/nginx/cert/cert.pem
Wrote private key to /etc/nginx/cert/key.pem
实现反向代理
我的方案是所有的服务通过容器部署,然后 nginx 进行反向代理。因此证书配置在 nginx 的 cert 目录。
server {
listen 80;
server_name k7x4d8.mau-wahxx.ts.net;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name k7x4d8.mau-wahxx.ts.net;
# SSL
ssl_certificate /etc/nginx/cert/cert.pem;
ssl_certificate_key /etc/nginx/cert/key.pem;
# logging
access_log /var/log/nginx/access.log combined buffer=512k flush=1m;
error_log /var/log/nginx/error.log warn;
location / {
proxy_pass http://127.0.0.1:5006;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
在实际操作过程中,发现无法访问部署的服务,经过排查发现是开了梯子的原因。解决方案是:
- 将梯子关了
- 梯子增加规则,让自己的域名直连。