Headscale + Tailscale 实现两地内网互通实战记录

Headscale + Tailscale 实现两地内网互通实战记录

项目背景

近期需要将两个异地办公网络进行内网互联,实现局域网之间的双向访问。由于两地均处于 NAT 网络环境,无固定公网 IP,因此决定采用 Headscale + Tailscale 的方案实现组网。

本次部署环境如下:

  • 主路由:爱快(iKuai)
  • 虚拟化平台:爱快内置虚拟机
  • 系统:CentOS 7
  • 组网方式:Headscale + Tailscale Subnet Router
  • 两台 CentOS 均为内网设备

最终实现效果:

A 地内网 ↔ B 地内网双向互通

无需公网 IP、无需端口映射、无需传统 VPN。


网络架构

A 站点

主路由:爱快
LAN IP:192.168.3.1

CentOS7:
192.168.3.8
Tailscale 节点

B 站点

主路由:爱快
LAN IP:192.168.2.254

CentOS7:
192.168.2.8
Tailscale 节点

网络拓扑

A内网
192.168.3.x
     │
  爱快路由
     │
192.168.3.8
 CentOS7
(Tailscale)

====================
   Headscale
====================

(Tailscale)
 CentOS7
192.168.2.8
     │
  爱快路由
     │
B内网
192.168.2.x

安装 Tailscale

两台 CentOS 执行:


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

查看状态:


systemctl status tailscaled

配置 Tailscale

A 站点配置


tailscale up 
--advertise-routes=192.168.3.0/24 
--accept-routes 
--login-server=https://hs.bj.markxu.vip

B 站点配置


tailscale up 
--advertise-routes=192.168.2.0/24 
--accept-routes 
--login-server=https://hs.bj.markxu.vip

查看状态:


tailscale status

查看配置:


tailscale debug prefs

开启 IP 转发

两台服务器均执行:


vi /etc/sysctl.conf

增加:


net.ipv4.ip_forward = 1

生效:


sysctl -p

检查:


cat /proc/sys/net/ipv4/ip_forward

返回:


1

表示开启成功。


爱快静态路由配置

A站点

目标网络:192.168.2.0
子网掩码:255.255.255.0
下一跳:192.168.3.8

含义:

访问 B 站点网段时,流量交给 A 站点 CentOS 处理。

B站点

目标网络:192.168.3.0
子网掩码:255.255.255.0
下一跳:192.168.2.8

含义:

访问 A 站点网段时,流量交给 B 站点 CentOS 处理。


遇到的问题

部署完成后发现:

B内网 → A内网 正常

A内网 → B内网 失败

表现为:

  • B站点可以访问A站点所有设备
  • A站点无法访问B站点设备
  • 两台CentOS可以互相访问

测试:


ping 192.168.2.8
ping 192.168.3.8

均正常。


故障排查过程

首先检查:


tailscale status

结果正常。

继续检查:


tailscale debug prefs

确认:


"RouteAll": true

说明已经开启路由接受功能。

随后检查 Headscale、Subnet Router 配置及爱快静态路由,均未发现明显问题。


发现真正原因

进一步检查爱快 LAN 配置时发现:

A站点 LAN 掩码:
255.255.248.0

即:

192.168.0.0/21

覆盖范围:

192.168.0.0
~
192.168.7.255

其中包含:

192.168.2.0/24
192.168.3.0/24

问题分析

由于 A 爱快使用的是:

192.168.0.0/21

对于路由器来说:

192.168.2.x

属于本地 LAN。

因此当 A 内网设备访问:

192.168.2.100

时,爱快会直接发起 ARP 查询:

Who has 192.168.2.100 ?

而不会匹配:

192.168.2.0/24
→ 192.168.3.8

这条静态路由。

最终导致:

A → B 失败


解决方案

调整网络规划,避免远程网段被本地 LAN 掩码覆盖。

最终确认:

A站点:
192.168.3.0/24

B站点:
192.168.2.0/24

或者后续新增站点统一规划为:

10.10.1.0/24
10.10.2.0/24
10.10.3.0/24

避免与现有网段冲突。


经验总结

  1. CentOS 之间能互通,基本可证明 Headscale 与 Tailscale 工作正常。
  2. Subnet Router 必须开启 –advertise-routes 和 –accept-routes。
  3. Linux 必须开启 IP 转发功能。
  4. 爱快必须配置正确的静态路由。
  5. 最容易忽略的问题是网段重叠和子网掩码覆盖。

最终结果

成功实现:

A站点(爱快 + CentOS7)
          ↕
Headscale + Tailscale
          ↕
B站点(爱快 + CentOS7)

实现异地局域网双向互通,运行稳定,无需公网 IP、无需端口映射、无需传统 VPN。

关键词: Headscale、Tailscale、CentOS7、爱快、异地组网、内网互通、Subnet Router、静态路由、VPN 替代方案