说明
AI 给的设置建议
linux 下 tailscale 到 clash 有兼容问题,所以该功能会有问题
因为里面讲了一下原理,先记录一下,有空时再查证及解决兼容问题
流程总结
要管理 tailscale0 虚拟网卡,需先在 LuCI 中创建一个关联它的接口(如 tailscale_if),将其加入自定义安全区域(如 vpn),然后配置 DNAT 规则将公网访问指向内网目标,并允许 vpn 区域向目标区域(如 lan)转发流量。
操作流程
-
在 LuCI 中创建一个“接口”(如
tailscale_if
),绑定到tailscale
的虚拟网卡tailscale0
,协议选Unmanaged
- 这只是在系统层面识别这个虚拟网卡,告诉 LuCI:“这是个网络接口”。
- 协议选 Unmanaged 表示不分配 IP、不运行 DHCP 等,仅用于桥接/转发/防火墙用途。
- ✅ 这一步不涉及防火墙策略,只是准备接口。
-
将这个接口加入防火墙的某个“区域”(如新建 vpn 区域 或 加入 wan), 新建区域的话好管理一些,
wan
区域可能会有多个接口,容易混乱- 你创建了一个逻辑“安全区域”,比如叫 vpn,并把 tailscale0 加入。
- 区域可以设置入站(Input)、出站(Output)、转发(Forward)的默认策略(通常是 REJECT 或 DROP)。
- ✅ 这一步定义了“从这个接口进来的流量属于 vpn 区域”,但还没说它能去哪。
-
设置端口转发规则(如 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 只负责“改地址”,不负责“放行”。
-
设置区域间转发(如允许从 vpn 访问 lan)
- 这一步就是在防火墙中添加一条 FORWARD 规则:
from vpn → to lan : accept
- 在 LuCI 中操作路径通常是:
网络 → 防火墙 → 流量规则 → “允许转发到目的地区域” 或 “区域设置” → 编辑 vpn 区域 → “允许转发到” → 勾选 lan
- ✅ 这才是真正放行流量的关键步骤!
- 这一步就是在防火墙中添加一条 FORWARD 规则:
图示
[ 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"