XIU2/CloudflareSpeedTest

自动更新 Hosts 为最快 IP(Windows/Linux 脚本)

XIU2 opened this issue · 51 comments

XIU2 commented

因为每个域名解析网站的 API 都不同,而这些域名解析网站需要我托管的有域名才能写 API 相关教程/脚本,所以想了一种替代方案,可以把域名写在 Hosts,这样效果也一样,不过缺点就是只能在当前设备上体验最快的 IP。

如果用的是基于 Linux 系统的路由器(如 OpenWrt),则这个整个局域网都有效。

再考虑到很多人获得最快 Cloudflare CDN IP 后,需要替换 Hosts 文件中的 IP。

那我干脆写个简单的脚本吧!大家使用过程中遇到什么问题或者建议都可以告诉我。 如果用着不错,就点个 ⭐ 吧!


还在一个个添加 Hosts?完美本地加速所有使用 Cloudflare CDN 的网站方法来了!


  1. Windows 脚本
  2. Linux 脚本
  3. 定时任务
XIU2 commented

# Windows 脚本

首先下载批处理脚本:... 已内置压缩包中。

然后将其放到 CloudflareST 测速程序所在目录下,双击运行脚本,脚本会申请管理员权限,因此如果你没有关闭 UAC,就会看到用户账户控制提示,选择 [是] 继续。

如果想要在开启 UAC 的情况下不提示 UAC ,可以用我写的开源 UAC 白名单小工具 来解决(依然有管理员权限)。

「 点击查看 [不显示 CMD 黑窗口方式运行 bat 脚本方法] 」

考虑到有些人不想看到 CDM 的黑窗口,可以简单改为默认最小化运行 bat 脚本(只显示在任务栏)。

在 bat 文件头部 @echo off 下一行插入:if not "%~1"=="p" start /min cmd.exe /c %0 p&exit 保存即可。

插入代码后效果如下所示:

@echo off
if not "%~1"=="p" start /min cmd.exe /c %0 p&exit
Setlocal Enabledelayedexpansion
...

首次运行,脚本会提示以下内容:

该脚本的作用为 CloudflareST 测速后获取最快 IP 并替换 Hosts 中的所有 Cloudflare CDN IP。

第一次使用,请先将 Hosts 中所有 Cloudflare CDN IP 统一改为一个 IP。
输入该 Cloudflare CDN IP 并回车(后续不再需要该步骤):

因为脚本替换 IP 时需要先知道被替换的 IP 是什么才行,所以你需要先去 C:\Windows\System32\drivers\etc\hosts 文件中将里面所有 Cloudflare CDN IP 都给改为一个 IP(例如 1.1.1.1,然后再脚本提示中输入该 IP 回车即可,如果 Hosts 文件中以前没有加过 Cloudflare CDN 的 IP,那么你另起一行手动加上个,例如:1.1.1.1 cloudflare.com)。

然后在脚本中输入该 IP,按下回车键继续(IP 会存储在 nowip.txt 文件,以便下次脚本知道要替换哪个 IP)。


随后脚本就会开始测速、备份 Hosts 文件、替换 IP 等操作,提示内容大概如下:

开始测速...
# XIU2/CloudflareSpeedTest vX.X.X

开始延迟测速(模式:TCP IPv4,端口:443):
27936 / 27936 [-------------------------------------------------------------------------------------------------] 100.00%
...

旧 IP 为 X.X.X.X
新 IP 为 Y.Y.Y.Y

开始备份 Hosts 文件(hosts_backup)...
已复制         1 个文件。

开始替换...
完成...

请按任意键继续. . .

## 其他说明

  • 以上脚本只是一个示例,大家可以按需修改,比如在脚本代码中 CloudflareST.exe 后面添加其他参数
  • 每次替换前都会备份 hosts 文件到 hosts_backup 文件。
  • 如果你需要开机自动运行该脚本,只需要右键脚本 - 创建快捷方式,然后将快捷方式移动到 C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 目录下即可。
  • 如果你用了我的 UAC 白名单小工具 生成了免 UAC 的启动快捷方式,那就复制该快捷方式到开机启动目录下即可。

我对 Windows 的批处理脚本并不熟悉,如果有什么问题或者更好的建议,请务必告诉我!

XIU2 commented

# Linux 脚本

注意,修改 Hosts 需要 root(管理员)用户权限,因此如果你当前不是 root 用户,请使用 sudo su 切换。

请先进入 CloudflareST 目录下,再去下载脚本 已内置压缩包中(并赋予执行权限):

# 因为脚本已经内置到压缩包中了,所以不再需要下载步骤了,直接执行下面的赋予执行权限命令就行了。
chmod +x cfst_hosts.sh

运行脚本:

bash cfst_hosts.sh

首次运行时,脚本会提示以下内容:

该脚本的作用为 CloudflareST 测速后获取最快 IP 并替换 Hosts 中的 Cloudflare CDN IP。

第一次使用,请先将 Hosts 中所有 Cloudflare CDN IP 统一改为一个 IP。
输入该 Cloudflare CDN IP 并回车(后续不再需要该步骤):

即你需要先去 /etc/hosts 文件中将所有 Cloudflare CDN IP 统一改为一个 IP

然后在脚本中输入该 IP,按下回车键继续(IP 会存储在 nowip.txt 文件,以便下次脚本知道替换哪个 IP)。


随后脚本就会开始测速、备份 Hosts 文件、替换 IP 等操作,提示内容大概如下:

开始测速...
# XIU2/CloudflareSpeedTest vX.X.X

开始延迟测速(模式:TCP IPv4,端口:443):
27936 / 27936 [-------------------------------------------------------------------------------------------------] 100.00%
...
完整测速结果已写入 result.csv 文件,请使用记事本/表格软件查看。

旧 IP 为 X.X.X.X
新 IP 为 Y.Y.Y.Y

开始备份 Hosts 文件(hosts_backup)...
已复制         1 个文件。

开始替换...
完成...

## 其他说明

  • 以上脚本只是一个示例,大家可以按需修改,比如在脚本代码中 ./CloudflareST 后面添加其他参数
  • 每次替换前都会备份 hosts 文件到 hosts_backup 文件。
  • 如果是在路由器上面跑该脚本(如 OpenWrt),请先关闭路由器内的代理,否则测速结果会不准确。

如果有什么问题或者更好的建议,请务必告诉我!

XIU2 commented

# 定时任务

## Linux 系统

Linux 自然要用 Cron 来定时执行脚本。

### 安装 Cron

一般各 Linux 系统都自带了 Cron,执行 crontab -l 命令,如果提示命令不存在,说明没有安装,反之则跳过该步骤

# 确认你是哪个系统,然后选择对应的命令安装 Cron 程序。

# CentOS 系统:
yum install vixie-cron
yum install crontabs

# Debian/Ubuntu 系统:
apt-get install cron

### 配置 Cron

开始编辑定时任务,

crontab -e

首次使用可能会提示你如下内容:

# 这就是让你选一个文本编辑器,新手建议用默认的 nano,直接回车即可。

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny
  4. /bin/ed

然后就会看到一大片的文本,不用管,那些只是注释(井号 # 开头的都是注释),写的是使用方法。

  • 如果你选的是 nano 编辑器,那么可以直接开始编辑了。
  • 如果你选的是 vim 编辑器,则需要按下 I 键 进入编辑模式。

定时任务格式其实很简单:

*    *   *    *   * cd /xxx && ./cfst_hosts.sh
-    -   -   -   -
|    |    |    |    |
|    |    |    |    +----- 星期中星期几 (0 - 7) (星期天 为0)
|    |    |    +---------- 月份 (1 - 12) 
|    |    +--------------- 一个月中的第几天 (1 - 31)
|    +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59) 

还是看不懂?没关系,我直接给你几个示例(脚本下载):

# 假设脚本位于 /root/CloudflareST 目录下(其他位置自己改下面示例),那么:

# 每天凌晨 5 点 0 分,执行一次脚本
0 5 * * * cd /root/CloudflareST && ./cfst_hosts.sh

# 每天凌晨 5 点 30 分,执行一次脚本
30 5 * * * cd /root/CloudflareST && ./cfst_hosts.sh

# 每 6 个小时(0 分时),执行一次脚本
0 */6 * * * cd /root/CloudflareST && ./cfst_hosts.sh

# 每小时 0 分,执行一次脚本
0 * * * * cd /root/CloudflareST && ./cfst_hosts.sh

写入后,保存定时任务:

  • nano:按下 Ctrl+X 键、按下 Y 键、按下回车键,即可保存。
  • vim:按下 Esc 键退出编辑模式,直接输入 :wq 并回车(英文模式下),即可保存。

这时候再去查看定时任务,看看是否保存成功:

crontab -l

# Windows 脚本

你好,请问这个脚本测速是直连的情况下吧?比如我已经 用客户端上网后再运行该脚本,是不是会不准?据说直连的情况下最准,可不可以把它改成在服务器上测速,这样肯定是直连,比较准

XIU2 commented

@mongoliabao555

不是很明白你具体指的是什么?你说的客户端是什么?
另外,你不需要回复引用上面全部内容,这样会显得回答很长。。。不方便别人观看参考(我给你精简了一下)。

XIU2 commented

@mongoliabao555

如果要测试结果准确,必须在你的当前网络下进行测速(不管是在电脑还是路由器中运行)。
测速前要确保,CloudflareST 不会经过代理、VPN 网络,否则只能测速出代理服务器链接 CDN 的最快 IP。

你要得到的是你链接速度最快的 IP,而不是服务器链接速度最快的 IP。


一般而言,除非你是在路由器上配置了代理账号,否则代理软件是不会影响 CloudflareST 测速结果的。
至于 VPN,则根据路由表可能会影响 CloudflareST 测速结果,建议测速前关闭 VPN

XIU2 commented

@huanx9

默认不写入 Hosts ?
那你看这个 Issues 就行了。

XIU2 commented

@mongoliabao555

我没用过 winxray,所以并不清楚,因此也不会去专门适配这些软件(或者说这不应该我来做)。


“把新的IP与以往的速度做个比较”

这个只要把新 IP 和旧 IP 单独写到一个文本文件 1.txt 中,例如:

1.1.1.1/32
1.0.0.1/32

然后再运行 CloudflareST 并加上 -f 1.txt 启动参数,测速结果中排在前面的就是更快的 IP。

IP 后面的 /32 是子网掩码,指的就是这个 IP 自身,因为软件目前只能读入 IP 段(带子网掩码)。

因为每次测速都是随机的 IP,所以每次测速结果也不可能一样,因此今天测速结果中最快的 IP 不一定比昨天的更好
不过我也实测过,新旧两个 IP 测速对比,因为网络等各种因素影响,测速结果顺序也不是固定的


另外,虽然现在很多人拿 CloudflareST 来选择代理速度最快的 IP,但是我写这个软件的初衷只是简单的为了访问使用 Cloudflare CDN 的网站速度更快,自己改 Hosts 用的,只是后来用的人多了,我才发现大家的新用法。

因此,我不会去保证 CloudflareST 测速出来的 IP 用作代理会更快、看油管会更快。

exe文件运行后能否静默运行,不会弹出cmd窗口?

XIU2 commented

@leozhangpd

我记得我写 bat 脚本的时候,查过能不能隐藏 CMD 窗口,但是似乎很麻烦,就没继续研究了...

批处理 bat 自身是无法实现的,似乎是需要依赖 vbs 脚本,而且始终会有黑窗口一闪而过...


至于直接运行程序自身,也只能用以上方法,因为 CloudflareST 是个控制台程序,因此无法自己隐藏自己,程序无法控制。

XIU2 commented

@leozhangpd

但是有个方法可以默认最小化运行 bat 脚本(只显示在任务栏)。

在 bat 文件头部 @echo off 下一行插入:if not "%~1"=="p" start /min cmd.exe /c %0 p&exit 保存即可。

插入代码后效果如下所示:

@echo off
if not "%~1"=="p" start /min cmd.exe /c %0 p&exit
Setlocal Enabledelayedexpansion
...

软路由openwrt里提示env: can't execute 'bash': No such file or directory

XIU2 commented

@ljm1447669873

查了下,这是因为你的 openwrt 系统中没有 Bash 这个 Shell 解释器。

@ljm1447669873

查了下,这是因为你的 openwrt 系统中没有 Bash 这个 Shell 解释器。

确实,opkg update && opkg install bash即可,忘记update了,还以为装不了

XIU2 commented

@mongoliabao555

他那个是 openwrt 系统下缺少 Bash 时用的命令。

你的 CentOS 7 系统肯定不会缺少 Bash 的,所以不需要执行那个人用的命令。

大神您好。先膜拜撒花~~
小白请教一下,比如,v2ray+ws+cdn的情况,如果手动搜索出一个CF的IP,可以填写到地址中去,伪装域名填写自己的域名。那么,配合此工具,用法是否是将“IP 自己的域名”写到hosts,v2ray客户端地址填自己的域名即可?
感谢解惑。

XIU2 commented

@denniszzg

是的,软件上填写你的域名,Hosts 文件中把你的域名指向某个 Cloudflare CDN IP。
这样的话,软件在连接你的域名时,就会被强制解析为你指定的 Cloudflare CDN IP。

@XIU2

感谢解答。明白了。

另外,还有个疑惑,在 #66 这个帖子里,您分享了查看当前网站IP归属地的功能,我访问我的网站域名,解析出来的并不是我hosts里指向的IP,(ping域名返回的ip是正确的),那么,那个查看ip归属地功能返回的ip到底是什么呢?

XIU2 commented

@denniszzg

这是正常的,因为你只是在电脑上 Hosts 文件中指向了自定义 IP,因此只有在你电脑上访问该域名才会被强制解析为自定义 IP。
那个帖子里写的方法,本质就是调用一个查 IP 的 API,而这个 API 是位于别人服务器上的,所以它们解析出来的都是默认的 IP。

修改 Hosts 文件的影响范围只有你的电脑,除你电脑外的设备去访问/解析该域名,得到的都是默认的 IP。

@XIU2 非常感谢。跟着大佬学知识了。尤其感谢您认真仔细的回复。赠人玫瑰,手有余香。

感谢大佬,好久不来,出了这个超级工具。
补充,根据host域名进行写入win下的 批处理
比如:更新 best.ip.xray 的ip为最快的ip,然后再命令行启动xray工具

CD /d "C:\Windows\System32\drivers\etc"
echo.

echo 备份删除原有hosts记录
findstr /v "best.ip.xray" hosts>>hosts.bak
del hosts
ren hosts.bak hosts

echo 写入记录
@echo %bestip%  best.ip.xray>>hosts
echo 完成...
echo.
echo 开始运行xray代理 socks:127.0.0.1:2080 http:127.0.0.1:2081
 %~dp0\xray.exe -c  %~dp0\best.ip.xray.json

另外,批处理下如何更新CloudflareST.exe 和xray的二进制文件?

XIU2 commented

@lost1984 我对批处理(bat/cmd)也不熟,我更擅长 Linux Shell 脚本,当然原理都是一样的。

把当前软件版本写入一个文件,检查更新时就要去获取最新版本并对比,如果一致说明不需要更新,如果不一致说明需要更新,然后把最新版本号写入文件供下次对比,下载最新版本,解压、运行。

不过 Windows 下的批处理如果想要下载文件,还需要额外安装命令行工具,例如 curl 。

使用方法里有句话是这样的 “即你需要先去 C:\Windows\System32\drivers\etc\hosts 文件中将所有 Cloudflare CDN IP 统一改为一个 IP。” 问题是我的hosts文件里并没有Cloudflare CDN IP怎么办,不知道怎么改了 @XIU2

XIU2 commented

使用方法里有句话是这样的 “即你需要先去 C:\Windows\System32\drivers\etc\hosts 文件中将所有 Cloudflare CDN IP 统一改为一个 IP。” 问题是我的hosts文件里并没有Cloudflare CDN IP怎么办,不知道怎么改了 @XIU2

@mrbin233 Hosts 文件里没有 Cloudflare CDN IP 的话,你用这个脚本干嘛?。。。
这个脚本是用来在测速后修改 Hosts 文件中的 Cloudflare CDN IP 的。

大佬,我的在自动替换host成功了。关于定时我想问下,因为我的openwrt上代理一直是打开的,定时运行的时候,代理也没法关掉,这个怎么半呀。有什么办法让测速的时候,IP不走代理吗

XIU2 commented

@uminoai
因为我没有 openwrt 设备,所以对你这种情况不熟悉,不过 openwrt 依然是基于 Linux 的,你可以理解为轻量化的 Linux 系统,所以你在 openwrt 管理面板上开启/关闭代理实际上就是执行了某条命令,你需要去找到这条命令是什么,然后在定时脚本中加上这两条命令即可(测速前关闭,测速后开启)。

# OpenWrt 下 PassWall 替换脚本

小白一个,OpenWrt 我用的 PassWall 刚才自己试了下修改可以替换。
先在 OpenWrt - 网络 - dhch/dns - 自定义挟持域名,添加对应的域名 IP 或者自定义 hosts 位置。
然后修改 cfst_hosts.sh 脚本(在脚本末尾添加几行代码即可)。

#!/usr/bin/env bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

#	项目: CloudflareSpeedTest 自动更新 Hosts
#	版本: 1.0.0
#	作者: XIU2
#	项目: https://github.com/XIU2/CloudflareSpeedTest

_CHECK() {
	while true
		do
		if [[ ! -e "nowip.txt" ]]; then
			echo -e "该脚本的作用为 CloudflareST 测速后获取最快 IP 并替换 Hosts 中的 Cloudflare CDN IP。\n使用前请先阅读:https://github.com/XIU2/CloudflareSpeedTest/issues/42#issuecomment-768273848"
			echo -e "第一次使用,请先将 Hosts 中所有 Cloudflare CDN IP 统一改为一个 IP。"
			read -e -p "输入该 Cloudflare CDN IP 并回车(后续不再需要该步骤):" NOWIP
			if [[ ! -z "${NOWIP}" ]]; then
				echo ${NOWIP} nowip.txt
				break
			else
				echo "该 IP 不能是空!"
			fi
		else
			break
		fi
	done
}

_UPDATE() {
	echo -e "开始测速..."
	NOWIP=$(head -1 nowip.txt)
	./CloudflareST
	BESTIP=$(sed -n "2,1p" result.csv | awk -F, '{print $1}')
	echo ${BESTIP} nowip.txt
	echo -e "\n旧 IP 为 ${NOWIP}\n新 IP 为 ${BESTIP}\n"

	echo "开始备份 Hosts 文件(hosts_backup)..."
	\cp -f /etc/config/dhcp /etc/config/dhcp_backup # 修改hosts的位置 这里就是dhcp/dns对应的劫持位置 也可以修改为自定义的hosts位置

	echo -e "开始替换..."
	sed -i 's/'${NOWIP}'/'${BESTIP}'/g' /etc/config/dhcp # 修改为对应的hosts位置
	echo -e "完成..."
}
/etc/init.d/passwall stop # 停止代理软件 ,password 可以替换成其他代理软件名字
_CHECK
_UPDATE
/etc/init.d/passwall start # 启动代理软件
#/etc/init.d/dnsmasq restart # 开启 passwall 后自动会重启 dnsmasq,如果运行完该脚本后 ping 对应域名不是刚刚替换的 IP 的话,可能需要再额外重启 dnsmasq 一下,去掉本行开头的井号 # 即可 

2021-08-07_15-18-41

XIU2 commented

@avijxiong 看你排版比较乱,替你优化了下。
另外那个停止代理软件的命令,不需要放那么靠前,只需要放到 _CHECK 前面就行了。

感谢作者,知乎过来的,我有一个疑问,我们想要访问亚马逊的最快网址写入host我现在一直用的boce.com这个网站测速,把最快的手动写入hosts,现在这个脚本需要怎么修改才能。

XIU2 commented

@lp380490944
亚马逊的服务器或 CDN 并不都是 Anycast IP,因此并不能像 Cloudflare 一样所有 CDN IP 通用。
所以不能直接找所有的亚马逊 CDN IP,只能找相应域名下所有解析的 IP(可以用这个网站获得,记得去重复),并将这些 IP 写入到 1.txt (名字随便,和 CloudflareST.exe 放在一个文件夹下), 然后修改该脚本大概中间位置的一行代码:

:: 这里可以自己添加、修改 CloudflareST 的运行参数,echo.| 的作用是自动回车退出程序(不再需要加上 -p 0 参数了)
echo.|CloudflareST.exe

在上面这行代码后面加上一个参数,如下:
echo.|CloudflareST.exe -f 1.txt

这样运行 cfst_hosts.bat 脚本时,就会针对这些 IP 进行测速并修改 Hosts 了(当然你依然需要去指定一下 Hosts 文件中最初的 IP,以使脚本去替换,第一次运行前删除 nowip.txt 文件,来使脚本询问你)。


我平时除了用这个工具测速 Cloudflare CDN 外,也会有和你类似的需求,在访问一些海外网站速度慢的时候,我就会去搜集下这个网站的所有 IP,然后用我这个工具去测速获得 TCPing 延迟最低最稳定的那个 IP 并写入 Hosts 中。
不过这种情况,一般都是临时测一下就够了,毕竟网站 IP 很少会天天变~


如果你实在不知道怎么做的话,我可以远程协助,需要的话下载这个被控端(单文件用完即删),并告诉我设备代码+临时密码:https://dl.todesk.com/windows/ToDesk_Lite.exe

@lp380490944
亚马逊的服务器或 CDN 并不都是 Anycast IP,因此并不能像 Cloudflare 一样所有 CDN IP 通用。
所以不能直接找所有的亚马逊 CDN IP,只能找相应域名下所有解析的 IP(可以用这个网站获得,记得去重复),并将这些 IP 写入到 1.txt (名字随便,和 CloudflareST.exe 放在一个文件夹下), 然后修改该脚本大概中间位置的一行代码:

:: 这里可以自己添加、修改 CloudflareST 的运行参数,echo.| 的作用是自动回车退出程序(不再需要加上 -p 0 参数了)
echo.|CloudflareST.exe

在上面这行代码后面加上一个参数,如下:
echo.|CloudflareST.exe -f 1.txt

这样运行 cfst_hosts.bat 脚本时,就会针对这些 IP 进行测速并修改 Hosts 了(当然你依然需要去指定一下 Hosts 文件中最初的 IP,以使脚本去替换,第一次运行前删除 nowip.txt 文件,来使脚本询问你)。

我平时除了用这个工具测速 Cloudflare CDN 外,也会有和你类似的需求,在访问一些海外网站速度慢的时候,我就会去搜集下这个网站的所有 IP,然后用我这个工具去测速获得 TCPing 延迟最低最稳定的那个 IP 并写入 Hosts 中。
不过这种情况,一般都是临时测一下就够了,毕竟网站 IP 很少会天天变~

如果你实在不知道怎么做的话,我可以远程协助,需要的话下载这个被控端(单文件用完即删),并告诉我设备代码+临时密码:https://dl.todesk.com/windows/ToDesk_Lite.exe

太感谢了,感谢无私分享,耐心细致,我先自己弄,实在弄不好,再向您请教。再次感谢~!

共享一个脚本,自动切换为可用的ip,可以定时执行,需要把xxx.com换成自己hosts里面实际有的一个域名,重启xxx换成自己的命令如systemctl,我是Alpine。

脚本大概意思是,检查对应域名连接是否可用,不可用就把当前ip写到黑名单,从result.csv取一个可用的替换掉。

#!/bin/sh

wget -T 2 -O /dev/null www.google.com > /dev/null 2>&1
if [ $? -eq 0 ];then
    echo "connect ok"
    exit 0
fi

echo 'connect bad, need change ip'
bad=`cat /etc/hosts|grep xxx.com|awk '{print $1}'`
echo "bad ip: $bad"

grep $bad bad.txt > /dev/null 2>&1
if [ $? -ne 0 ];then
    echo "write $bad to bad.txt"
    echo $bad >> bad.txt
fi

for new in `cat result.csv |awk -F ',' 'NR>1{print $1}'`;do
    grep $new bad.txt > /dev/null 2>&1
    if [ $? -eq 0 ];then
        sed -i "/^$new/d" result.csv
    else
        echo "new ip: $new"
        echo "change hosts ip"
        sed -i "s/$bad/$new/" /etc/hosts
        echo "restart xxx"
        rc-service xxx restart
        break
    fi
done

# Linux 脚本

注意,修改 Hosts 需要 root(管理员)用户权限,因此如果你当前不是 root 用户,请使用 sudo su 切换。

请先进入 CloudflareST 目录下,再去下载脚本 已内置压缩包中(并赋予执行权限):

wget -N https://shell.xiu2.xyz/cfst_hosts.sh
# 因为脚本已经内置到压缩包中了,所以不再需要上面的下载步骤了,直接执行下面的赋予执行权限命令就行了。
chomd +x cfst_hosts.sh

运行脚本:

bash cfst_hosts.sh

首次运行时,脚本会提示以下内容:

该脚本的作用为 CloudflareST 测速后获取最快 IP 并替换 Hosts 中的 Cloudflare CDN IP。

第一次使用,请先将 Hosts 中所有 Cloudflare CDN IP 统一改为一个 IP。
输入该 Cloudflare CDN IP 并回车(后续不再需要该步骤):

即你需要先去 /etc/hosts 文件中将所有 Cloudflare CDN IP 统一改为一个 IP

然后在脚本中输入该 IP,按下回车键继续(IP 会存储在 nowip.txt 文件,以便下次脚本知道替换哪个 IP)。

随后脚本就会开始测速、备份 Hosts 文件、替换 IP 等操作,提示内容大概如下:

开始测速...
# XIU2/CloudflareSpeedTest vX.X.X

开始延迟测速(模式:TCP IPv4,端口:443):
27936 / 27936 [-------------------------------------------------------------------------------------------------] 100.00%
...
完整测速结果已写入 result.csv 文件,请使用记事本/表格软件查看。

旧 IP 为 X.X.X.X
新 IP 为 Y.Y.Y.Y

开始备份 Hosts 文件(hosts_backup)...
已复制         1 个文件。

开始替换...
完成...

## 其他说明

  • 以上脚本只是一个示例,大家可以按需修改,比如在脚本代码中 ./CloudflareST 后面添加其他参数
  • 每次替换前都会备份 hosts 文件到 hosts_backup 文件。
  • 如果是在路由器上面跑该脚本(如 OpenWrt),请先关闭路由器内的代理,否则测速结果会不准确。

如果有什么问题或者更好的建议,请务必告诉我!

错别字:

chomd +x cfst_hosts.sh
chmod

大佬,cfst_hosts.sh 这个脚本能不能在开头写入一个判断?查询本机当前使用中的代理服务(v2ray xray或Trojan),如果有就先关闭服务,等测试跑完hosts修改完成后,再重启相对应的服务。这样代理客户端挂载linux服务器上的用户就不用自己先关闭代理再跑测试了。

XIU2 commented

@neilt2016 你自己在开头和结尾处加上停止、启动命令不就行啦。
脚本不是万能的,那么多代理软件我怎么可能判断的过来,而且大家的安装方式、文件名都不是统一的,难以实现通用。

我这个脚本相当于一个示例模板,大家可以在此基础上修改、扩展、完善等等。
我不可能把所有情况都考虑进去,那就太复杂了。

就像我这个项目 CloudflareST 一样,只需要实现最基本、最核心的测速功能,然后大家完全可以自己发挥,根据自己的需求让 CloudflareST 与各种软件、脚本对接/搭配使用(就像我写的这几个脚本一样)。
而我不需要把大家的所有需求都塞在软件里,把软件搞得复杂又臃肿,那样不就活成大家讨厌的样子了吗(就像 微信、QQ 这类不停添加各种功能的臃肿软件,巴不得写一个系统塞进去)。

@XIU2 那也是,是我想的太简单,我这边加进去然后功能实现了,最后,感谢您的辛勤付出

请教一下大佬,我还没理解修改hosts里面的IP是怎么让访问速度提升的。 比如说,访问自己的远程服务器,其域名为myserver.com,实际IP为123.124.125.126。如果hosts文件中没有定义,那么windows是会去询问DNS服务器的,DNS服务器上存在231.232.233.234与myserver.com的映射关系,那么能找到myserver.com,这个就是通常的访问方式。如果hosts里面做出了定义,那么Windows会首先去看hosts文件,发现文件里面把myserver.com的IP设定为CF给出的231.232.233.234,也就是用您的工具找出来的最快的IP,那么windows就直接连接这个IP。但是问题是,这个IP应该是个公共服务的节点,也许有很多域名都是通过这个IP加速。那么,通过hosts直接访问IP的怎么能对应到自己的域名?除非说,尽管通过IP直接连接,windows发出的访问请求中的发射包仍然存在域名信息,那么CF的这个节点接收到了这个对域名的请求,从而能把请求对应到123.124.125.126。

XIU2 commented

@potus2030
Cloudflare CDN 的 IP 虽然是 Anycast 的,但每个 IP 都存在差异(即实际位置是动态的,经常会变,因此延迟和速度有差异)。
你访问套 Cloudflare CDN 的网站,其默认分配的 IP 可能并不是最快的(相对你来说)。

用户 <=> Cloudflare Anycast IP <=> 网站

自选一个最快的 IP 实际上就是加速第一个环节(即用户 <=> Cloudflare Anycast IP 之间的速度)

另外,科普一个知识:
你浏览器在打开一个网页的时候,SSL 握手时会先发送明文的 SNI 信息(即域名信息),Cloudflare CDN 通过这个来判断你实际访问的是哪个域名,蔷也是依靠这个来实现 SNI 阻断(即指向正确 IP 依然无法访问)。

XIU2 commented

@soxft 我知道,以前有人反馈过,Mac 版本压缩包里的 cfst_hosts.sh 脚本是修改过的。

请问AC68U 怎么用?

大佬,想问一下文中提到执行cfst_hosts.sh之前先去/etc/hosts文件中修改cloudflare CDN ip为统一。我打开我的host文件却找不到有关cloudflare CDN ip,只能看到127.0.0.1。我应该在这些127.0.0.1下边再新建一行把CDN IP及我的域名写入,还是在cfst_hosts.sh首次执行时填写127.0.0.1,让cfst_hosts.sh自动把所有的127.0.0.1都替换成CDN IP?我看见楼上有一个人问过,但是并没有得到我想要知道的答案!所以我想在问问👀

XIU2 commented

@zjwztttt cfst_hosts 脚本是用来测试并替换 hosts 中的 Cloudflare CDN IP 的。
即,如果你是通过 hosts 来让一些域名走自选 Cloudflare CDN IP 的话,才需要这个脚本来方便的更新最快 IP。

如果 hosts 文件中事先并没有添加任何 Cloudflare CDN IP 相关的解析,那么你可以随意添加一行(IP 是随意的,但不要和 hosts 里其他已有内容重复):

1.1.1.1 xxx域名

然后运行脚本,根据提示填写 1.1.1.1,脚本就会生成一个 cfst_nowip.txt 文件来记录 1.1.1.1 这个 IP,后续运行脚本时,脚本测速获得最快 IP 后,就会在 hosts 文件中把所有 1.1.1.1 替换为刚刚获得的最快 IP,并将该最快 IP 写入 cfst_nowip.txt 文件以备下次使用。

共享一个脚本,自动切换为可用的ip,可以定时执行,需要把xxx.com换成自己hosts里面实际有的一个域名,重启xxx换成自己的命令如systemctl,我是Alpine。

脚本大概意思是,检查对应域名连接是否可用,不可用就把当前ip写到黑名单,从result.csv取一个可用的替换掉。

#!/bin/sh

wget -T 2 -O /dev/null www.google.com > /dev/null 2>&1
if [ $? -eq 0 ];then
    echo "connect ok"
    exit 0
fi

echo 'connect bad, need change ip'
bad=`cat /etc/hosts|grep xxx.com|awk '{print $1}'`
echo "bad ip: $bad"

grep $bad bad.txt > /dev/null 2>&1
if [ $? -ne 0 ];then
    echo "write $bad to bad.txt"
    echo $bad >> bad.txt
fi

for new in `cat result.csv |awk -F ',' 'NR>1{print $1}'`;do
    grep $new bad.txt > /dev/null 2>&1
    if [ $? -eq 0 ];then
        sed -i "/^$new/d" result.csv
    else
        echo "new ip: $new"
        echo "change hosts ip"
        sed -i "s/$bad/$new/" /etc/hosts
        echo "restart xxx"
        rc-service xxx restart
        break
    fi
done

配合这里的脚本需要
sed -i "s/$bad/$new/" /etc/hosts
之后可以加一个更新nowip的
echo $new > nowip_hosts.txt

你好,请问这个脚本有可以安装到梅林路由器上应用的吗?应该下载安装哪个?谢谢!

Hosts 文件里没有 Cloudflare CDN IP

随便找个 Cloudflare CDN 的 IP 加在 Hosts 里。
我帮你随便找了个 IP 吧,把以下内容写入到 Hosts 文件中(记得要单独一行):
104.21.61.174 dash.cloudflare.com

说实话,我自认不算小白了,但是今天第一次研究这个愣是没看懂这句话是什么意思,估计很多第一次用这个功能的朋友都不懂把。

即你需要先去 C:\Windows\System32\drivers\etc\hosts 文件中将所有 Cloudflare CDN IP 统一改为一个 IP。

使用方法里有句话是这样的 “即你需要先去 C:\Windows\System32\drivers\etc\hosts 文件中将所有 Cloudflare CDN IP 统一改为一个 IP。” 问题是我的hosts文件里并没有Cloudflare CDN IP怎么办,不知道怎么改了 @XIU2

Hosts 文件里没有 Cloudflare CDN IP

随便找个 Cloudflare CDN 的 IP 加在 Hosts 里。
我帮你随便找了个 IP 吧,把以下内容写入到 Hosts 文件中(记得要单独一行):
104.21.61.174 dash.cloudflare.com

说实话,我自认不算小白了,但是今天第一次研究这个愣是没看懂这句话是什么意思,估计很多第一次用这个功能的朋友都不懂把。

即你需要先去 C:\Windows\System32\drivers\etc\hosts 文件中将所有 Cloudflare CDN IP 统一改为一个 IP。

XIU2 commented

@uunxcom 我试着给这段文字扩充了下,应该会好理解一些了。。。

@uunxcom 我试着给这段文字扩充了下,应该会好理解一些了。。。

感谢分享。很多小白第一次优选ip的话,hosts里面确实没有 Cloudflare CDN IP 。赞一个。