如何在Linux系统中通过tailscale子网路由组网,实现异地访问

Linux

Download | Tailscale 下载

使用 Tailscale 官方提供的通用一键脚本。这个脚本会自动检测 Ubuntu 版本并自动完成所有步骤。

在 Ubuntu Server 虚拟机的命令行里,按顺序执行以下步骤:

Linux系统安装

运行一键安装脚本

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

启动 Tailscale 并连接

运行此命令,它会生成一个登录链接。

sudo tailscale up

在“电脑”上进行身份验证

执行上一步后,你的服务器终端会显示如下内容:

pixel@ubuntu-docker:~$ sudo tailscale up

To authenticate, visit:

        https://login.tailscale.com/a/xxx8
  1. 自己的笔记本电脑(或手机)上,打开浏览器

  2. 复制并粘贴上面那个 https://login.tailscale.com/... 的网址。

  3. 使用你的 Google、Microsoft 或 GitHub 帐户登录 Tailscale。

  4. 登录后,你会在网页上看到“Approve machine (批准机器)”的求。点击“Approve”。

  5. 一旦你在网页上批准,你的 PVE 服务器终端会立刻显示“Success.”。
    image
    到了这一步, 已经可以远程访问该虚拟机, 但是还不能对局域网设备进行远程访问.

设置子网路由(可选)

设置子网路由

若希望访问所有的 PVE 服务。应该在这台 Ubuntu VM 上启用“子网路由”,让它成为整个局域网的入口。

假设你的家庭局域网是 192.168.6.0/24

sudo tailscale up --advertise-routes=192.168.6.0/24

注意: 运行此命令后,还需要去 Tailscale 的网页管理后台,找到这台机器,批准 192.168.6.0/24 这条路由。)

修复子网路由

运行上面命令后,你会得到警告:


pixel@ubuntu-docker:~$ sudo tailscale up --advertise-routes=192.168.6.0/24
Warning: IPv6 forwarding is disabled.
Subnet routes and exit nodes may not work correctly.
See https://tailscale.com/s/ip-forwarding
Warning: UDP GRO forwarding is suboptimally configured on ens18, UDP forwarding throughput capability will increase with a configuration change.
See https://tailscale.com/s/ethtool-config-udp-gro
pixel@ubuntu-docker:~$

# - **Warning 1 (IPv6 forwarding):** **必须修复。** 这是告诉你,你的 VM 内核“禁止”转发网络包,这让它无法成为路由器。
 
# - **Warning 2 (UDP GRO):** **强烈建议修复。** 这是一个性能问题,不修复会导致你的网络连接在高负载下变慢或卡顿。

在你的 pixel@ubuntu-docker 虚拟机中,依次执行以下命令来修复这两个问题:

修复“IPv6/IPv4 转发被禁用” (必须)

需要告诉 Ubuntu 的内核:“我允许你充当一台路由器。”

  1. 创建一个新的配置文件来永久启用转发:

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

结果:

pixel@ubuntu-docker:~$ echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-tailscale.conf
net.ipv4.ip_forward = 1
pixel@ubuntu-docker:~$  echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
net.ipv6.conf.all.forwarding = 1
pixel@ubuntu-docker:~$

  1. 让配置立即生效

    sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
    

修复“UDP GRO 性能问题”

需要关闭网卡 ens18 上的 GRO (Generic Receive Offload) 功能,因为它对“转发”(路由)有害。

  1. 临时关闭(立即生效,但重启后失效):

    sudo ethtool -K ens18 gro off
    
  2. 永久关闭(设置为开机自动执行,否则你每次重启VM都要手动敲一遍): 将创建一个简单的 systemd 服务来在开机时自动运行这个命令。(推荐)

    a. 创建服务文件

    sudo vim /etc/systemd/system/disable-gro.service
    

    b. 复制粘贴以下所有内容到 vim 编辑器中:

    注意!! 要先ifconfig查看现在的网卡是什么, 例如在该虚拟机中我的网卡是ens18

    [Unit]
    Description=Disable GRO on ens18
    After=network.target
    
    [Service]
    Type=oneshot
    ExecStart=/usr/sbin/ethtool -K ens18 gro off
    RemainAfterExit=yes
    
    [Install]
    WantedBy=multi-user.target
    

    c. 保存并退出

    d. 启用这个新服务:

    sudo systemctl daemon-reload
    sudo systemctl enable --now disable-gro.service
    
    sudo tailscale up --advertise-routes=192.168.6.0/24
    

    如果仍然有警告,

    Warning: UDP GRO forwarding is suboptimally configured on ens18, UDP forwarding throughput capability will increase with a configuration change.
    See https://tailscale.com/s/xxx
    pixel@ubuntu-docker:~$ sudo ethtool -k ens18 | grep generic-receive-offload #查看真实状态
    generic-receive-offload: off #若结果为off则代表已经完成,不过缓存还在, 导致误报可以忽略.
    
    

网页管理后台 授权

现在你的系统已经配置完毕。你现在需要去 Tailscale 的网页管理后台 (https://admin.tailscale.com/),在“Machines”列表里找到 ubuntu-docker 这台机器,批准它声明的 192.168.6.0/24 这条新路由。

批准子网路由

完成这些后,你在任何地方(例如你的手机)登录 Tailscale,都应该能直接访问你家里的 192.168.6.x IP 地址了。
image

image

为服务器禁用“密钥过期”

Tailscale 默认会“过期”密钥,要求你每隔几个月重新登录一次。但对于 7x24 的服务器,这会导致服务中断。你必须禁用它:

  1. 打开你的电脑浏览器,访问 https://admin.tailscale.com/(管理后台)。

  2. 在“Machines (机器)”列表中,找到你刚刚添加的这台 Ubuntu VM。

  3. 点击它右侧的三个点 (⋮) 菜单。

  4. 选择 Disable key expiry... (禁用密钥过期...)

至此,你的 PVE Ubuntu 虚拟机已永久、安全地连接到你的 Tailscale 网络。

检查你的 Tailscale IP

运行此命令查看你的新“虚拟局域网”IP。

tailscale ip -4

它会显示一个 100.x.x.x 格式的 IP 地址。

如何使用?

到这一步, “子网路由”已经正式生效了。

100.x.x.xubuntu-docker 这台虚拟机自己的 Tailscale IP 地址。

你不需要再在服务器上做任何事了。你只需要在你“外面”的设备上(例如你的手机、你的笔记本电脑)安装 Tailscale 客户端。


在你的“外部设备”上安装 Tailscale

  1. 打开 Tailscale 官网 (tailscale.com)。
  2. 为你的手机(iOS 或 Android)或笔记本电脑(Windows 或 macOS)下载并安装 Tailscale 客户端

登录同一个 Tailscale 帐户

打开你刚安装的客户端,登录你刚才在服务器上使用的那个 Tailscale 帐户(例如,同一个 Google / Microsoft 帐户)。


如何访问你的服务

一旦你在“外部设备”(例如你的手机)上登录了 Tailscale... 你不需要做任何其他配置了。

你的 ubuntu-docker 虚拟机现在就像一个“网关”,它已经告诉了你的手机:“嘿,任何 192.168.6.x 的地址,都来找我!”

如何访问局域网别的设备?

在你安装并登录了 Tailscale 的手机上,打开浏览器,直接输入:

http://192.168.6.1

它就会像你在家一样,直接打开 OpenWRT 的登录页面。

如何访问自己呢? (192.168.6.152:9000 是自己的服务A)

有两种方法,两种都可行:

方法一 (推荐,使用局域网 IP):

就像访问 OpenWRT 一样,直接输入:

http://192.168.6.152:9000

方法二 (使用 Tailscale IP):

你也可以使用它自己的 Tailscale IP 地址:

http://100.x.x.x:9000

其它

Tailscale客户端无需关闭, 回到局域网后会自动走局域网路由器(最快、最直接的路径)

为什么它会“自动”走最快路径?

(人在局域网内,访问局域网的地址)是 Tailscale 必须解决的核心问题。它的工作原理如下:

当你的笔记本电脑回到家里并连接到 192.168.6.0/24 这个局域网时,你的电脑操作系统(Windows 或 macOS)会变得非常“聪明”。

在这一刻,你的电脑有了两条可以到达 192.168.6.1 (OpenWRT 后台) 的路径:

  • 路径 A (本地局域网):

    • 通过你的物理网卡(Wi-Fi 或有线网口)。
    • 这是一个物理连接,操作系统会给它一个极高的优先级(在路由表里称为低 "Metric" 或低 "跃点数")。
  • 路径 B (Tailscale 子网路由):

    • 通过你的虚拟网卡(Tailscale)。
    • 把数据包加密,发送给你的 ubuntu-docker 虚拟机(100.x.x.x),再由它解包转发。
    • 这是一个虚拟连接,操作系统会给它一个较低的优先级

决策:

当你在浏览器里输入 192.168.6.1 时,你的操作系统会自动选择优先级最高、最直接的路径 A (本地局域网)。

数据包会直接从你的笔记本电脑发往路由器,完全不会经过 Tailscale 的加密或隧道。

tailscale工作原理

FRP 依赖一个“中间人”服务器来转发所有流量,而 Tailscale 则聪明得多, 是一个关于“控制平面”“数据平面”的经典分离设计。

1. 需要第三方公网服务器建立握手连接吗?

是的,必须需要。

  • 这就是 Tailscale 的“控制平面”(Control Plane)。

  • 当你在 ubuntu-docker 虚拟机和你的笔记本电脑上都登录 Tailscale 时,它们都在向 Tailscale 的“协调服务器”(login.tailscale.com 等)报到。

  • 协调服务器的作用:

    1. 身份验证: 确认“你”是你(通过 Google/Microsoft 帐户)。

    2. IP 分配: 分配 100.x.x.x 的IP地址。

    3. 密钥交换(最关键): 这是一个“安全电话本”。它告诉你的笔记本:“ubuntu-docker 的公网地址是 A.B.C.D,端口是 12345,这里是它的加密公钥”。反之亦然。

它就像一个“电话接线员”,负责帮两个“打电话”的人(你的设备)接通线路,但它不会去“偷听”电话内容。


2. 连接以后是P2P的打洞实现吗?

是的,这永远是它的第一目标。

  • 这就是 Tailscale 的“数据平面”(Data Plane)。

  • Tailscale 的核心是“NAT 穿透”(NAT Traversal),你说的“打洞”(Hole Punching)就是这个技术。

  • 工作原理(UDP打洞):

    1. 你的笔记本(在外面)和你的 ubuntu-docker(在家)都通过 NAT 路由器上网。

    2. 它们从“协调服务器”拿到了对方的“公网地址和端口”。

    3. 它们同时向对方的公网地址直接发送一个(加密的)UDP 包。

    4. 因为双方的路由器都看到了一个“向外”的包,所以它们会“天真地”认为对方“向内”的包是一个“回复”,并允许它通过。

    5. 砰! 一个P2P(点对点)的直接连接就建立了。


3. 连接后还需要走第三方服务器吗?稳定吗?

(稳定吗?)

极其稳定。 它底层的加密协议是 WireGuard,这是目前公认最快、最现代、最稳定的 VPN 协议之一。

(还走第三方服务器吗?)

95% 的情况下,不再需要!

  • 一旦P2P“打洞”成功,你的笔记本和 ubuntu-docker 之间的所有流量(例如你访问 192.168.6.152:9000)都是点对点直线传输的。

  • 流量不会经过 Tailscale 的服务器。这和 FRP 有着本质区别(FRP 的所有流量都必须经过“中间人”)。

那 5% 的“万一”情况呢?(如果P2P打洞失败)

  • 比如你在公司的防火墙,或某些极端的酒店 Wi-Fi 下,“打洞”失败了。

  • 此时,Tailscale 会自动无缝地降级到“中继”模式。

  • 它会使用 Tailscale 的DERP(中继服务器)来转发你的流量(例如 笔记本 -> 东京DERP服务器 -> 你的VM)。

  • 重点: 即使在“中继”模式下,流量也依然是端到端加密的。DERP 服务器无法解密你的流量,它只是一个“快递中转站”。


4. 我与虚拟机的流量受到什么限制呢?

限制 1:你的PVE主机(家)的“上行带宽”

  • 这是最大、最关键的限制因素。

  • 如果你的家庭宽带是“500M下载,50M上传”。

  • 那么你在“外面”访问 ubuntu-docker最大速率就是 50 Mbps。因为数据是从你家里“上传”给你的。

限制 2:你“外面”设备的“下行带宽”

  • 如果你在手机上用 5G 网络(下载 300M),而家里上传是 50M,那么你被卡在了 50M。

  • 如果你在酒店用 Wi-Fi(下载 20M),而家里上传是 50M,那么你被卡在了 20M。

简而言之:你的最终速率 = Min(你家里的上传, 你外面的下载)

限制 3:流量大小

  • 没有限制!

  • 因为 95% 的情况是 P2P,流量不经过 Tailscale 的服务器。你可以随意传输 TB 级别的数据,Tailscale 不按流量计费

posted @ 2025-11-15 09:26  舟清颺  阅读(296)  评论(0)    收藏  举报