1174 字
6 分钟
在 OpenWrt 上使用 Tailscale

最近有定制自己使用的 OpenWrt,定制了自己需要使用的软件包,编译了 24.10 快照版。在配置 Tailscale 后,测试发现速度不正常。我在 2014 年初的时候购买了友善R5S作为软路由,简单介绍过 OpenWrt 使用 Tailscale 组网。再次查阅资料后,我觉得可以详细分享一下。

我搭建的网络结构,两地设备可以互访。

image-20241127183549645

配置过程#

目前 Tailscale 和 OpenWrt nftable 仍存在防火墙不兼容的地方,当前 Tailscale 官网最新版本 1.76.6。

1. 安装 Tailscale#

需要先在软件包中安装 Tailscale, tailscale up 需要设置 --netfilter-mode=off 来禁用tailscale的防火墙设置。

TIP
  1. 通过opkg install tailscale 安装,会安装为服务(/etc/init.d/tailscale),服务配置中有一个关键的TS_DEBUG_FIREWALL_MODE=auto环境变量。
  2. 手动更新 Tailscale,去官网下载linux arm64版本的包,然后替换/usr/sbin/tailscale/usr/sbin/tailscaled,重启服务 service tailscale restart

如果你无法通过 opkg 安装 Tailscale,可以手动创建/etc/init.d/tailscale 和手动把两个 tailscale、tailscaled 放到/usr/sbin/

/etc/init.d/tailscale 文件内容,最新的配置设置 TS_DEBUG_FIREWALL_MODE=nftables,这个参数使用 auto 或者 nftables 都可以。

#!/bin/sh /etc/rc.common

# Copyright 2020 Google LLC.
# Copyright (C) 2021 CZ.NIC z.s.p.o. (https://www.nic.cz/)
# SPDX-License-Identifier: Apache-2.0

USE_PROCD=1
START=80

start_service() {
  local state_file
  local port
  local std_err std_out

  config_load tailscale
  config_get_bool std_out "settings" log_stdout 1
  config_get_bool std_err "settings" log_stderr 1
  config_get port "settings" port 41641
  config_get state_file "settings" state_file /etc/tailscale/tailscaled.state
  config_get fw_mode "settings" fw_mode nftables

  /usr/sbin/tailscaled --cleanup

  procd_open_instance
  procd_set_param command /usr/sbin/tailscaled

  # Starting with v1.48.1 ENV variable is required to enable use of iptables / nftables.
  # Use nftables by default - can be changed to 'iptables' in tailscale config
  procd_set_param env TS_DEBUG_FIREWALL_MODE="$fw_mode"

  # Set the port to listen on for incoming VPN packets.
  # Remote nodes will automatically be informed about the new port number,
  # but you might want to configure this in order to set external firewall
  # settings.
  procd_append_param command --port "$port"
  procd_append_param command --state "$state_file"

  procd_set_param respawn
  procd_set_param stdout "$std_out"
  procd_set_param stderr "$std_err"

  procd_close_instance
}

stop_service() {
  /usr/sbin/tailscaled --cleanup
}

Tailscale up 命令示例

tailscale up --accept-routes --accept-dns=false --advertise-exit-node --advertise-routes=192.168.40.0/24 --netfilter-mode=off

这个命令用于启动 Tailscale,并配置一些特定的选项。以下是每个选项的解释:

  • tailscale up: 启动 Tailscale。
  • --accept-routes: 接受其他节点通过 Tailscale 网络提供的路由。
  • --accept-dns=false: 不接受 Tailscale 网络提供的 DNS 设置。
  • --advertise-exit-node: 将当前节点作为出口节点进行广告,使其可以作为其他节点的互联网出口。
  • --advertise-routes=192.168.40.0/24: 将当前节点的 192.168.40.0/24 子网进行广告,使其可以通过 Tailscale 网络访问。
  • --netfilter-mode=off: 关闭 netfilter 模式,不对流量进行过滤。

这个命令配置了 Tailscale 以便在网络中共享特定的路由和出口节点,同时不接受外部的 DNS 设置。

2. 添加接口#

通过 LuCI 创建一个新的非托管接口:网络→接口→添加新接口

  • 名称:tailscale

  • 协议:Unmanaged(不配置协议)

  • 设备:tailscale0

image-20241127171847674

3. 创建防火墙#

在 LuCI 中创建新的防火墙区域:网络→防火墙→区域→添加

  • 名称: tailscale

  • 入站数据: ACCEPT (default)

  • 出站数据: ACCEPT (default)

  • 转发: ACCEPT

  • IP 动态伪装: on

  • MSS 钳制: on

  • 涵盖的网络: tailscale

  • 允许转发到目标区域:选择您的 LAN(以及其他内部区域或 WAN,如果计划使用此设备作为出口节点)

  • 允许源区域转发:选择您的 LAN(以及其他内部区域或如果不想将 LAN 流量路由到其他 Tailscale 主机,则留空)

image-20241127171938288

在连接跟踪设置 TAB中,允许“无效”流量: on (测试:只有开启这个开关,Tailscale从外部才能访问)

image-20241127172004494

单击保存并应用

效果#

配置成功后,就可以在路由和子网的任意一台机器访问到Tailscale中的机器,Tailscale子网中的机器。

路由表

image-20241127180721023

ping Tailscale中的设备

image-20241127180825874

ping Tailscale中其它设备公开的子网

image-20241127181013845 iperf3 测试速度,40Mbps的小上传 Pasted image 20241127184158

关于自己编译的 Openwrt 问题#

我一直使用 r5s.cooluc.com 这个固件,非常稳定。有时候想更新固件,但是由于 OpenWrt 固件特性,升级后自己安装包的都丢失了,需要重新安装。so,我就想搞下自用版定制固件。这个固件的大佬把构建脚本都开源了,可以让我自定义。

我在不知道大佬内置的软件源已经内置 OpenClash、OpenWrt-mihomo 的情况下,添加相应的源码。我想引入了一些依赖导致冲突。在我去掉自定义的源后,Tailscale 的网络就正常了,不会再出现上传严重丢包问题。具体原因,有时间再排查吧

目前我还在使用 OpenClash ,因为它可以设置 nftables 直接绕过代理节点的IP,避免同IP的 Tailscale 节点进入 Clash 内核,导致无法直连。

image-20241127182757866

我定制后的包

image-20241127183349421

参考文档#

  1. cooluc r5s固件
  2. Firewall mode in tailscaled
  3. openwrt官方文档 Tailscale
  4. sbwml/r4s_build_script
在 OpenWrt 上使用 Tailscale
https://www.jianyun.run/posts/use-tailscale-on-openwrt/
作者
唐长老日志
发布于
2024-11-27
许可协议
CC BY-NC-SA 4.0