用 Cloudflare Warp 彻底解决 Google IP 定位中国的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dndx
V2EX    Google

用 Cloudflare Warp 彻底解决 Googl IP 定位中国的问题

  •  5
     
  •   dndx 2021-09-08 11:19:11 +08:00 26355 次点击
    这是一个创建于 1500 天前的主题,其中的信息可能已经有所发展或是发生改变。

    注:本文只是提供一种思路,不是 step by step 的 guide,建议读者对自己使用的 Linux 发行版的常用网络命令有所了解后做为实际配置时的参考使用。

    本文讨论一种可以让落地机 Google 流量走 CF Warp VPN,而非 Google 流量不走的思路,可以彻底解决 IP 被定位到中国带来的不便。此方法适用于在海外落地机上自动分流 Google 流量。

    原理:通过 Google 提供的 IP 段列表,自动生成指向 Warp 接口的静态路由表,然后用 BIRD 注入到内核中。

    建立 Warp VPN

    通过 https://github.com/ViRb3/wgcf 创建一个 WireGuard 接口配置,假设名为 wg0

    修改 wg0.conf,将自动路由表禁用,因为我们后面要手动添加静态路由。这一步是防止所有流量都走 Warp 的关键:

    [Interface] PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Address = 172.16.0.2/32 Address = fd01:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx/128 Table = off [Peer] PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx AllowedIPs = 0.0.0.0/0 AllowedIPs = ::/0 Endpoint = engage.cloudflareclient.com:2408 

    注意上面添加的 Table = off 选项,此项避免 WireGuard 创建默认路由。

    重要:如果客户端使用的也是三层 VPN,需要开启 wg0 接口的 NAT Masquerade 。对于 ss,V2 这种四层代理应该不需要。请自行 Google 如何开启并且确认重启后也会生效。对于使用 nftables 的用户可以参考:

    https://wiki.nftables.org/wiki-nftables/index.php/Performing_Network_Address_Translation_(NAT)

    安装 BIRD,编辑 /etc/bird/bird.conf,添加:

    protocol static google { include "routes4-google.conf"; } 

    同理,编辑 /etc/bird/bird6.conf,添加:

    protocol static google { include "routes6-google.conf"; } 

    并且开启 birdbird6 自动启动。

    通过以下脚本生成 Google 服务 IPv4 和 IPv6 路由表(如果 WireGuard 接口名字不是 wg0 则相应修改,需要安装 jq):

    #!/bin/bash curl -O https://www.gstatic.com/ipranges/goog.json jq '.prefixes[].ipv4Prefix | select(.!=null)' < goog.json | sed 's/"//g' | sed 's/^/route /g' | sed 's/$/ via "wg0";/g' > /etc/bird/routes4-google.conf jq '.prefixes[].ipv6Prefix | select(.!=null)' < goog.json | sed 's/"//g' | sed 's/^/route /g' | sed 's/$/ via "wg0";/g' > /etc/bird/routes6-google.conf rm goog.json sudo /usr/sbin/birdc configure sudo /usr/sbin/birdc6 configure 

    sudo 执行以上脚本,之后可以用 ip rip -6 r 确认 BIRD 成功的将 Google 的 IP 路由插入 Kernel 。

    可选:创建一个 crontab,每周自动执行一次上面的脚本,更新 Google IP 段和 reload BIRD:

    $ sudo crontab -l @weekly /path/to/update_google.sh 

    效果

    Google IP 走 Warp:

    $ traceroute www.google.com traceroute to www.google.com (172.217.175.4), 30 hops max, 60 byte packets 1 172.16.0.1 (172.16.0.1) 1.291 ms 1.869 ms 1.834 ms 2 * * * 3 103.22.201.37 (103.22.201.37) 2.844 ms 2.845 ms 3.012 ms 4 142.250.160.170 (142.250.160.170) 2.223 ms 2.182 ms 2.147 ms 5 * * * 6 108.170.233.82 (108.170.233.82) 2.347 ms 142.250.226.58 (142.250.226.58) 1.833 ms 108.170.242.129 (108.170.242.129) 2.669 ms 7 108.170.242.112 (108.170.242.112) 2.373 ms 108.170.227.93 (108.170.227.93) 3.287 ms 108.170.242.112 (108.170.242.112) 2.353 ms 8 209.85.246.213 (209.85.246.213) 2.765 ms 209.85.244.35 (209.85.244.35) 3.104 ms 3.079 ms 9 209.85.241.106 (209.85.241.106) 3.112 ms 209.85.244.3 (209.85.244.3) 2.505 ms 209.85.244.63 (209.85.244.63) 2.539 ms 10 108.170.242.161 (108.170.242.161) 1.958 ms nrt20s18-in-f4.1e100.net (172.217.175.4) 1.877 ms 108.170.242.193 (108.170.242.193) 2.867 ms $ traceroute6 www.google.com traceroute to www.google.com (2404:6800:4004:813::2004), 30 hops max, 80 byte packets 1 fd01:5ca1:ab1e::1 (fd01:5ca1:ab1e::1) 1.684 ms 1.652 ms 1.713 ms 2 * * * 3 2400:cb00:22:2::1 (2400:cb00:22:2::1) 3.674 ms 3.647 ms 12.757 ms 4 2001:4860:1:1::1a48 (2001:4860:1:1::1a48) 2.194 ms 2.170 ms 2.136 ms 5 * 2404:6800:802a::1 (2404:6800:802a::1) 1.982 ms 2404:6800:805c::1 (2404:6800:805c::1) 2.058 ms 6 2001:4860:0:1::195e (2001:4860:0:1::195e) 2.977 ms 2001:4860:0:1::20a8 (2001:4860:0:1::20a8) 2.018 ms 2001:4860:0:1::436 (2001:4860:0:1::436) 2.040 ms 7 2001:4860:0:1::13e3 (2001:4860:0:1::13e3) 2.444 ms 2001:4860:0:1000::10 (2001:4860:0:1000::10) 2.847 ms * 8 nrt20s17-in-x04.1e100.net (2404:6800:4004:813::2004) 1.813 ms 1.795 ms 1.912 ms 

    非 Google IP 不走 Warp 直接离开 VPS:

    $ traceroute www.facebook.com traceroute to www.facebook.com (157.240.7.35), 30 hops max, 60 byte packets 1 139.162.65.3 (139.162.65.3) 0.851 ms 139.162.65.2 (139.162.65.2) 0.887 ms 0.943 ms 2 if-0-0-0-0.gw1.shg1.jp.linode.com (139.162.64.18) 0.414 ms if-0-1-5-0.gw2.shg1.jp.linode.com (139.162.64.30) 0.541 ms if-11-0-0-0.gw1.shg1.jp.linode.com (139.162.64.20) 0.513 ms 3 63.218.251.81 (63.218.251.81) 0.837 ms 0.798 ms 0.807 ms ... 

    经过测试,基本上完美解决了 IP 频繁被定位成中国的不便。用了一段时间后稳定性和速度都很满意。

    第 1 条附言    2021-11-08 20:17:53 +08:00
    到现在为止效果坚挺,Warp 的 IP 的确对 Google 自动定位到中国免疫(猜测可能 Google 那边有特殊处理)。
    24 条回复    2022-02-14 17:34:01 +08:00
    guanyin9cn
        1
    guanyin9cn  
       2021-09-08 15:41:14 +08:00
    what is Cloudflare Warp? It like TLS wrap?
    benjix
        2
    benjix  
       2021-09-08 16:17:02 +08:00
    试了下,成功!
    allenforrest
        3
    allenforrest  
       2021-09-08 16:20:34 +08:00
    @guanyin9cn based on WireGuard
    nbweb
        4
    nbweb  
       2021-09-08 17:31:11 +08:00
    我这里 google.com.hk 定位 us,google.com 定位本地。
    0ZXYDDu796nVCFxq
        5
    0ZXYDDu796nVCFxq  
       2021-09-08 21:43:33 +08:00 via Android
    发现 ip r 没有额外的路由记录
    birdc
    show route 是有路由表的
    bird.conf 除了 include route-google.conf 外需要修改其它配置吗
    guanyin9cn
        6
    guanyin9cn  
       2021-09-08 21:59:25 +08:00
    @allenforrest #2
    on centos, bird maybe not work.

    I use ip command to add static route
    `ip route add 185.184.223.213 via 172.16.0.2 dev wg1`

    and test it is work for me.

    ```
    [root@xx-jp ~]# curl -4 ip.nisekoo.com
    8.37.43.11
    Asia/Tokyo
    AS13335/CLOUDFLARENET
    iCloud Private Relay
    「 ABUSE IS STRICTLY PROHIBITED 」

    ```
    guanyin9cn
        7
    guanyin9cn  
       2021-09-08 22:09:37 +08:00   1
    @gstqc #5 我也发现了,centos,bird not work,不知道什么原因,直接用 ip route add 添加,虽然粗鲁了一点,但是好用。
    guanyin9cn
        8
    guanyin9cn  
       2021-09-08 22:14:27 +08:00
    # add
    jq '.prefixes[].ipv4Prefix | select(.!=null)' < goog.json | sed 's/"//g' | sed 's/^/route /g' | sed 's/$/ via 172.16.0.2 dev wg1;/g' | sed 's/route/ip\ route\ add/g' | bash

    # del
    jq '.prefixes[].ipv4Prefix | select(.!=null)' < goog.json | sed 's/"//g' | sed 's/^/route /g' | sed 's/$/ via 172.16.0.2 dev wg1;/g' | sed 's/route/ip\ route\ del/g' | bash
    dndx
        9
    dndx  
    OP
       2021-09-08 23:14:33 +08:00   1
    @gstqc
    @guanyin9cn
    我用的 Debian,默认的 `bird.conf` 就行,不知道是不是 CentOS 的默认配置有问题,看一下:

    `/etc/bird/bird.conf`,确保里面有:

    ```
    protocol kernel {
    scan time 60;
    import none;
    export all;
    }

    protocol device {
    scan time 60;
    }
    ```

    否则不会插入内核转发表中。另外 ps aux | grep bird 确认 BIRD 守护进程跑起来了。


    @guanyin9cn 这个方法也可以,就是更新起来还有重启需要重新添加麻烦点。
    guanyin9cn
        10
    guanyin9cn  
       2021-09-08 23:30:23 +08:00
    @dndx #9 systemctl status bird 显示 failed. 进程没起来,route -n 查看,表中没有变化。没用过 bird,不知道怎么弄。先不管他了。

    我在想,能不能再优化下,googl.json 中 的 ip 。全部 google 请求都走 cloudflare warp,是不是有点粗暴。比如看 yt,会不会影响播放,毕竟是免费的。

    google 是通过哪个域名或 ip 来收集用户的 ip 地址信息的?找到这个 ip,写入路由中,让他走 cloudflare warp.
    slowman
        11
    slowman  
       2021-09-08 23:33:25 +08:00
    在 vps 部署 clash 之类的,把谷歌的流量转发到那些一次付费终生使用的代理服务商,似乎更简单靠谱一点

    依赖 Cloudflare Warp 感觉哪天服务政策改了,到时候又得改
    dndx
        12
    dndx  
    OP
       2021-09-08 23:33:26 +08:00
    @guanyin9cn failed 的话应该是配置文件格式有问题,可以 journalctl 看一下错误日志。

    Warp 基本上是不限速的,上 Gbps 不好说,几百 Mbps 还是很轻松,再加上 Cloudflare 本来跟 Google 就有 peering,基本上延迟跟直连比起来就多 1 、2ms,基本上可以忽略不计。
    guanyin9cn
        13
    guanyin9cn  
       2021-09-08 23:45:17 +08:00   6
    @dndx 用最笨的方法,一个个试,找到了。
    只需要让 172.217.0.0/16 走 Cloudflare warp 。
    这个段是用来收集用户 ip 的 。

    实测只加下面一行,就可以达到效果。
    ip route add 172.217.0.0/16 via 172.16.0.2 dev wg1
    0ZXYDDu796nVCFxq
        14
    0ZXYDDu796nVCFxq  
       2021-09-09 00:00:49 +08:00 via Android
    @dndx 知道原因了
    export all;这行默认是注释掉的,去掉注释就行了
    Ayahuasec
        15
    Ayahuasec  
       2021-09-09 00:28:48 +08:00 via Android
    之前在新加坡服务器上测试过,cf 有的时候会 reroute 到其他地方,比如日本、马来西亚、印度尼西亚之类,这个时候各种服务就开始疯狂地报异常登录
    i8i
        16
    i8i  
       2021-09-09 02:13:29 +08:00
    我没有用 ipv6

    直接修改 wg0.conf,只把 216.58.192.0/19,142.250.0.0/15 走 warp 。这样也是很简单。

    [Interface]
    PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
    Address = 172.16.0.2/32
    DNS = 8.8.8.8,8.8.4.4
    MTU = 1280
    [Peer]
    PublicKey = bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=
    AllowedIPs = 216.58.192.0/19
    AllowedIPs = 142.250.0.0/15
    Endpoint = 162.159.192.1:2408
    xctcc
        17
    xctcc  
       2021-09-09 07:01:16 +08:00 via iPhone
    warp 还可以解锁流媒体
    n1dragon
        18
    n1dragon  
       2021-09-09 07:42:20 +08:00
    可以利用 v2ray 出站协议的 sockopt mark 和 wireguard 的 table 来实现按策略走 WARP,这样可以不限于 IP rule 。
    guanyin9cn
        19
    guanyin9cn  
       2021-09-09 08:27:18 +08:00
    @i8i 貌似更简单些
    mytsing520
        20
    mytsing520  
    PRO
       2021-09-10 13:09:58 +08:00
    engage.cloudflareclient.com 的 IP,国内已空路由
    bao3
        21
    bao3  
       2021-10-07 22:18:58 +08:00
    @gstqc bird.conf "export all" 去掉注释
    noyle
        22
    noyle  
       2021-11-08 16:40:11 +08:00
    抱歉我还没有试过,但有个问题。Cloudflare 说 Warp 会把用户 IP 发给目标站点的,并不会隐藏用户 IP ,只是重新路由并了加密了用户流量,不是传统的 VPN 。这样的话,这种方法真的会有效吗?
    dndx
        23
    dndx  
    OP
       2021-11-08 20:15:27 +08:00
    @noyle CF 只把真实 IP 发给使用 CF CDN 的站点,对于 Google 来说因为 Google 没有用 CF 的 CDN 这个信息他们就算想要也无从得知。
    titanium98118
        24
    titanium98118  
       2022-02-14 17:34:01 +08:00
    参照楼主的方法成功把 google 的 ip 路由到 warp 上了,现在想把中国的 ip 也放进 warp ,
    /etc/bird# cat routes4-cn.conf

    route 117.128.0.0/10 via "wgcf0";
    route 118.0.0.0/11 via "wgcf0";
    route 118.64.0.0/10 via "wgcf0";
    route 118.128.0.0/9 via "wgcf0";
    route 119.0.0.0/9 via "wgcf0";
    route 119.128.0.0/10 via "wgcf0";
    route 119.224.0.0/11 via "wgcf0";
    route 120.0.0.0/10 via "wgcf0";
    .......以下省略

    然后 reload bird 提示 Invalid prefix ,搞不懂这个 conf 哪里出错了?
    protocol static google {
    include "routes4-google.conf";
    }
    protocol static cn {
    include "routes4-cn.conf";
    }

    /etc/bird# birdc configure
    BIRD 1.6.8 ready.
    Reading configuration from /etc/bird/bird.conf
    /etc/bird/routes4-cn.conf:4:18 Invalid prefix
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2312 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 00:02 PVG 08:02 LAX 17:02 JFK 20:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86