Skip to content

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
3 tasks done
XIU2 opened this issue Jan 27, 2021 · 51 comments
Closed
3 tasks done

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

XIU2 opened this issue Jan 27, 2021 · 51 comments
Labels
功能建议 功能与建议 工具教程 辅助工具 或 技巧教程

Comments

@XIU2
Copy link
Owner

XIU2 commented Jan 27, 2021

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

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

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

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


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


  1. Windows 脚本
  2. Linux 脚本
  3. 定时任务
@XIU2 XIU2 added 工具教程 辅助工具 或 技巧教程 功能建议 功能与建议 labels Jan 27, 2021
@XIU2
Copy link
Owner Author

XIU2 commented Jan 27, 2021

# 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
Copy link
Owner Author

XIU2 commented Jan 27, 2021

# 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
Copy link
Owner Author

XIU2 commented Jan 28, 2021

# 定时任务

## 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

@mongoliabao555
Copy link

mongoliabao555 commented Jan 31, 2021

# Windows 脚本

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

@XIU2
Copy link
Owner Author

XIU2 commented Jan 31, 2021

@mongoliabao555

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

@XIU2
Copy link
Owner Author

XIU2 commented Jan 31, 2021

@mongoliabao555

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

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


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

@XIU2
Copy link
Owner Author

XIU2 commented Feb 1, 2021

@huanx9

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

@mongoliabao555
Copy link

mongoliabao555 commented Feb 2, 2021 via email

@XIU2
Copy link
Owner Author

XIU2 commented Feb 2, 2021

@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 用作代理会更快、看油管会更快。

@leozhangpd
Copy link

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

@XIU2
Copy link
Owner Author

XIU2 commented Feb 5, 2021

@leozhangpd

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

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


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

@XIU2
Copy link
Owner Author

XIU2 commented Feb 5, 2021

@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
...

@ljm1447669873
Copy link

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

@XIU2
Copy link
Owner Author

XIU2 commented Feb 11, 2021

@ljm1447669873

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

@ljm1447669873
Copy link

@ljm1447669873

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

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

@mongoliabao555
Copy link

mongoliabao555 commented Feb 13, 2021 via email

@XIU2
Copy link
Owner Author

XIU2 commented Feb 13, 2021

@mongoliabao555

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

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

@denniszzg
Copy link

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

@XIU2
Copy link
Owner Author

XIU2 commented Mar 10, 2021

@denniszzg

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

@denniszzg
Copy link

denniszzg commented Mar 10, 2021

@XIU2

感谢解答。明白了。

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

@XIU2
Copy link
Owner Author

XIU2 commented Mar 11, 2021

@denniszzg

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

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

@denniszzg
Copy link

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

@lost1984
Copy link

感谢大佬,好久不来,出了这个超级工具。
补充,根据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
Copy link
Owner Author

XIU2 commented Apr 18, 2021

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

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

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

@avijxxx
Copy link

avijxxx commented Aug 7, 2021

# 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
Copy link
Owner Author

XIU2 commented Aug 7, 2021

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

@lp380490944
Copy link

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

@XIU2
Copy link
Owner Author

XIU2 commented Sep 9, 2021

@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
Copy link

@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

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

@fengqi
Copy link

fengqi commented Oct 2, 2021

共享一个脚本,自动切换为可用的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

@KorenKrita
Copy link

KorenKrita commented Nov 24, 2021

# 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

@neilt2016
Copy link

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

@XIU2
Copy link
Owner Author

XIU2 commented Dec 2, 2021

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

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

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

@neilt2016
Copy link

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

@potus2030
Copy link

potus2030 commented Dec 8, 2021

请教一下大佬,我还没理解修改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
Copy link
Owner Author

XIU2 commented Dec 8, 2021

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

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

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

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

@XIU2
Copy link
Owner Author

XIU2 commented Feb 4, 2022

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

@q345296237
Copy link

q345296237 commented Mar 30, 2022

请问AC68U 怎么用?

@zjwztttt
Copy link

大佬,想问一下文中提到执行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
Copy link
Owner Author

XIU2 commented Aug 31, 2022

@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 文件以备下次使用。

@Carmel0
Copy link

Carmel0 commented Sep 20, 2022

共享一个脚本,自动切换为可用的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

@Freelancer748
Copy link

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

@uunxcom
Copy link

uunxcom commented Feb 24, 2023

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。

@uunxcom
Copy link

uunxcom commented Feb 24, 2023

使用方法里有句话是这样的 “即你需要先去 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。

@Freelancer748
Copy link

Freelancer748 commented Feb 24, 2023 via email

@XIU2
Copy link
Owner Author

XIU2 commented Feb 25, 2023

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

@uunxcom
Copy link

uunxcom commented Feb 26, 2023

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

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

Repository owner locked and limited conversation to collaborators Mar 1, 2023
@XIU2 XIU2 converted this issue into discussion #312 Mar 1, 2023

This issue was moved to a discussion.

You can continue the conversation there. Go to discussion →

Labels
功能建议 功能与建议 工具教程 辅助工具 或 技巧教程
Projects
None yet
Development

No branches or pull requests