OpenWrt + Tailscale 异地组网(子网路由 + Exit Node)
在 OpenWrt 上安装并配置 Tailscale,实现异地互访(子网路由/Subnet Router)、可选的 Exit Node,同时解决 nftables 防火墙与 UDP GRO 警告等常见问题。
在 OpenWrt 上安装并配置 Tailscale,实现异地互访(子网路由/Subnet Router)、可选的 Exit Node,同时解决 nftables 防火墙与 UDP GRO 警告等常见问题。
最近为了实现从外网安全地访问家里的局域网设备(NAS、通过 IP 访问的各类服务等),顺便为了在外面能用家里的网络出口(Exit Node)上网,我在 OpenWrt 路由器上部署了 Tailscale。
整个过程并不复杂,但有一些细节(比如防火墙模式、接口配置、性能优化)需要注意。这里把整个配置过程记录下来,方便后续查阅。
首先更新软件包列表,然后安装 tailscale 主程序。为了避免潜在的防火墙兼容性问题,建议同时安装 iptables-nft 系列包,以确保 Tailscale 能正确处理 NAT 规则。
opkg update
opkg install tailscale
opkg install iptables-nft ip6tables-nft kmod-nft-compat
OpenWrt 新版本默认使用 nftables,而 Tailscale 默认可能还在尝试使用旧的 iptables 命令。为了让它更好地利用 nftables,我们需要显式指定防火墙模式。
修改启动脚本,在 procd_open_instance 之后插入环境变量声明:
sed -i '/procd_open_instance/a \ \ \ \ export TS_DEBUG_FIREWALL_MODE=nftables' /etc/init.d/tailscale
修改后,我们可以通过日志确认是否生效(看到 using nftables 即表示成功):
logread | grep firewall
# 输出示例:
# ... using nftables
这是最关键的一步。我们需要通过命令行启动 Tailscale,并配置我们需要的参数(子网路由、Exit Node 等)。
tailscale up \
--advertise-routes=192.168.100.0/24 \
--accept-routes \
--accept-dns=false \
--snat-subnet-routes=true \
--advertise-exit-node
参数详解:
--advertise-routes=192.168.100.0/24: 核心配置。告诉 Tailscale 我要把家里的这个网段(请根据你实际的 LAN 口网段修改)共享出去。这样你在外面连上 Tailscale 后,就能直接 ping 通或访问 192.168.100.x 的设备了。--accept-routes: 接受别的节点宣告的路由。如果你有多个局域网互联的需求,这个得开。--accept-dns=false: 我更习惯用 OpenWrt 自己的 DNS 设置,所以关掉了 Tailscale 的 MagicDNS 覆盖,避免干扰。--snat-subnet-routes=true: 让通过 Tailscale 进来的流量,在进入局域网前做一次 SNAT(伪装成路由器 IP)。这样局域网内的设备就不需要配置静态路由指回 Tailscale 了,非常省心。--advertise-exit-node: 宣告自己可以作为一个“出口节点”。这样你在手机/电脑的 Tailscale 客户端上选择“Exit Node”为这台路由器后,所有的上网流量都会通过家里的宽带出去。注意:执行完命令后,终端会打印一个 URL。复制并在浏览器打开,登录你的 Tailscale 账号进行授权。
重要后续:登录 Tailscale Admin Console (网页端),找到这台机器:
- 在 Edit route settings 里,把
192.168.100.0/24和Exit Node的勾打上(默认是关闭的)。- (可选) 在 Key expiry 里选择 “Disable key expiry”,防止密钥过期导致掉线。
虽然命令行里配好了,但 OpenWrt 的防火墙还需要配置一下,给 Tailscale 创建一个专属的接口和区域,保证流量通畅。
创建接口:
tailscale。不配置协议 (Unmanaged)。tailscale0。创建/配置防火墙区域:
tailscale。tailscale 接口。LAN 和 WAN。LAN。这样配置后,Tailscale 的流量就可以自由地访问 LAN 口设备,也可以通过 WAN 口上网了。
在使用过程中,你可能会在日志里看到类似这样的警告:
Warning: UDP GRO forwarding is suboptimally configured on br-lan, UDP forwarding throughput capability will increase with a configuration change.
这是提示网卡的 UDP Generic Receive Offload (GRO) 配置未优化,可能会影响转发性能。我们可以通过 ethtool 来解决。
安装工具:
opkg install --force-overwrite ethtool-full
获取 WAN 口名称:
NETDEV=$(ip route | awk '/default/ {print $5}')
echo $NETDEV
# 输出可能是 pppoe-wan 或 eth0 等
应用优化命令:
ethtool -K $NETDEV rx-udp-gro-forwarding on rx-gro-list off
持久化配置 (开机自动执行): 为了防止重启失效,我们把它写入热插拔脚本。
对于单 WAN 环境:
cat << 'EOF' > /etc/hotplug.d/iface/99-gro
#!/bin/sh
[ "$ACTION" = ifup ] || exit 0
[ "$INTERFACE" = "wan" ] || exit 0
NETDEV=$(ip route | awk '/default/ {print $5}')
[ -n "$NETDEV" ] || exit 0
ethtool -K $NETDEV rx-udp-gro-forwarding on rx-gro-list off
EOF
chmod +x /etc/hotplug.d/iface/99-gro
Tailscale 更新很频繁,如果需要手动更新:
tailscale update
/etc/init.d/tailscale restart
至此,OpenWrt 上的 Tailscale 就配置完成了。现在无论身在何处,连上 Tailscale 就像回到了家里一样方便。
OpenWrt + Tailscale 异地组网(子网路由 + Exit Node)
www.jsom.top/post/openwrt-tailscale-subnet-router
Comments