外观
在 OpenWrt ImmortalWrt 上部署 Tailscale:全链路配置与故障排查指南
约 1961 字大约 7 分钟
2026-02-07
前言
Tailscale 是一种基于 WireGuard 协议的零配置 VPN 解决方案,它能够构建安全的点对点网状网络(Mesh Network)。在 OpenWrt 路由器(特别是 ImmortalWrt 分支)上部署 Tailscale,不仅可以实现远程访问局域网资源(Subnet Router),还能将家庭宽带作为全流量出口节点(Exit Node)。
然而,由于 OpenWrt 的防火墙机制(尤其是基于 nftables 的 fw4)与 Tailscale 的默认行为存在一定程度的兼容性问题,部署过程中常会遇到依赖缺失、防火墙拦截以及路由冲突等挑战。本文旨在提供一套科学、严谨的配置方案。
一、 环境准备与依赖修复
在现代 OpenWrt 版本(如 23.05+ 或 ImmortalWrt)中,默认防火墙已迁移至 nftables,且精简了部分遗留的 iptables 二进制文件。Tailscale 的底层逻辑仍依赖 iptables 命令来注入路由规则,因此直接安装往往会失败。
1.1 安装核心组件与兼容层
首先更新软件包列表,并安装 Tailscale 及关键的 iptables-nft 兼容层。
opkg update
# 安装 Tailscale 主程序
opkg install tailscale
# 安装 iptables 兼容层(核心修复步骤)
opkg install iptables-nft ip6tables-nft
# 安装 NAT 转发模块(解决无法作为 Exit Node 的问题)
opkg install iptables-mod-nat-extra注意:ip6tables-nft 是必须的。即使不使用 IPv6,Tailscale 在初始化阶段(--cleanup)也会尝试调用 ip6tables 清理规则,若缺失会导致服务无法启动或反复重启。
1.2 启用并启动服务
安装完成后,需确保守护进程(Daemon)开机自启并立即运行。
/etc/init.d/tailscale enable
/etc/init.d/tailscale start排查提示:若查看日志发现 Program starting... --cleanup 后进程退出,这是正常现象。该日志仅代表清理线程结束,主守护进程通常由 procd 在后台静默运行。请使用 ps | grep tailscaled 确认进程状态。
二、 网络接口与防火墙配置(核心步骤)
这是最关键且最易出错的环节。OpenWrt 默认采取“默认拒绝”的安全策略。Tailscale 创建的 tailscale0 虚拟接口被视为不受信任的外部区域,导致无法访问路由器后台(WebUI/SSH)或进行 NAT 转发。
2.1 创建逻辑接口
我们需要在 OpenWrt 的网络配置中显式定义 Tailscale 接口,以便防火墙能对其进行管理。
- 路径:
网络 (Network)->接口 (Interfaces)->添加新接口 - 名称:
tailscale - 协议:
不配置协议 (Unmanaged) - 物理设备:
tailscale0
2.2 配置防火墙区域 (Firewall Zone)
推荐通过 CLI (命令行) 进行精确配置,避免 Web 界面操作遗漏关键参数。
目标:创建一个名为 tailscale 的专用防火墙区域,允许入站访问路由器自身,允许转发流量到 LAN/WAN,并开启 IP 伪装(Masquerading)。
执行以下 UCI 命令:
# 1. 定义防火墙区域
uci set firewall.tailscale=zone
uci set firewall.tailscale.name='tailscale'
uci set firewall.tailscale.network='tailscale'
# 2. 设置流量策略(关键)
# Input=ACCEPT: 允许通过 Tailscale IP 访问路由器后台 (SSH/LuCI)
# Output/Forward=ACCEPT: 允许流量流出及转发到内网
uci set firewall.tailscale.input='ACCEPT'
uci set firewall.tailscale.output='ACCEPT'
uci set firewall.tailscale.forward='ACCEPT'
# 3. 开启 IP 动态伪装 (NAT)
# 必须开启,否则回包无法正确路由,导致 Exit Node 功能失效
uci set firewall.tailscale.masq='1'
# 4. 开启 MSS 钳制
# 解决 VPN 隧道中的 MTU 问题,防止大包丢弃
uci set firewall.tailscale.mtu_fix='1'
# 5. 设置区域间转发规则
# 允许 Tailscale 访问 LAN (远程访问内网)
uci set firewall.ts_to_lan=forwarding
uci set firewall.ts_to_lan.src='tailscale'
uci set firewall.ts_to_lan.dest='lan'
# 允许 LAN 访问 Tailscale
uci set firewall.lan_to_ts=forwarding
uci set firewall.lan_to_ts.src='lan'
uci set firewall.lan_to_ts.dest='tailscale'
# 提交更改
uci commit firewall
/etc/init.d/firewall reload2.3 解决 nftables 环境下的“无效流量”拦截问题
在某些 ImmortalWrt/OpenWrt 版本中,Tailscale 的加密流量可能被连接追踪(conntrack)机制误判为 INVALID 状态并被丢弃。这是导致能 Ping 通内网设备但无法打开路由器 WebUI 的常见原因。
修正方法(Web UI):
- 进入
网络->防火墙-> 编辑tailscale区域。 - 在
高级设置 (Advanced Settings)或连接追踪设置中。 - **勾选
允许“无效”流量 (Allow "invalid" traffic)**。 - 保存并应用。
三、 Tailscale 功能初始化
完成基础网络配置后,需要通过命令行初始化 Tailscale 并声明节点角色。
3.1 启动命令详解
建议使用以下完整命令,一次性配置所有参数,避免因参数覆盖导致的配置丢失。
tailscale up \
--accept-dns=false \
--accept-routes \
--advertise-routes=192.168.8.0/24 \
--advertise-exit-node \
--reset参数解析:
--accept-dns=false: 强烈建议。防止 Tailscale 的 MagicDNS 覆盖路由器原本的 DNS 设置(如 DNSmasq 或 MosDNS),避免引发 DNS 解析循环或断网。--accept-routes: 接受其他节点发布的路由(实现网状互访)。--advertise-routes=192.168.8.0/24: 发布本地局域网段(Subnet Router 模式)。请将192.168.8.0/24替换为实际网段。--advertise-exit-node: 声明本设备可以作为出口节点(Exit Node)。--reset: 强制重置之前的参数。若不加此参数,更改某些设置(如开关 Exit Node)时可能会报错。
3.2 云端授权(必须步骤)
在路由器执行命令仅是“声明”意图,出于安全考虑,必须在 Tailscale 管理控制台手动批准。
- 登录 Tailscale Admin Console。
- 找到对应的 OpenWrt 设备,点击
...菜单 -> Edit route settings。 - Subnet routes: 勾选刚刚发布的网段(如
192.168.8.0/24)。 - Exit node: 勾选
Use as exit node。
若忽略此步骤,客户端即使连接成功,也无法访问内网或通过路由器上网。
四、 常见问题与高级排查
4.1 无法通过 Tailscale IP 访问路由器后台
现象:远程能 Ping 通
192.168.8.x的局域网设备,也能打开内网 NAS 的网页,唯独打不开路由器本身的100.x.y.z页面。原因 1:防火墙区域的
Input链默认为REJECT。解法:参考本文 2.2 节,确保
uci set firewall.tailscale.input='ACCEPT'。原因 2:
uhttpd服务绑定限制。解法:检查
/etc/config/uhttpd,确保list listen_http '0.0.0.0:80',而不是绑定在特定 LAN IP 上。原因 3:nftables 丢弃无效包。
解法:参考本文 2.3 节,开启“允许无效流量”。
4.2 开启 Exit Node 后无网络
- 原因:缺少 NAT 伪装(Masquerading)。流量到达路由器后,路由器以 LAN IP 转发给公网,但回包时没有 NAT 表项,导致数据包无法通过 VPN 隧道返回。
- 解法:确保防火墙配置中
uci set firewall.tailscale.masq='1'已生效。
4.3 与 OpenClash/科学上网插件共存冲突
Tailscale 和 OpenClash 都会修改路由表和防火墙规则,二者极易冲突。
- 核心冲突:OpenClash 可能会拦截 Tailscale 的 UDP 隧道流量(端口 41641/UDP),或者形成路由环路。
- 最佳实践:
- OpenClash 全局设置 -> 访问控制 -> 不走代理的局域网设备:加入 Tailscale 的虚拟网段
100.64.0.0/10。 - 不走代理的 WAN IP:尝试加入 Tailscale 的 DERP 服务器端口或 IP(较难维护,通常绕过内网段即可)。
- DNS 设置:由于我们使用了
--accept-dns=false,DNS 冲突概率已降至最低。但需确保 OpenClash 允许处理来自tailscale0接口的 DNS 请求。
五、 总结
在 OpenWrt 上部署 Tailscale 并非简单的 install 即用。由于 Linux 防火墙机制的复杂性,成功的关键在于:
- 补全依赖:
iptables-nft和ip6tables-nft是基石。 - 防火墙信任:必须显式允许 Tailscale 区域的 Input 和 Forward 流量,并开启 Masquerading。
- 云端授权:切勿忘记在 Web 控制台启用路由和出口节点功能。
遵循上述步骤,即可构建一个稳定、安全且与现有网络架构完美共存的远程访问系统。