一、背景与目标
随着家庭设备数量增多、远程访问需求提升,对原有家庭内网进行系统性改造,目标如下:
- 将所有家庭服务器与终端设备纳入统一的私有网络,实现跨网络访问;
- 在境外服务器上部署代理服务,每个服务器部署 Vision+Reality
- 解决移动端(Android / iOS / iPadOS)无法同时运行两个 VPN 的系统限制,实现流量的无缝转发。
二、已完成步骤
2.1 全节点部署 Tailscale
2.1.1 方案选型
选用 Tailscale 作为内网组网方案,其基于 WireGuard 协议构建,具备以下优势:
- 零配置穿透 NAT,无需暴露公网 IP;
- 去中心化的点对点连接(依托 DERP 中继兜底);
- 支持 ACL 精细访问控制;
- 官方客户端覆盖 Linux、macOS、Windows、Android、iOS/iPadOS。
2.1.2 部署步骤
按照 Tailscale 官方文档 在所有节点依次完成安装。
服务器端(Linux):
1 | # 安装 Tailscale |
客户端(Android / iOS / iPadOS):
在各应用商店搜索并安装 Tailscale 官方客户端,登录同一账号即自动加入网络。
2.1.3 验证
1 | # 查看所有在线节点 |
所有服务器节点及终端设备均成功加入同一 Tailscale 网络,可互相访问。
2.2 全节点部署 Vision & Reality 代理节点
2.2.1 方案选型
使用开源脚本 v2ray-agent 在各节点上批量部署代理服务,选用以下两种协议:
| 协议 | 说明 |
|---|---|
| VLESS + Vision | 基于 VLESS 的新一代流量控制协议,抗检测能力强 |
| VLESS + Reality | 无需自有域名,借用真实网站 TLS 指纹,隐蔽性极高 |
2.2.2 部署步骤
执行一键安装脚本:
1 | # 下载并执行 v2ray-agent 脚本 |
在交互菜单中依次完成:
- 选择安装 Xray-core;
- 选择 VLESS + Vision(需绑定已解析到本机 IP 的域名);
- 选择 VLESS + Reality(填入伪装域名,如
www.microsoft.com); - 脚本自动申请 TLS 证书(Vision 协议)、生成密钥对(Reality 协议)并完成配置。
2.2.3 验证
脚本执行完毕后,获取各协议的订阅链接或分享链接,导入客户端(如 v2rayN、Shadowrocket、Streisand 等)验证连通性。
2.3 配置 Xray 路由规则,放行 Tailscale 流量
2.3.1 问题背景
Android、iOS 及 iPadOS 系统存在限制:同一时间只能激活一个 VPN 连接。当 Tailscale 作为 VPN 运行时,代理客户端(如 Shadowrocket、v2rayNG)仍可连接服务器,但若 Xray 服务端将来自 Tailscale 网段(100.64.0.0/10)的入站流量也走代理出口,会导致流量回环或无法建立连接。
2.3.2 解决思路
在各服务器节点的 Xray 路由配置中,为 Tailscale 网段(100.64.0.0/10)以及相关 Google 域名添加 直连(direct)规则,使 Xray 对这部分流量不做代理处理,直接放行:
1 | 移动端设备(仅开启 Tailscale) |
移动端只需开启 Tailscale,代理客户端直接连接服务器的 Tailscale 内网 IP,Xray 路由规则自动识别并放行,无需同时开启两个 VPN,也无需额外端口转发。
客户端配置说明: 需在 Shadowrocket / v2rayNG 等代理客户端中,将服务器地址从公网 IP 或域名改为对应节点的 Tailscale IP(
100.x.x.x),端口及其他参数保持不变。Tailscale IP 可通过tailscale status查看。
2.3.3 实施步骤
v2ray-agent 脚本的 Xray 路由配置文件位于 /etc/v2ray-agent/xray/conf/09_routing.json。
1 | # 1. 进入配置目录 |
关键配置说明:
| 字段 | 值 | 说明 |
|---|---|---|
domainStrategy |
IPIfNonMatch |
域名无法匹配规则时,解析为 IP 后再匹配 |
ip: 100.64.0.0/10 |
Tailscale 保留网段 | 覆盖所有 Tailscale 节点的虚拟 IP |
outboundTag |
z_direct_outbound |
v2ray-agent 预设的直连出口标签 |
domain: gstatic.com 等 |
Google 相关域名 | 避免这些域名被误判走代理导致异常 |
2.4 使用国内服务器自建 DERP 中继
2.4.1 目标与思路
当两端节点无法直接打洞时,Tailscale 会回落到 DERP 中继转发。为降低跨境回落链路延迟,可在国内部署一台 DERP 服务器,并将其加入自定义 DERP 配置中,作为优先中继节点之一。
2.4.2 实施步骤
在国内 Linux 服务器上部署 derper,并确保以下端口可用:
443/tcp:DERP over TLS;3478/udp:STUN(可选但建议开启,提升打洞成功率)。
示例(systemd 方式,需先安装 Go 并编译 derper):
1 | # 1. 编译并安装 derper |
注意事项:
certmode letsencrypt需要 DERP 节点拥有已解析到本机 IP 的域名,且 80 端口可访问(用于 ACME 验证);若使用自有证书,改为certmode manual -certdir /path/to/certs。verify-clients会要求 DERP 服务器向 Tailscale 控制面验证客户端身份,该服务器本身也必须已执行tailscale up并加入同一 Tailscale 网络,否则所有客户端连接将被拒绝。
随后在 Tailscale Admin Console 的 Access controls 中写入 ACL/SSH/DERP 配置。
2.4.3 Admin Console Access controls 配置示例
本次使用的 Access controls 示例如下(已包含自建 DERP 区域 900):
1 | { |
关键字段说明:
| 字段 | 当前值 | 说明 |
|---|---|---|
OmitDefaultRegions |
false |
保留 Tailscale 官方默认 DERP 区域,同时追加自建区域 |
RegionID / RegionCode |
900 / cn-shanghai |
自定义区域标识,需保证在 tailnet 内唯一 |
HostName / IPv4 |
<已脱敏> |
DERP 节点域名与公网 IP,文档中建议脱敏展示,实际配置中填写真实值 |
DERPPort / STUNPort |
443 / 3478 |
与服务器实际监听端口一致,否则节点不可用 |
2.4.4 验证
在客户端执行:
1 | tailscale netcheck |
重点关注输出中的 DERP 区域信息,确认节点在回落中继时可命中新增的国内 DERP 区域。
三、参考资料
- Tailscale 官方文档:https://tailscale.com/kb
- Tailscale Custom DERP Servers:https://tailscale.com/docs/reference/derp-servers/custom-derp-servers
- v2ray-agent 项目:https://github.com/mack-a/v2ray-agent
©Co-Author : Shane