OpenWrt

OpenWrt + Tailscale 异地组网(子网路由 + Exit Node)

在 OpenWrt 上安装并配置 Tailscale,实现异地互访(子网路由/Subnet Router)、可选的 Exit Node,同时解决 nftables 防火墙与 UDP GRO 警告等常见问题。

OpenWrt + Tailscale 异地组网(子网路由 + Exit Node)

最近为了实现从外网安全地访问家里的局域网设备(NAS、通过 IP 访问的各类服务等),顺便为了在外面能用家里的网络出口(Exit Node)上网,我在 OpenWrt 路由器上部署了 Tailscale。

整个过程并不复杂,但有一些细节(比如防火墙模式、接口配置、性能优化)需要注意。这里把整个配置过程记录下来,方便后续查阅。

1. 安装 Tailscale

首先更新软件包列表,然后安装 tailscale 主程序。为了避免潜在的防火墙兼容性问题,建议同时安装 iptables-nft 系列包,以确保 Tailscale 能正确处理 NAT 规则。

opkg update
opkg install tailscale
opkg install iptables-nft ip6tables-nft kmod-nft-compat

2. 开启 NFTable 防火墙模式

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

3. 启动并连接 Tailscale

这是最关键的一步。我们需要通过命令行启动 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 (网页端),找到这台机器:

  1. Edit route settings 里,把 192.168.100.0/24Exit Node 的勾打上(默认是关闭的)。
  2. (可选) 在 Key expiry 里选择 “Disable key expiry”,防止密钥过期导致掉线。

4. OpenWrt 接口与防火墙设置 (LuCI)

虽然命令行里配好了,但 OpenWrt 的防火墙还需要配置一下,给 Tailscale 创建一个专属的接口和区域,保证流量通畅。

  1. 创建接口

    • 进入 网络 (Network) -> 接口 (Interfaces) -> 添加新接口 (Add new interface)
    • 名称:tailscale
    • 协议:不配置协议 (Unmanaged)
    • 物理设备:选择 tailscale0
    • 提交
  2. 创建/配置防火墙区域

    • 进入 网络 (Network) -> 防火墙 (Firewall)
    • 添加新区域 (Add new zone)。
    • 名称:tailscale
    • 入站 (Input) / 出站 (Output) / 转发 (Forward):全选 接受 (Accept)。(既然是 VPN 进来的流量,通常是视为可信的,或者你可以按需收紧)。
    • IP 动态伪装 (Masquerading)务必勾选
    • MSS 钳制 (MSS clamping)务必勾选
    • 端口触发 (Covered networks):勾选刚才创建的 tailscale 接口。
    • 允许转发到目标区域 (Forward to destination zones):勾选 LANWAN
    • 允许从源区域转发 (Allow forward from source zones):勾选 LAN

这样配置后,Tailscale 的流量就可以自由地访问 LAN 口设备,也可以通过 WAN 口上网了。

5. 常见问题与性能优化

UDP GRO 警告优化

在使用过程中,你可能会在日志里看到类似这样的警告:

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 来解决。

  1. 安装工具

    opkg install --force-overwrite ethtool-full
  2. 获取 WAN 口名称

    NETDEV=$(ip route | awk '/default/ {print $5}')
    echo $NETDEV
    # 输出可能是 pppoe-wan 或 eth0 等
  3. 应用优化命令

    ethtool -K $NETDEV rx-udp-gro-forwarding on rx-gro-list off
  4. 持久化配置 (开机自动执行): 为了防止重启失效,我们把它写入热插拔脚本。

    对于单 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

👋

13 篇文章

38 个话题

2,157 次访问

Comments