基于 Ubuntu 与 OpenWrt 构建 Tailscale 家庭子网路由与 P2P 直连极速访问指南
本教程详细记录了如何将家庭内网的一台 Ubuntu 服务器配置为 Tailscale 子网路由器(Subnet Router) 与 出口节点(Exit Node),并通过 OpenWrt 与上级光猫优化 实现外部设备(手机、笔记本等)在公网环境下 100% P2P 直连 访问家庭局域网内所有设备(如 NAS、打印机、智能家居、软路由后台、光猫后台等),并支持内网自定义域名(如 *.home.marco)自动分流解析。同时包含国内网络环境下 服务器重启自动鉴权防掉线、iOS 设备 VPN 冲突 与 代理软件冲突排除 的完整解决方案。
目录
一、 全局网络拓扑与架构总览
家庭网络通常由光猫、二级路由器和内部服务器组成。以下为完整的 IP 分布与网络层级:
[外部客户端: 手机 5G / 笔记本] (Tailscale IP: 100.70.12.55)
│
▼ 1. P2P 握手请求 (UDP 41641)
┌─────────────────────────────────────────────────────────────┐
│ 第一层:光猫 (192.168.1.1) [公网 IP: <你的公网IP>] │
│ └─ DMZ 规则:将所有外网打洞请求透传给 192.168.1.6 │
│ └─ 挂载设备:ESXi 宿主机 (192.168.1.3 / esxi.home.marco) │
└──────────────────────────────┬──────────────────────────────┘
│ 2. 透传数据流
▼
┌─────────────────────────────────────────────────────────────┐
│ 第二层:OpenWrt 主路由 │
│ ├─ WAN 口 IP: 192.168.1.6 (由光猫分配) │
│ ├─ LAN 口 IP: 192.168.122.1 (网段: 192.168.122.0/24) │
│ ├─ 端口映射:UDP 41641 -> 192.168.122.2:41641 │
│ ├─ 内网 DNS:Dnsmasq 解析 *.home.marco │
│ └─ 局域网代理接口:192.168.122.1:10809 (HTTP) │
└──────────────────────────────┬──────────────────────────────┘
│ 3. 端口命中
▼
┌─────────────────────────────────────────────────────────────┐
│ 第三层:Ubuntu 服务器 (Tailscale IP: 100.98.71.30) │
│ ├─ 局域网静态 IP: 192.168.122.2 │
│ ├─ 角色: Subnet Router (子网路由) + Exit Node (出口节点) │
│ ├─ 广播网段: 192.168.122.0/24 及 192.168.1.0/24 │
│ ├─ 开机自启鉴权代理:指向 192.168.122.1:10809 │
│ └─ 加速: UDP GRO 硬件转发加速 │
└──────────────────────────────┬──────────────────────────────┘
│ 4. 内网/跨网段转发 (自动 SNAT)
┌───────────────────────┼───────────────────────┐
▼ ▼ ▼
局域网 NAS 局域网 PC 访问上级光猫
(192.168.122.5) (192.168.122.x) (192.168.1.1)
nas.home.marco esxi.home.marco二、 核心原理图解(初学者必读)
1. 双重 NAT 与 100% P2P 直连打洞原理
未配置端口映射时(走中继):
外部手机 ──(UDP 41641)──> [ 光猫 (拦截丢弃) ]
└─► 打洞失败 ──► 香港 DERP 服务器 (中转,延迟 300ms+, 限速) ──► 家庭 Ubuntu
配置光猫 DMZ + OpenWrt 端口映射后(100% P2P 直连):
外部手机 ──(UDP 41641)──> [ 光猫 (DMZ 透传) ] ──> [ OpenWrt (端口转发) ] ──> [ Ubuntu ]
└────────────────────── 建立端到端加密直连 (15ms 极速) ──────────────────────┘2. Split DNS 条件分流解析流程
当你输入一个域名时,Tailscale 会智能判断目标:
┌─── 输入 *.home.marco (如 nas.home.marco)
│ └─► 走 Tailscale 加密隧道
│ └─► 发给家庭 OpenWrt Dnsmasq (192.168.122.1)
│ └─► 解析出内网 IP: 192.168.122.5 (直连访问成功)
外部设备发起访问 ───────┤
│
└─── 输入普通互联网网站 (如 baidu.com / google.com)
└─► 走手机本地运营商 / 本地 Wi-Fi DNS
└─► 正常高速直连访问,完全不消耗家庭带宽3. Subnet Router(分流) vs Exit Node(全局)对比
| 对比维度 | 子网路由(Subnet Router) | 出口节点(Exit Node) |
|---|---|---|
| 流量范围 | 仅内网流量走家里(智能分流) | 所有上网流量全局走家里(全局代理) |
| 访问内网(如 192.168.122.x / 192.168.1.1) | 流量走家里 Ubuntu 中转(支持) | 流量走家里 Ubuntu 中转(支持) |
| 访问普通网站(如 百度、B站) | 走手机当前自己的 5G / 本地 Wi-Fi | 全部经由家里的宽带发送出去 |
| 外部看到的公网 IP | 显示手机当前所在运营商 IP | 显示为您家里的宽带公网 IP |
4. iOS 单 VPN 槽位冲突与 Auth Key 原理
网页登录冲突原因:
开启手机代理软件 ──► 点击 Tailscale 登录 ──► Tailscale 抢占 iOS 唯一 VPN 槽位
└─► 原代理软件被系统断开 ──► Safari 无法访问 accounts.google.com ──► 登录超时失败
Auth Key 登录(秒级完成):
电脑后台生成 Auth Key ──► 手机 Tailscale 粘贴密钥 ──► 无需网页跳转 / 无需 Google 认证 ──► 瞬间完成登录三、 OpenWrt 主路由优化配置(四大核心模块)
在双路由架构下,OpenWrt 承担了数据转发、DNS 解析以及代理分流的枢纽职责。共需配置 4 个核心文件:
1. 防火墙端口转发与硬件加速 (/etc/config/firewall)
# 1. 映射 UDP 41641 端口至 Ubuntu 服务器 (保障 P2P 直连)
uci add firewall redirect
uci set firewall.@redirect[-1].name='Tailscale_Ubuntu'
uci set firewall.@redirect[-1].src='wan'
uci set firewall.@redirect[-1].proto='udp'
uci set firewall.@redirect[-1].src_dport='41641'
uci set firewall.@redirect[-1].dest='lan'
uci set firewall.@redirect[-1].dest_ip='192.168.122.2'
uci set firewall.@redirect[-1].dest_port='41641'
uci set firewall.@redirect[-1].target='DNAT'
# 2. 启用软路由流量卸载加速 (降低 CPU 占用并跑满带宽)
uci set firewall.@defaults[0].flow_offloading='1'
uci commit firewall
/etc/init.d/firewall reload2. Dnsmasq 跨网段与防重绑配置 (/etc/config/dhcp)
# 1. 允许响应非本地直连网段的 DNS 查询 (关闭 localservice 限制)
uci set dhcp.@dnsmasq[0].localservice='0'
# 2. 将 home.marco 加入防 DNS 重绑保护白名单 (允许返回私有 IP)
uci add_list dhcp.@dnsmasq[0].rebind_domain='home.marco'
uci commit dhcp
/etc/init.d/dnsmasq restart3. Tailscale 鉴权域名分流配置 (/etc/dnsmasq/proxy-added.conf)
国内网络环境下,Tailscale 每次开机/重启时发往官方控制平面(controlplane.tailscale.com)的握手请求容易被公网阻断。在 OpenWrt 的自定义代理列表中追加以下规则:
编辑 /etc/dnsmasq/proxy-added.conf 追加:
# Tailscale 控制平面分流
nftset=/tailscale.com/4#ip#v2ray#gfwlist
nftset=/tailscale.io/4#ip#v2ray#gfwlist
nftset=/ts.net/4#ip#v2ray#gfwlist重启生效:
/etc/init.d/dnsmasq restart4. 局域网代理接口配置 (/etc/v2ray/config.json)
在 OpenWrt 的 v2ray 配置中开启局域网 HTTP/SOCKS 代理入站端口,供局域网内后台服务进行鉴权使用:
在 /etc/v2ray/config.json 的 inbounds 数组中添加:
{
"tag": "http-proxy",
"port": "10809",
"listen": "0.0.0.0",
"protocol": "http"
},
{
"tag": "socks-proxy",
"port": "10808",
"listen": "0.0.0.0",
"protocol": "socks"
}重启 v2ray 守护进程:
/etc/init.d/v2ray restart四、 Ubuntu 服务器端配置
1. 开启系统内核网络转发
# 写入持久化配置文件
sudo bash -c 'cat << EOF > /etc/sysctl.d/99-tailscale.conf
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
EOF'
# 立即应用生效
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf2. 安装 Tailscale
以 Ubuntu 24.04 (Noble) 为例:
# 导入官方 GPG 密钥与软件源
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list
# 更新并安装
sudo apt-get update
sudo apt-get install -y tailscale
# 启动并设置开机自启
sudo systemctl enable --now tailscaled3. 配置重启自动鉴权防掉线 (/etc/default/tailscaled)
为了防止 Ubuntu 服务器重启时因网络干扰导致控制平面鉴权超时,配置环境变量让 Tailscale 的鉴权请求自动通过 OpenWrt 代理进行握手:
sudo bash -c 'cat << EOF > /etc/default/tailscaled
PORT="41641"
FLAGS=""
HTTP_PROXY="http://192.168.122.1:10809"
HTTPS_PROXY="http://192.168.122.1:10809"
EOF'
# 重启 tailscaled 服务
sudo systemctl restart tailscaled4. 启动并广播多子网与出口节点
同时将家庭设备局域网 192.168.122.0/24 和上级光猫局域网 192.168.1.0/24 广播至 Tailscale 网络,并声明出口节点支持:
sudo tailscale up --advertise-routes=192.168.122.0/24,192.168.1.0/24 --advertise-exit-node --accept-routes=true --reset说明:执行后终端会输出认证链接,在浏览器中打开并登录您的 Tailscale 账号完成设备绑定。
5. 开启 UDP GRO 网卡硬件加速(关键性能优化)
安装 ethtool:
sudo apt-get install -y ethtool立即开启优化(假设网卡为
ens160):sudo ethtool -K ens160 rx-udp-gro-forwarding on rx-gro-list off配置开机自启服务:
sudo bash -c 'cat << EOF > /etc/systemd/system/tailscale-gro.service [Unit] Description=Tailscale UDP GRO optimization for ens160 After=network.target [Service] Type=oneshot ExecStart=/usr/sbin/ethtool -K ens160 rx-udp-gro-forwarding on rx-gro-list off RemainAfterExit=yes [Install] WantedBy=multi-user.target EOF' sudo systemctl daemon-reload sudo systemctl enable --now tailscale-gro.service
五、 解决双重 NAT:光猫端配置
1. 光猫配置方案 1:开启 DMZ 主机(最推荐)
- 浏览器访问光猫后台:
http://192.168.1.1; - 进入 高级设置 / 安全设置 -> DMZ 设置;
启用 DMZ,并将 DMZ IP 地址填写为 OpenWrt 的 WAN 口 IP:
192.168.1.6- 保存生效。
2. 光猫配置方案 2:添加 UDP 端口转发
如果不想开 DMZ,在光猫 虚拟服务器 / 端口转发 中添加:
- 协议:
UDP - 外部端口:
41641 - 内部 IP 地址:
192.168.1.6 - 内部端口:
41641
六、 内网私有域名解析 (Split DNS / *.home.marco)
1. Tailscale 控制台添加 Split DNS Nameserver
- 打开 Tailscale 控制台 DNS 页面;
- 在 Nameservers 区域点击 Add nameserver -> Custom...;
填写配置:
- Nameserver IP:
192.168.122.1(OpenWrt 路由 IP); - 勾选
Restrict to search domain; - Domain:
home.marco; - 勾选
Use with exit node(开启全局出口时依然保持内网域名通过家里解析);
- Nameserver IP:
- 点击 Save 保存,并确保顶部的 MagicDNS 开启。
2. 客户端本地代理软件冲突排除(v2rayN / Clash / SwitchyOmega)
若电脑运行了科学上网软件,代理工具可能会拦截 *.home.marco 导致网页报 503 Service Unavailable。
解决方法:在代理软件中加入直连规则:
- v2rayN:设置 -> 路由设置 -> 「直连的 Domain」添加
domain:home.marco; - Clash / Clash Verge:规则配置添加
DOMAIN-SUFFIX,home.marco,DIRECT; - SwitchyOmega:Proxy 模式的「Bypass List」添加
*.home.marco。
七、 Tailscale 控制台配置与永久免登设置
1. 审批激活子网路由与 Exit Node
- 登录 Tailscale 管理控制台 - Machines;
- 找到服务器
ubuntu-home-marco-> 点击...-> Edit route settings...; - 勾选
192.168.122.0/24和192.168.1.0/24; - 勾选 Use as exit node;
- 点击 Save 保存。
2. 开启“永久免登录”防掉线 (Disable Key Expiry)
- 在 Machines 页面 找到您的设备(如服务器或手机);
- 点击右侧菜单
...-> Disable key expiry; - 状态显示为
Expiry disabled,该设备将终身永久在线,无需再次登录。
八、 移动端与客户端接入(含 iOS 解决方案)
1. 方案 A:使用 Auth Key 免网页登录(推荐)
- 在电脑浏览器打开 Tailscale 控制台 - Keys 页面;
- 点击 Generate auth key... -> 勾选 Reusable -> 点击 Generate key;
复制生成的密钥(形如
tskey-auth-kxxxxxxxxxxxx);注:生成的 90 天仅为密钥兑换期限。兑换登录后设备永久绑定,绝不会掉线。
- 打开手机 Tailscale App,在登录界面右上角点击
...-> 选择Log in with auth key...粘贴密钥即可秒级登录。
2. 方案 B:通过局域网 Wi-Fi 代理登录
- 确保电脑代理软件开启了「允许局域网连接」,记录电脑 IP(如
192.168.122.x)和端口(如7890); - 手机连接同一家庭 Wi-Fi -> 点击 Wi-Fi 详情
(i)-> 底部的 配置代理 -> 选择 手动 填入电脑 IP 和端口; - 打开 Tailscale 点击 Google 登录,顺利完成验证后,将手机 Wi-Fi 代理恢复为关闭。
九、 外部访问光猫后台(192.168.1.1)及网段冲突处理
在外部连接 Tailscale 后,浏览器直接输入 http://192.168.1.1 即可进入家庭光猫后台。
若外部 Wi-Fi 本身也是 192.168.1.1 的解决方案:
- 方案 1(开启 Exit Node):在 Tailscale 客户端开启 Exit Node -> 选择
ubuntu-home-marco,所有流量强制走家庭通道,准确命中家里光猫。 - 方案 2(手机热点):电脑连接手机 4G/5G 热点避开外部 Wi-Fi 网段冲突。
十、 连通性与域名访问验证
1. 命令行测试 Ping 连通性
ping openwrt.home.marco # 解析至 192.168.122.1
ping ubuntu.home.marco # 解析至 192.168.122.2
ping nas.home.marco # 解析至 192.168.122.5
ping esxi.home.marco # 解析至 192.168.1.32. 浏览器直接访问
| 目标设备 / 服务 | 推荐浏览器访问地址 | 说明 |
|---|---|---|
| OpenWrt 路由后台 | http://openwrt.home.marco | 对应内网 IP: 192.168.122.1 |
| 光猫管理后台 | http://192.168.1.1 | 对应内网 IP: 192.168.1.1 |
| ESXi 虚拟化后台 | https://esxi.home.marco | 必须使用 https 协议 (IP: 192.168.1.3) |
| NAS 存储管理 | http://nas.home.marco:5000 | 对应内网 IP: 192.168.122.5 |
| Ubuntu 服务器 | http://ubuntu.home.marco | 对应内网 IP: 192.168.122.2 |
3. 验证 P2P 直连状态
tailscale ping openwrt.home.marco- 直连输出(Direct):
pong from ubuntu-home-marco (100.98.71.30) via <你的公网IP>:41641 in 15ms - 中继输出(Relay):
pong from ubuntu-home-marco (100.98.71.30) via DERP(hkg) in 120ms
十一、 常见问题与 FAQ
Q1: 为什么使用 ping http://esxi.home.marco/ 提示找不到主机?
ping 是底层网络测试工具,参数只能是纯域名(ping esxi.home.marco)。带有 http:// 或斜杠 / 的是浏览器 URL,传递给 ping 会被识别为非法域名而报错。
Q2: 局域网内其他设备需要修改网关或做额外设置吗?
不需要。 Tailscale 子网路由默认开启了 SNAT(源地址转换)。内网设备看到的访问源 IP 是 Ubuntu 服务器的 192.168.122.2,回包会自动送回 Ubuntu,其他设备无需做任何改动。
Q3: 为什么 Ubuntu 重启后 Tailscale 会连不上,如何防掉线?
国内网络环境下,节点开机/重启时发往 Tailscale 官方鉴权服务器(controlplane.tailscale.com)的请求会被公网阻断。通过在 OpenWrt 上配置域名分流与局域网代理接口(10809),并在 Ubuntu 的 /etc/default/tailscaled 中指定 HTTP_PROXY="http://192.168.122.1:10809",即可实现开机 1 秒自动鉴权并永久防掉线。
标签:无