目录

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 中设置 /images/tailscale-openclash/1.png

四、脚本内容

替换为:

  • 该规则实效不应该在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

/images/tailscale-openclash/3.png

五、执行顺序

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

/images/tailscale-openclash/2.png

同时在其他设备上:

tailscale status

会看到:

# 已截取部分
active; direct 118.11.7.70:41641, tx 6927618 rx 24682300