家庭内网改造技术总结报告(一)

一、背景与目标

随着家庭设备数量增多、远程访问需求提升,对原有家庭内网进行系统性改造,目标如下:

  • 将所有家庭服务器与终端设备纳入统一的私有网络,实现跨网络访问;
  • 在境外服务器上部署代理服务,每个服务器部署 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
2
3
4
5
6
7
8
# 安装 Tailscale
curl -fsSL <https://tailscale.com/install.sh> | sh

# 启动并加入网络
sudo tailscale up

# 开机自启
sudo systemctl enable --now tailscaled

客户端(Android / iOS / iPadOS):

在各应用商店搜索并安装 Tailscale 官方客户端,登录同一账号即自动加入网络。

2.1.3 验证

1
2
3
4
5
# 查看所有在线节点
tailscale status

# 测试节点间连通性
ping <节点 Tailscale IP>

所有服务器节点及终端设备均成功加入同一 Tailscale 网络,可互相访问。


2.2 全节点部署 Vision & Reality 代理节点

2.2.1 方案选型

使用开源脚本 v2ray-agent 在各节点上批量部署代理服务,选用以下两种协议:

协议 说明
VLESS + Vision 基于 VLESS 的新一代流量控制协议,抗检测能力强
VLESS + Reality 无需自有域名,借用真实网站 TLS 指纹,隐蔽性极高

2.2.2 部署步骤

执行一键安装脚本:

1
2
3
4
5
# 下载并执行 v2ray-agent 脚本
wget -P /root -N --no-check-certificate \\
"<https://raw.githubusercontent.com/mack-a/v2ray-agent/master/install.sh>" \\
&& chmod 755 /root/install.sh \\
&& bash /root/install.sh

在交互菜单中依次完成:

  1. 选择安装 Xray-core;
  2. 选择 VLESS + Vision(需绑定已解析到本机 IP 的域名);
  3. 选择 VLESS + Reality(填入伪装域名,如 www.microsoft.com);
  4. 脚本自动申请 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
2
3
4
5
6
7
移动端设备(仅开启 Tailscale)

│ 通过 Tailscale 内网 IP 连接服务器 Xray 监听端口

服务器 Xray(路由判断)
├── 来源 IP 属于 100.64.0.0/10 ──▶ z_direct_outbound(直连放行)
└── 其他流量 ──────────────────▶ 正常代理出口

移动端只需开启 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 1. 进入配置目录
cd /etc/v2ray-agent/xray/conf/

# 2. 备份旧路由配置
cp 09_routing.json 09_routing.json.bak

# 3. 覆盖写入包含 Tailscale 直连规则的新路由配置
cat > 09_routing.json << EOF
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"ip": ["100.64.0.0/10"],
"outboundTag": "z_direct_outbound"
},
{
"type": "field",
"domain": [
"domain:gstatic.com",
"domain:googleapis.com",
"domain:googleapis.cn"
],
"outboundTag": "z_direct_outbound"
}
]
}
}
EOF

# 4. 重启 Xray 使配置生效
systemctl restart xray

# 5. 验证服务状态
systemctl status xray --no-pager

关键配置说明:

字段 说明
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
2
3
4
5
6
7
8
9
10
11
# 1. 编译并安装 derper
go install tailscale.com/cmd/derper@latest

# 2. 启动 derper(示例:Let's Encrypt 自动申请证书,监听 443 和 3478)
sudo ~/go/bin/derper \\
-hostname <YOUR_DERP_FQDN> \\
-certmode letsencrypt \\
-a :443 \\
-stun \\
-stun-port 3478 \\
-verify-clients

注意事项:

  • 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{
"acls": [
{
"action": "accept",
"src": ["*"],
"dst": ["*:*"]
}
],
"ssh": [
{
"action": "check",
"src": ["autogroup:member"],
"dst": ["autogroup:self"],
"users": ["autogroup:nonroot", "root"]
}
],
"derpMap": {
"OmitDefaultRegions": false,
"Regions": {
"900": {
"RegionID": 900,
"RegionCode": "cn-shanghai",
"RegionName": "China Shanghai", // 可按实际机房命名
"Nodes": [
{
"Name": "node-1", // 节点名称示例
"RegionID": 900,
"HostName": "<YOUR_DERP_FQDN>", // 按实际替换
"IPv4": "<YOUR_DERP_PUBLIC_IP>", // 按实际替换
"DERPPort": 443,
"STUNPort": 3478
}
]
}
}
}
}

关键字段说明:

字段 当前值 说明
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 区域。


三、参考资料

©Co-Author : Shane