821 字
4 分钟
斐讯 N1 OpenWrt 更新 Tailscale 踩坑记录

两台斐讯 N1 跑 OpenWrt(lean & lienol R22.12.13),Tailscale 版本落后了,需要更新。

环境#

  • SoC: Amlogic S905D, AArch64 Cortex-A53 x4
  • 固件: OpenWrt R22.12.13, Kernel 5.15.x-flippy
  • Tailscale 安装方式: 静态二进制(非 opkg 包)
  • 旧版本: 1.84.0 ~ 1.90.9
  • 目标版本: 1.94.2

确认安装方式#

先看 Tailscale 是怎么装的:

Terminal window
opkg list-installed | grep tailscale # 空——不是 opkg 装的
ls -la /usr/bin/tailscale*
-rwxr-xr-x 1 root root 24740784 /usr/bin/tailscale
-rwxr-xr-x 1 root root 36262228 /usr/bin/tailscaled

两个独立的静态 ELF,不是 combined binary,不是 opkg 包。更新方式就是直接替换二进制。

下载新版本#

从官方下载 arm64 静态包:

Terminal window
curl -sL "https://pkgs.tailscale.com/stable/tailscale_1.94.2_arm64.tgz" \
-o tailscale_1.94.2_arm64.tgz
tar xzf tailscale_1.94.2_arm64.tgz

更新流程#

有 LAN 访问的情况#

如果能通过 LAN IP 直接 SSH(不依赖 Tailscale 隧道),流程比较简单:

Terminal window
# 1. 备份
ssh root@<LAN_IP> "cp /usr/bin/tailscale{,.bak} && cp /usr/bin/tailscaled{,.bak}"
# 2. 上传 tailscale(CLI 可以直接覆盖)
scp tailscale_1.94.2_arm64/tailscale root@<LAN_IP>:/usr/bin/tailscale
# 3. tailscaled 正在运行,直接 scp 会报 "dest open: Failure"
# 需要先停掉
ssh root@<LAN_IP> "kill \$(pidof tailscaled); sleep 2"
scp tailscale_1.94.2_arm64/tailscaled root@<LAN_IP>:/usr/bin/tailscaled
# 4. 通过 init 脚本启动(使用正确的 state 路径)
ssh root@<LAN_IP> "/etc/init.d/tailscale start"
# 5. 验证
ssh root@<LAN_IP> "tailscaled --version && tailscale status | head -3"
CAUTION

不要用 tailscale up --reset--reset 会清除认证状态,需要重新登录。直接用 init 脚本重启就行,它会读取原有的 state 文件。

只有 Tailscale IP 访问的情况#

如果只能通过 Tailscale 网络连接,重启 tailscaled 会短暂断连。用 nohup 确保命令执行完:

Terminal window
ssh root@<TAILSCALE_IP> "nohup sh -c '\
killall tailscaled; sleep 2; \
rm -f /var/run/tailscale/tailscaled.sock; \
/usr/bin/tailscaled --state=/var/lib/tailscale/tailscaled.state &' \
> /tmp/ts-restart.log 2>&1 &"
# 等几秒让隧道重建
sleep 5
tailscale ping <TAILSCALE_IP>

踩坑:Tailscale IP SSH 不通#

更新完后发现 Tailscale IP 能 tailscale ping 通,但 SSH 连不上。排查结果:

tailscale ping 走的是 Tailscale 自己的 WireGuard 隧道,而 SSH 走的是操作系统的 TCP 栈。重启 tailscaled 后隧道需要时间重建,等几秒就好了。

如果是持续不通,检查:

Terminal window
# SSH 是否监听所有接口
grep ListenAddress /etc/ssh/sshd_config
# 防火墙是否允许 tailscale zone 的 input
uci show firewall | grep -E 'zone.*(tailscale|name|input)'
# iptables 里 tailscale 相关的链
iptables -L ts-input -n -v
iptables -L zone_tailscale_input -n -v

踩坑:OpenSSH vs Dropbear#

这个固件用的是 OpenSSH(不是 OpenWrt 默认的 Dropbear)。区别在于 authorized_keys 的路径:

SSH 服务密钥路径
Dropbear/etc/dropbear/authorized_keys
OpenSSH~/.ssh/authorized_keys

确认方式:

Terminal window
ps | grep -E "sshd|dropbear"

init 脚本#

如果没有 init 脚本,tailscaled 不会开机自启。标准的 procd 脚本:

/etc/init.d/tailscale
#!/bin/sh /etc/rc.common
START=99
USE_PROCD=1
start_service() {
procd_open_instance
procd_set_param command /usr/bin/tailscaled --state=/var/lib/tailscale/tailscaled.state
procd_set_param respawn
procd_close_instance
}
stop_service() {
killall tailscaled
}
Terminal window
chmod +x /etc/init.d/tailscale
/etc/init.d/tailscale enable
TIP

注意 --state 路径要和你实际的 state 文件一致。常见路径有 /etc/tailscale/tailscaled.state/var/lib/tailscale/tailscaled.state,看你之前是怎么启动的。

顺手:清理不必要的服务#

这类 lean/lienol 固件默认启用了大量服务。一台路由器上跑着 FTP、SNMP、NFS、蓝牙、AirPlay、多个 VPN 服务端、多套代理……大部分完全没用,还有安全风险。

列一下停掉的:

Terminal window
# 安全风险:监听 0.0.0.0
RISKY="vsftpd snmpd netserver ocserv rpcbind nfsd"
# 资源浪费
WASTE="netdata bluetoothd btagent avahi-daemon miniupnpd pptpd \
shairplay shairport-sync mjpg-streamer kms udpspeeder udp2raw"
# 冗余代理
PROXY="shadowsocksr passwall_server passwall2_server ssr_mudb_server \
v2ray_server xray gost kcptun openclash softethervpn n2n"
for svc in $RISKY $WASTE $PROXY; do
/etc/init.d/$svc stop 2>/dev/null
/etc/init.d/$svc disable 2>/dev/null
done

清理后内存释放了约 36MB,监听端口从 ~40 个降到 ~24 个。

最终状态#

=== tailscale version ===
1.94.2
=== tailscaled version ===
1.94.2
=== status ===
tailscale is running, all peers connected

两台 N1 都更新到 1.94.2,服务正常。

斐讯 N1 OpenWrt 更新 Tailscale 踩坑记录
https://blog.lishuyu.top/posts/openwrt-tailscale-update/
作者
猫猫魔女
发布于
2026-03-15
许可协议
CC BY-NC-SA 4.0