本教程详细记录了如何将家庭内网的一台 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 reload

2. 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 restart

3. 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 restart

4. 局域网代理接口配置 (/etc/v2ray/config.json)

在 OpenWrt 的 v2ray 配置中开启局域网 HTTP/SOCKS 代理入站端口,供局域网内后台服务进行鉴权使用:

/etc/v2ray/config.jsoninbounds 数组中添加:

{
    "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.conf

2. 安装 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 tailscaled

3. 配置重启自动鉴权防掉线 (/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 tailscaled

4. 启动并广播多子网与出口节点

同时将家庭设备局域网 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 网卡硬件加速(关键性能优化)

  1. 安装 ethtool

    sudo apt-get install -y ethtool
  2. 立即开启优化(假设网卡为 ens160):

    sudo ethtool -K ens160 rx-udp-gro-forwarding on rx-gro-list off
  3. 配置开机自启服务

    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 主机(最推荐)

  1. 浏览器访问光猫后台:http://192.168.1.1
  2. 进入 高级设置 / 安全设置 -> DMZ 设置
  3. 启用 DMZ,并将 DMZ IP 地址填写为 OpenWrt 的 WAN 口 IP:

    192.168.1.6
  4. 保存生效。

2. 光猫配置方案 2:添加 UDP 端口转发

如果不想开 DMZ,在光猫 虚拟服务器 / 端口转发 中添加:

  • 协议UDP
  • 外部端口41641
  • 内部 IP 地址192.168.1.6
  • 内部端口41641

六、 内网私有域名解析 (Split DNS / *.home.marco)

1. Tailscale 控制台添加 Split DNS Nameserver

  1. 打开 Tailscale 控制台 DNS 页面
  2. Nameservers 区域点击 Add nameserver -> Custom...
  3. 填写配置:

    • Nameserver IP192.168.122.1(OpenWrt 路由 IP);
    • 勾选 Restrict to search domain
    • Domainhome.marco
    • 勾选 Use with exit node(开启全局出口时依然保持内网域名通过家里解析);
  4. 点击 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

  1. 登录 Tailscale 管理控制台 - Machines
  2. 找到服务器 ubuntu-home-marco -> 点击 ... -> Edit route settings...
  3. 勾选 192.168.122.0/24192.168.1.0/24
  4. 勾选 Use as exit node
  5. 点击 Save 保存。

2. 开启“永久免登录”防掉线 (Disable Key Expiry)

  1. Machines 页面 找到您的设备(如服务器或手机);
  2. 点击右侧菜单 ... -> Disable key expiry
  3. 状态显示为 Expiry disabled,该设备将终身永久在线,无需再次登录

八、 移动端与客户端接入(含 iOS 解决方案)

1. 方案 A:使用 Auth Key 免网页登录(推荐)

  1. 在电脑浏览器打开 Tailscale 控制台 - Keys 页面
  2. 点击 Generate auth key... -> 勾选 Reusable -> 点击 Generate key
  3. 复制生成的密钥(形如 tskey-auth-kxxxxxxxxxxxx);

    :生成的 90 天仅为密钥兑换期限。兑换登录后设备永久绑定,绝不会掉线。
  4. 打开手机 Tailscale App,在登录界面右上角点击 ... -> 选择 Log in with auth key... 粘贴密钥即可秒级登录。

2. 方案 B:通过局域网 Wi-Fi 代理登录

  1. 确保电脑代理软件开启了「允许局域网连接」,记录电脑 IP(如 192.168.122.x)和端口(如 7890);
  2. 手机连接同一家庭 Wi-Fi -> 点击 Wi-Fi 详情 (i) -> 底部的 配置代理 -> 选择 手动 填入电脑 IP 和端口;
  3. 打开 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.3

2. 浏览器直接访问

目标设备 / 服务推荐浏览器访问地址说明
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 秒自动鉴权并永久防掉线。

标签:无

你的评论