背景#

我的不同设备通过tailscale组网,可以方便地访问彼此。但是默认情况下,tailscale只能访问tailscale网络内的ip地址。

某些场景下我们需要能访问内网ip。比如,在我的laptop上使用terraform来管理proxmox创建虚拟机的时候,需要访问虚拟机的宿主机的内网ip地址。

graph TD
    subgraph Remote Laptop [远程笔记本电脑]
        User[你]
        User -->|远程访问| Tailscale_Remote[Tailscale 客户端<br/>e.g., 100.x.x.x]
    end

    subgraph Your Laptop [你的笔记本电脑物理环境]
        subgraph Proxmox Host [Proxmox VE 主机]
            subgraph VM Guest [虚拟机 Guest]
                VM[VM<br/>10.10.10.100]
            end

            NIC_WLAN["无线网卡 (WLAN)<br/>ensXX / wlpXsY<br/>IP: 192.168.50.3"]
            BRIDGE["Linux Bridge (vmbr0)<br/>IP: 10.10.10.1"]
            TAILSCALE["Tailscale 虚拟接口<br/>tailscale0<br/>IP: 100.x.x.x"]
            
            VM -->|连接到| BRIDGE;
            TAILSCALE -.->|Overlay Network| NIC_WLAN;
        end

        BRIDGE -.->|NAT / 路由 / IP 伪装| NIC_WLAN;
    end

    NIC_WLAN -->|无线连接| HomeRouter["家庭路由器 / 网关<br/>192.168.50.1"];
    HomeRouter --> Internet[互联网 Internet];
    
    Tailscale_Remote -->|加密的 WireGuard 隧道| Internet -->|加密的 WireGuard 隧道| TAILSCALE;
    
    Tailscale_Remote -.->|通过 Tailscale 网络访问| VM;
    TAILSCALE -.->|路由到| BRIDGE;

配置步骤#

在内网的tailscale客户端上启用路由功能,允许访问特定的内网ip地址。

tailscale up --advertise-routes=192.168.50.0/24

需要linux服务器上启用IP转发:

echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf

然后,在tailscale管理控制台上,approve这个路由设置。

tailscale-approve-route tailscale-approve-route

这样,远程的tailscale客户端就可以访问内网的ip地址了。

result

总结#

虽然延迟看过去有点高,但是我只是需要远程执行script,并不会有太大影响。

可以通过增加route设置来访问内网ip地址,那虚拟机的另外的网段的ip地址呢?通过合适的配置,应该也可以在本地使用ssh访问虚拟机的ip地址,从而执行ansible等自动化脚本了吧。后续可以继续尝试。

注意#

如果需要访问多个内网网段,可以在tailscale up命令中添加多个--advertise-routes参数,或者使用逗号分隔的方式指定多个网段。例如:

tailscale up --advertise-routes=192.168.50.0/24,10.10.10.0/24

如果仅仅是添加单个路由,那么会覆盖之前的路由设置。

比如,之前添加了--advertise-routes=192.168.50.0/24,如果这次只添加--advertise-routes=10.10.10.0/24,那么之前的192.168.50.0/24路由就会被覆盖。