Tailscale OpenClash 配合使用:UDP 中继问题排查
目录
OpenClash + Tailscale + 子网访问
这件事挺折腾的,最终是以不是特别满意的方案暂时搞定了,感觉是还有一些不对劲的地方,还得在研究一下,好在暂时能用
- 保持
FakeIP增强模式 - Tailscale 使用 Direct
- 可以正常访问
192.168.123.0/24 - OpenClash 重启后规则保留
一、现象
开启 OpenClash 后:
tailscale netcheck出现:
UDP: false同时:
- Tailscale 走 DERP Relay
- 子网访问很慢
关闭 OpenClash 后恢复正常。
二、Clash Rules
覆写规则:
rules:
# 本地子网
- IP-CIDR,192.168.123.0/24,DIRECT,no-resolve
# Tailscale CGNAT
- IP-CIDR,100.64.0.0/10,DIRECT,no-resolve
# Tailscale 域名
- DOMAIN-SUFFIX,ts.net,DIRECT
- DOMAIN-SUFFIX,tailscale.com,DIRECT这些规则主要用于:
- TCP 分流
- FakeIP DNS 分流
UDP TPROXY 仍然需要额外处理。
三、自定义防火墙规则
GUI 位置:
覆写设置
→ 自定义防火墙规则对应文件:
/etc/openclash/custom/openclash_custom_firewall_rules.sh- 或者在webUI 中设置

四、脚本内容
替换为:
该规则实效不应该在openclash 链中设置该规则,此时已被内核接管,应当阻止ts流量进入openclash
#!/bin/sh
# tailscale0
iptables -t mangle -I openclash 1 -i tailscale0 -j RETURN
# Tailscale UDP
iptables -t mangle -I openclash 1 -p udp --dport 3478 -j RETURN
iptables -t mangle -I openclash 1 -p udp --dport 41641 -j RETURN
exit 0替换为新规则(系统防墙也可以放一份一样的)
#!/bin/sh
# 清空链内旧放行规则(多写几行不影响)
iptables -t mangle -D openclash -p udp --dport 3478 -j RETURN 2>/dev/null
iptables -t mangle -D openclash -p udp --dport 41641 -j RETURN 2>/dev/null
iptables -t mangle -D openclash -i tailscale0 -j RETURN 2>/dev/null
# PREROUTING 前置绕过OC(插入跳转openclash前)
iptables -t mangle -I PREROUTING 8 -d 100.64.0.0/10 -j RETURN
iptables -t mangle -I PREROUTING 8 -s 100.64.0.0/10 -j RETURN
iptables -t mangle -I PREROUTING 8 -p udp --dport 41641 -j RETURN
iptables -t mangle -I PREROUTING 8 -p udp --sport 41641 -j RETURN
iptables -t mangle -I PREROUTING 8 -p udp --dport 3478 -j RETURN
iptables -t mangle -I PREROUTING 8 -p udp --sport 3478 -j RETURN
# OUTPUT 本机出站绕过OC
iptables -t mangle -I OUTPUT 2 -d 100.64.0.0/10 -j RETURN
iptables -t mangle -I OUTPUT 2 -s 100.64.0.0/10 -j RETURN
iptables -t mangle -I OUTPUT 2 -p udp --dport 41641 -j RETURN
iptables -t mangle -I OUTPUT 2 -p udp --sport 41641 -j RETURN
iptables -t mangle -I OUTPUT 2 -p udp --dport 3478 -j RETURN
iptables -t mangle -I OUTPUT 2 -p udp --sport 3478 -j RETURN五、执行顺序
OpenClash 启动时:
创建 openclash 链
→ 写入 TPROXY
→ 执行 custom_firewall_rules.sh因此:
这里写入的规则会插入到 openclash 链前面。
六、验证
查看规则:
iptables -t mangle -vnL openclash --line-number前几条应类似:
1 RETURN udp dpt:3478
2 RETURN udp dpt:41641
3 RETURN all -- tailscale0
同时在其他设备上:
tailscale status会看到:
# 已截取部分
active; direct 118.11.7.70:41641, tx 6927618 rx 24682300 
