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
避免与现有网段冲突。
经验总结
- CentOS 之间能互通,基本可证明 Headscale 与 Tailscale 工作正常。
- Subnet Router 必须开启 –advertise-routes 和 –accept-routes。
- Linux 必须开启 IP 转发功能。
- 爱快必须配置正确的静态路由。
- 最容易忽略的问题是网段重叠和子网掩码覆盖。
最终结果
成功实现:
A站点(爱快 + CentOS7)
↕
Headscale + Tailscale
↕
B站点(爱快 + CentOS7)
实现异地局域网双向互通,运行稳定,无需公网 IP、无需端口映射、无需传统 VPN。
关键词: Headscale、Tailscale、CentOS7、爱快、异地组网、内网互通、Subnet Router、静态路由、VPN 替代方案