Tailscale 组网笔记:利用 Armbian 旁路由攻克 Win11 无法直连(DERP 中继)顽疾

📌 背景与痛点

  • 环境: 本地局域网(192.168.111.0/24)下有 Armbian 和 Win11 两台机器;远端有一台 fnnas。
  • 现状:
    • Armbian 的 UPnP/NAT 打洞完全正常,与 fnnas 之间拥有完美的 Direct(直连) 通道(延迟几毫秒)。
    • Win11 由于系统防火墙、网络类型或运营商 NAT 限制,UPnP 无法沟通,导致 Win11 访问 fnnas 频繁走 DERP 中继,延迟高达 300ms+。
  • 终极需求: 让 Win11 的 所有网络流量全部通过 fnnas 转发(以 fnnas 作为全局出口节点 Exit Node),同时彻底摆脱 300ms 的延迟,享受到 Armbian 与 fnnas 之间的物理直连速度。

💡 终极解法:Armbian 旁路由(网关)方案

由于 Windows 自身的 Tailscale 客户端多网关路由优先级存在缺陷(直接在 Win11 上挂载出口容易导致路由死循环或回落中继),最彻底的解法是:在 Win11 上关闭 Tailscale 客户端,直接将局域网网关指向 Armbian。由 Armbian 100% 接管 Win11 流量,并将其送上 Armbian 到 fnnas 的加密直连隧道。

[ Win11 (物理网络) ] 
       │ 
       │ (局域网原生非加密流量,仅 ~6ms 极低延迟)
       ▼
[ Armbian (旁路由网关 / iptables 地址伪装) ] 
       │ 
       │ (自动塞入 Tailscale 隧道,公网完全加密,Direct 直连)
       ▼
[ fnnas (远端出口节点 / 代理全局上网) ]

🛠️ 详细配置步骤

第一步:在 Armbian 上开启系统转发与 Tailscale 出口挂载

  1. 开启 Linux 内核的 IP 转发功能:

    echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
    echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
    sudo sysctl -p
    
  2. 启动 Tailscale:宣告本地路由并挂载 fnnas 出口:
    假设 fnnas 的 Tailscale IP 是 100.112.129.119

    sudo tailscale up --advertise-routes=192.168.111.0/24 --accept-routes --exit-node=100.112.129.119 --exit-node-allow-lan-access
    
  3. 性能优化(消除 UDP GRO 警告,可选):

    sudo apt install ethtool -y
    sudo ethtool -K eth0 rx-udp-gro-forwarding on rx-gro-list off
    #验证是否生效
    sudo ethtool -k eth0 | grep -E 'rx-udp-gro-forwarding|rx-gro-list'
    

    持久化

    1. 创建服务文件:
    sudo nano /etc/systemd/system/udpgroforwarding.service
    
    1. 将以下内容粘贴进去,并保存:
    [Unit]
    Description=UDP GRO Forwarding Optimization for Tailscale
    Wants=network-online.target
    After=network-online.target
    [Service]
    Type=oneshot
    ExecStart=/sbin/ethtool -K eth0 rx-udp-gro-forwarding on rx-gro-list off
    [Install]
    WantedBy=multi-user.target
    
    1. 启用并启动服务:
    sudo systemctl daemon-reload
    sudo systemctl enable udpgroforwarding.service
    sudo systemctl start udpgroforwarding.service
    

第二步:配置 Armbian 防火墙(NAT 地址伪装)

为了防止回包丢失,必须让 Armbian 扮演“流量替身(MASQUERADE)”。

  1. 在本地物理网卡和 Tailscale 虚拟网卡上同时开启伪装:

    sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    sudo iptables -t nat -A POSTROUTING -o tailscale0 -j MASQUERADE
    
  2. 将防火墙规则永久持久化(防止重启失效):

    sudo apt-get install iptables-persistent -y
    

    提示:安装过程中弹出的蓝底白字提示 "Save current IPv4 rules?" 和 "Save current IPv6 rules?",全部使用方向键选择 Yes 并回车。
    若后续修改了规则,可手动运行 sudo netfilter-persistent save 强制覆盖保存。

第三步:Tailscale 控制台授权

  1. 登录 Tailscale Admin Console。
  2. 找到 armbian 节点,点击右侧 ... -> Edit route settings。
  3. 在 Subnet routes 中,勾选批准 192.168.111.0/24。
  4. 在 Exit Node 中,勾选批准 Armbian 允许作为出口节点(因为下一步它要带着 Win11 上网)。

第四步:调整 Win11 客户端与网络适配器

  1. 关闭 Win11 自身的 Tailscale:直接右键完全退出 Win11 的 Tailscale 客户端(不再需要它在本地抢路由、打洞)。
  2. 固定 Win11 静态 IP 并修改默认网关:
    • 在 Win11 上按下 Win + R 键,输入 ncpa.cpl 并回车,打开网络连接。
    • 右键点击正在使用的网卡(以太网或 Wi-Fi),选择 属性。
    • 双击 Internet 协议版本 4 (TCP/IPv4)。
    • 选择 使用下面的 IP 地址 进行如下固定:
      • IP 地址: 填写一个局域网内未被占用的静态 IP(如 192.168.111.123)
      • 子网掩码: 255.255.255.0
      • 默认网关:【核心】填写 Armbian 的物理局域网内网 IP(如 192.168.111.50)
      • 首选 DNS 服务器: 114.114.114.114 或 8.8.8.8
    • 一路点击确定保存。

🔍 防火墙配置原理说明 (MASQUERADE)

为什么必须配置 -j MASQUERADE?

  1. 去程: 当 Win11 发出包裹时,寄件人是 Win11 的局域网 IP(192.168.111.123)。
  2. 伪装: 流量在跨出 Armbian 的 tailscale0 虚拟网卡飞往外网的一瞬间,MASQUERADE 规则生效。Armbian 会用“涂改液”将寄件人强行擦除,修改为 Armbian 自己的 Tailscale IP(100.70.238.82),并在内核账本中记录这一笔。
  3. 回程: 远端的 fnnas 收到后,由于它只认得直连完好的 Armbian,它会极其顺利地顺着 Direct 直连隧道 将回包秒传给 Armbian。
  4. 交货: Armbian 收到回包后,翻开账本发现是给 Win11 的,再次通过本地物理网卡(eth0)进行内网转发,低延迟(~6ms)精准送达 Win11 适配器。

🏁 最终成果验证

配置完成后,Win11 的网络表现将呈现以下完美状态:

  • 打开网页或进行 ping 外部网络测试,流量完全通过 fnnas 代理。
  • 访问 fnnas 时,流量不经过任何官方 DERP 服务器中继,物理延迟从原先的 300ms 暴跌到网络链路的物理真实延迟,速度和稳定性达到最大化。
posted @ 2026-10-14 08:50  蝌蝌  阅读(45)  评论(0)    收藏  举报