最近有定制自己使用的 OpenWrt,定制了自己需要使用的软件包,编译了 24.10 快照版。在配置 Tailscale 后,测试发现速度不正常。我在 2014 年初的时候购买了友善R5S作为软路由,简单介绍过 OpenWrt 使用 Tailscale 组网。再次查阅资料后,我觉得可以详细分享一下。
我搭建的网络结构,两地设备可以互访。
配置过程
目前 Tailscale 和 OpenWrt nftable 仍存在防火墙不兼容的地方,当前 Tailscale 官网最新版本 1.76.6。
1. 安装 Tailscale
需要先在软件包中安装 Tailscale, tailscale up
需要设置 --netfilter-mode=off
来禁用tailscale的防火墙设置。
TIP
- 通过
opkg install tailscale
安装,会安装为服务(/etc/init.d/tailscale),服务配置中有一个关键的TS_DEBUG_FIREWALL_MODE=auto
环境变量。- 手动更新 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
3. 创建防火墙
在 LuCI 中创建新的防火墙区域:网络→防火墙→区域→添加
名称: tailscale
入站数据: ACCEPT (default)
出站数据: ACCEPT (default)
转发: ACCEPT
IP 动态伪装: on
MSS 钳制: on
涵盖的网络: tailscale
允许转发到目标区域:选择您的 LAN(以及其他内部区域或 WAN,如果计划使用此设备作为出口节点)
允许源区域转发:选择您的 LAN(以及其他内部区域或如果不想将 LAN 流量路由到其他 Tailscale 主机,则留空)
在连接跟踪设置 TAB中,允许“无效”流量: on (测试:只有开启这个开关,Tailscale从外部才能访问)
单击保存并应用
效果
配置成功后,就可以在路由和子网的任意一台机器访问到Tailscale中的机器,Tailscale子网中的机器。
路由表
ping Tailscale中的设备
ping Tailscale中其它设备公开的子网
iperf3 测试速度,40Mbps的小上传
关于自己编译的 Openwrt 问题
我一直使用 r5s.cooluc.com 这个固件,非常稳定。有时候想更新固件,但是由于 OpenWrt 固件特性,升级后自己安装包的都丢失了,需要重新安装。so,我就想搞下自用版定制固件。这个固件的大佬把构建脚本都开源了,可以让我自定义。
我在不知道大佬内置的软件源已经内置 OpenClash、OpenWrt-mihomo 的情况下,添加相应的源码。我想引入了一些依赖导致冲突。在我去掉自定义的源后,Tailscale 的网络就正常了,不会再出现上传严重丢包问题。具体原因,有时间再排查吧
目前我还在使用 OpenClash ,因为它可以设置 nftables 直接绕过代理节点的IP,避免同IP的 Tailscale 节点进入 Clash 内核,导致无法直连。
我定制后的包