Skip to main content
Nordlys logo, a drawing of two gray mountains with green northern lights in the background 陈迪の自留地

Back to all posts

简单稳定的组网方案

Published on by Chen Di · 4 min read

如今异地组网工具百花齐放,像 ZeroTier、NetBird、Tailscale、WireGuard 等都是很出色的组网工具,用户随便选择上面的任意一款都能够简单的实现自己的组网需求。从有了组网的需求后,几款主流的软件也曾一一试过,最终选择 Tailscale 的原因只是稳定、简单、够用。

安装

在 Linux 平台只需要一条命令就能安装,像 Mac、Window、移动端也都有各自的安装包。

curl -fsSL https://tailscale.com/install.sh | sh

启动 tailscale 也仅需一条命令

tailscale up

点击弹出的授权链接,在授权成功后我们的设备就会显示为 connected。(控制台

1729846093585.png

至此,所有的客户端都会获得一个由 tailscale 分配的 IP,通过此地址实现异地机器的互通。

root@k7x4d8:~# tailscale ip -4
100.101.204.77

实现 HTTPS 访问

实现异地组网的基础功能后,我们还可能想要通过域名(HTTPS)而非 IP 来访问我们暴露的服务。虽然我们可以认为内网中暴露的服务是可信任的,但是浏览器端却无法感知这一点,由此可能会出现浏览器的不安全警告,甚至拒绝提供服务。为此,tailscale 提供了 acme 功能,可以自动申请 Let’s Encrypt 证书。

控制台启用 HTTPS 和 MagicDNS

1729848155835.png

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;
    }
}

在实际操作过程中,发现无法访问部署的服务,经过排查发现是开了梯子的原因。解决方案是:

  • 将梯子关了
  • 梯子增加规则,让自己的域名直连。