套 Cloudflare Warp 解决IP送中

缘起

网上很多套Cloudflare教程,但是大多数都是在前置作为反向代理,CF的IP如果不挑选,则喜提“减速乐”

我这边的情况是该死的 Google 把我IP送中了,打死不提供 gemini 服务,为了解决锁区问题,本来以为简单用一下 Cloudflare Warp 就行,没想到是个大坑。花了好几天研究。

核心问题是, warp-cli connect 之后就失联了,ssh 都连不上。

warp-cli 网上很多教程都过时了。它命令行改版了。最简单的 warp-cli mode 其实官方教程都不全,它的 warpwarp+ ,改成 tunnel_only 还是不行。寄希望于 proxy 模式,官方博客说 "use the proxy (HTTPS or SOCKS5)",我实际测试,这个默认端口 40000 都是拼凑搜出来的。 然而我打死也没测试成功如何用 HTTP_PROXY 。AI 说只有 win/mac 的桌面版本支持?wtf。

CF一键脚本

没有希望,看下别人怎么解决的,大神给出的解是 一键脚本。

Cloudflare WARP 多功能一键脚本,支持纯IPV4/纯IPV6/双栈V4V6的VPS共9种情况随意切换安装,screen一键手动/自动刷新支持Netflix奈飞的IP(自动识别WGCF与SOCKS5环境,自定义刷新奈飞IP的时间段间隔,自定义奈飞区域国家,自定义仅刷区域国家),支持升级WARP+及Teams账户。

搜到最早的出处应该是 p3terx 的。但是这种一键脚本我都不太敢用,万一写个什么后门之类的你怎么知道。

大概读了下,会执行下面的脚本:

git.io 是个第三方短链服务,可能会看人下菜碟?怕怕

看了半天发现回到原点,核心原理还是proxy然后socks5。或者把 wireguard 配置提取出来自己配路由

有没有什么不用第三方复杂配置,用官方的 warp-cli 但是保留几个tcp端口可用呢?

研究

于是同 ChatGPT、gemini 两位老师向 Linux 网络栈 展开了斗智斗勇。真是苦啊。需要在 warp 生效的时候测试不同的方法,就在那个贼难用的 noVNC html5 based VNC client 里一行一行代码试出来的

得到了以下宝贵教训:

  1. iptables 老早就过时了。现在的 iptables 实际上是 nf-tables 的马甲!吃了大亏!翻来覆去在错误的地方检查,AI也不提醒我一下
  2. ip route 路由也不是全部,其实还有 policy based routing 叫 ip rule

其中 warp-cli 会创建一个叫 cloudflare-warp 的 nft,还有一个叫 CloudflareWARP 的 dev。然后在 ip rule 里会添加一条

32765: not from all fwmark 0x100cf lookup 65743

这里学到几个冷知识:

  1. 前面的 32765 是优先级,越低越优先,命令行里可以写成 priority 32765 或者 pref 32765 一回事
  2. 后面的 65743 是内核里的table,可以在 /etc/iproute2/rt_tables 定义一套alias

耍聪明把INPUT流量标记一个 0x100cf 是不行的。以为是配置问题用 tcpdump 发现甚至只有 SYN 包。后来才知道去折腾 nf-tables。

如何给全局 warp 开一个端口

  1. echo "200 inbound" | sudo tee -a /etc/iproute2/rt_tables 或者这一步不做也行,后面所有的 inbound 都替换成 200 就行
  2. sudo ip route add default dev eth0 scope link table inbound 这个是因为我VPS是on-link的。如果是实体 dev 自己换下
  3. 连接 warp-cli connect 这玩意会在所有自定义 ip rule add 前面加一条策略所以记得先连,再加自己的策略
  4. sudo ip rule add from all sport 6666 lookup inbound pref 500 这里的 500必须比默认的 32765 低。所以要先连上 warp
  5. sudo nft insert rule inet cloudflare-warp input tcp dport 6666 accept 入站 接受
  6. sudo nft insert rule inet cloudflare-warp output tcp sport 6666 accept 出站 接受

因为步骤3 执行之后你ssh就掉了,记得做成一个 .sh 脚本。。。

然后每次断开连接 warp-cli disconnet 之后,记得删除第4步里创建的

sudo ip rule del pref 500

否则的话,该死的 warp-cli connect 会创建一个 pref 499 在你前面卡位!

测试

curl -sk https://www.cloudflare.com/cdn-cgi/trace

折腾结束。这应该是全网第一个不动官方 warp-cli 能开端口的方法。

Comments