tailscale 到 clash 转发规则 (未测试)

说明

AI 给的设置建议
linux 下 tailscale 到 clash 有兼容问题,所以该功能会有问题
因为里面讲了一下原理,先记录一下,有空时再查证及解决兼容问题

流程总结

要管理 tailscale0 虚拟网卡,需先在 LuCI 中创建一个关联它的接口(如 tailscale_if),将其加入自定义安全区域(如 vpn),然后配置 DNAT 规则将公网访问指向内网目标,并允许 vpn 区域向目标区域(如 lan)转发流量。

操作流程

  1. 在 LuCI 中创建一个“接口”(如 tailscale_if),绑定到 tailscale 的虚拟网卡 tailscale0,协议选 Unmanaged

    • 这只是在系统层面识别这个虚拟网卡,告诉 LuCI:“这是个网络接口”。
    • 协议选 Unmanaged 表示不分配 IP、不运行 DHCP 等,仅用于桥接/转发/防火墙用途。
    • ✅ 这一步不涉及防火墙策略,只是准备接口。
  2. 将这个接口加入防火墙的某个“区域”(如新建 vpn 区域 或 加入 wan), 新建区域的话好管理一些, wan 区域可能会有多个接口,容易混乱

    • 你创建了一个逻辑“安全区域”,比如叫 vpn,并把 tailscale0 加入。
    • 区域可以设置入站(Input)、出站(Output)、转发(Forward)的默认策略(通常是 REJECT 或 DROP)。
    • ✅ 这一步定义了“从这个接口进来的流量属于 vpn 区域”,但还没说它能去哪。
  3. 设置端口转发规则(如 DNAT:100.x.x.x:8080 → 192.168.0.60:7893)

    • 例如:公网访问 100.x.x.x:8080 → 转发到内网 192.168.0.60:7893
    • DNAT 只改目标地址和端口,发生在 PREROUTING 阶段。
    • ❗️但注意:DNAT 本身不放行 FORWARD 链!
    • 数据包在经过 DNAT 后,会进入 FORWARD 链,此时防火墙会检查:
    • “从 vpn 区域 → lan 区域 是否被允许?”
    • 如果没有设置区域间转发 → 默认策略是 DROP → 包被丢弃,连接失败!
    • ✅ 所以:DNAT 只负责“改地址”,不负责“放行”。
  4. 设置区域间转发(如允许从 vpn 访问 lan)

    • 这一步就是在防火墙中添加一条 FORWARD 规则:from vpn → to lan : accept
    • 在 LuCI 中操作路径通常是:网络 → 防火墙 → 流量规则 → “允许转发到目的地区域” 或 “区域设置” → 编辑 vpn 区域 → “允许转发到” → 勾选 lan
    • ✅ 这才是真正放行流量的关键步骤!

图示

[ Tailscale 网络 ]
        ↓
访问 100.101.34.1:8080
        ↓
→ 到达 tailscale0 虚拟网卡
        ↓
→ 系统识别该接口属于 "vpn" 防火墙区域
        ↓
→ iptables DNAT 规则修改目标地址:100.101.34.1:8080 → 192.168.0.60:7893
        ↓
→ 数据包进入 FORWARD 链,检查区域间策略:vpn → lan 是否允许?✅(必须允许!)
        ↓
→ 包被转发至内网主机 192.168.0.60:7893
        ↓
→ 服务响应通过 conntrack 自动回程

AI 给的脚本


#!/bin/sh

# === 1. 创建 tailscale_if 接口 ===
uci set network.tailscale_if=interface
uci set network.tailscale_if.proto='none'
uci set network.tailscale_if.ifname='tailscale0'
uci set network.tailscale_if.auto='1'

# === 2. 创建 tailscale_vpn 防火墙区域 ===
uci set firewall.tailscale_vpn=zone
uci set firewall.tailscale_vpn.name='tailscale_vpn'
uci set firewall.tailscale_vpn.input='ACCEPT'    # 允许访问本机
uci set firewall.tailscale_vpn.output='ACCEPT'
uci set firewall.tailscale_vpn.forward='ACCEPT'  # 允许转发
uci add_list firewall.tailscale_vpn.network='tailscale_if'

# === 3. 允许 tailscale_vpn → lan 访问 ===
uci set firewall.tailscale_to_lan=forwarding
uci set firewall.tailscale_to_lan.src='tailscale_vpn'
uci set firewall.tailscale_to_lan.dest='lan'

# === 4. 提交网络和防火墙配置 ===
uci commit network
uci commit firewall

# === 5. 重载网络和防火墙 ===
/etc/init.d/network reload
/etc/init.d/firewall restart

# === 6. 添加 iptables 端口转发规则(DNAT)===
# 外部访问转发
iptables -t nat -A PREROUTING -d 100.101.34.1 -p tcp --dport 8080 -j DNAT --to-destination 192.168.0.60:7893
# 本机访问转发(如本机 curl 测试)
iptables -t nat -A OUTPUT -d 100.101.34.1 -p tcp --dport 8080 -j DNAT --to-destination 192.168.0.60:7893

# === 7. 持久化 iptables 规则(写入 firewall.user)===
{
    echo "# Tailscale Port Forward: 100.101.34.1:8080 → 192.168.0.60:7893"
    echo "iptables -t nat -A PREROUTING -d 100.101.34.1 -p tcp --dport 8080 -j DNAT --to-destination 192.168.0.60:7893"
    echo "iptables -t nat -A OUTPUT -d 100.101.34.1 -p tcp --dport 8080 -j DNAT --to-destination 192.168.0.60:7893"
} >> /etc/firewall.user

# === 8. 重启防火墙使 firewall.user 生效 ===
/etc/init.d/firewall restart

# === 9. 验证 ===
echo ""
echo "✅ 配置完成!"
echo "📌 接口:tailscale_if 已创建"
echo "📌 区域:tailscale_vpn 已创建并绑定接口"
echo "📌 转发:tailscale_vpn → lan 已允许"
echo "📌 端口转发:100.101.34.1:8080 → 192.168.0.60:7893"
echo ""
echo "🧪 测试命令(从另一台 Tailscale 设备执行):"
echo "   curl http://100.101.34.1:8080"
上一篇
下一篇