Cloudflare Warp Endpoint 连通性测试/自动更换

0、前言

前段时间入手了一台灵到不能再灵的国内机,折后 33.6 一年,1C 1G 1000M(共享),还不需要实名,于是在 跑路 到期前必须得折腾些什么。有什么比 IP:中国 并且能访问 Google/YouTube/X(Twitter)等网站更 Cool 呢?Cloudflare Warp 就能实现。

1、配置 Cloudflare Warp

使用 fscarmen 的脚本:

WGCF
https://gitlab.com/fscarmen/warp

非全局方式启动 Warp,此时使用 WireGuard 连接 Warp,指定网卡为 warp 时流量会通过 Warp。

2、配置 XrayR

难得获得一个免实名国内出口 IP,我希望访问国内网站时都使用自带 NAT 出口,访问国外网站时再使用 Warp。

设置 /etc/XrayR/route.json

json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
  "domainStrategy": "IPOnDemand",
  "rules": [
    {
    "outboundTag": "block",
    "ip": [
      "geoip:private"
    ]
    },
    {
    "outboundTag": "block",
    "protocol": [
      "bittorrent"
    ]
    },
    {
      "type": "field",
      "outboundTag": "direct",
      "domain": [
        "geosite:cn"
      ]
    },
    {
      "type": "field",
      "outboundTag": "direct",
      "ip": [
        "geoip:cn"
      ]
    },
    {
      "type": "field",
      "outboundTag": "warp",
      "network": "tcp,udp"
    }
  ]
}

即:默认走 Warp,国内走直连。

修改 /etc/XrayR/custom_outbound.json

json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[
  {
    "protocol": "freedom",
    "settings": {},
    "tag": "direct"
  },
  {
    "tag": "warp",
    "protocol": "freedom",
    "streamSettings": {
      "sockopt": {
        "interface": "warp"
      }
    }
  },
  {
    "protocol": "blackhole",
    "tag": "block"
  }
]

其实 Xray 的出站就可以添加 WireGuard,例如:

json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[
  {
    "tag": "IPv4_out",
    "protocol": "freedom",
    "settings": {
      "domainStrategy": "UseIPv4v6"
    }
  },
  {
    "tag": "IPv6_out",
    "protocol": "freedom",
    "settings": {
      "domainStrategy": "UseIPv6"
    }
  },
  {
    "protocol": "wireguard",
    "tag": "warp",
    "settings": {
        "secretKey": "2DRzSLT1OBh+mN4fxZc+gu+hfYb8X4a9d0oD5NCb60Q=",
        "address":[
            "172.16.0.2/32",
            "2606:4700:110:8e15:9080:66bd:20e8:c4e7/128"
        ],
        "mtu": 1380,
        "reserved": [45, 85, 21],
        "peers": [
            {
                "publicKey": "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=",
                "endpoint": "engage.cloudflareclient.com:2408",
                "keepAlive": 25
            }
        ]
    }
  },
  {
    "protocol": "blackhole",
    "tag": "block"
  }
]

提示:
上述配置为 XrayR 魔改版提供,为 Cloudflare Zero Trust(Teams),经测试确实可用。目前 Zero Trust 应该是同配置可以跨设备公用,设备数等限制未知。

然而使用 WGCF 脚本可以自动优选 Endpoint,而且后面会提到需要对 WireGuard 配置文件进行修改,如果写入出站配置,修改后需要重启 XrayR 生效,不如直接指定网卡。

3、自动脚本

先选择一个目录,例如 ~/warp,安装必要程序:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
mkdir ~/warp
cd ~/warp

ARCH=$(uname -m)
case "$ARCH" in
    i386 | i686 ) ARCH='386' ;;
    x86_64 | amd64 ) ARCH='amd64' ;;
    armv8 | arm64 | aarch64 ) ARCH='arm64' ;;
    s390x ) ARCH='s390x' ;;
    * ) echo "不支持的CPU架构!" && exit 1 ;;
esac

wget https://gitlab.com/Misaka-blog/warp-script/-/raw/main/files/warp-yxip/warp-linux-$ARCH -O warp-test

然后新建脚本,例如 ~/warp/monitor.sh,写入:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/bash

# Step 1: curl with 10 seconds timeout
curl --interface warp --max-time 10 https://www.cloudflare.com/cdn-cgi/trace > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "Connection success"
    exit 0
fi
echo "Connection failed"

# Step 2: If curl times out, clear result.csv and run warp-test
> ./result.csv
./warp-test

# Step 3: Check if result.csv has content
if [ ! -s ./result.csv ]; then
    echo "Warp IPv4 test failed"
    ./warp-test -ipv6
fi
if [ ! -s ./result.csv ]; then
    echo "Warp IPv6 test failed"
    exit 1
fi
echo "Warp IPv4/v6 test success"

# Step 4: Extract the second line's IP:PORT
endpoint=$(awk -F, 'NR==2 {print $1}' ./result.csv)

# Step 5: Replace Endpoint in /etc/wireguard/warp.conf
sed -i "s|^Endpoint = .*|Endpoint = $endpoint|" /etc/wireguard/warp.conf

# Step 6: Restart WireGuard
wg-quick down warp && wg-quick up warp
if [ $? -eq 0 ]; then
    echo "Warp restart success"
else
    echo "Warp restart failed"
fi

说明:

  1. 先测试能不能连接 Warp;
  2. 如果不能连接,开始测试 IPv4 Endpoint 连通性;
  3. 如果无可用 IPv4 Endpoint,开始测试 IPv6 Endpoint 连通性;
  4. 如果无可用 Endpoint,退出(事实上 zzy 的 Endpoint 测试脚本并不准确,但是我没有找到二进制代码对应的源码,无法修改);
  5. 如果有可用 Endpoint,替换 Warp 配置文件,重启接口。

把上述脚本添加到 Crontab 定时运行,我设置的是十分钟一次,当刷不出可用 Endpoint 时可能需要多尝试几次。

4、效果

可能因为 UDP 受干扰,在一轮测试中显示有可用 IP,并且后续实测这些 IP 也能连上,再次测试可能就无输出了。

使用该脚本运行 24h,其间断连 1 次,很快被脚本检测到,经过数次刷 IP(出现一两次测出来可用的 IP 实际上无法连接)后成功重连。

流媒体监控见:

流媒体解锁状态监控
https://monitor.tsinbei.com

第一栏 CN 的 CN-77 便是这一台的流媒体监控。Youtube 速度可以跑满本地的百兆,Google 搜索会自动重定向到 google.cn/m,需要手动访问一次 google.com/ncr,即可访问美区英文版(Why?)的 Google 首页。

Cloudflare Warp Endpoint 连通性测试/自动更换

https://blog.tsinbei.com/archives/1875/

文章作者
Hsukqi Lee
发布于

2024-12-16

修改于

2024-12-16

许可协议

CC BY-NC-ND 4.0

评论

昵称
邮箱
网址
暂无