pymumu / smartdns

A local DNS server to obtain the fastest website IP for the best Internet experience, support DoT, DoH. 一个本地DNS服务器,获取最快的网站IP,获得最佳上网体验,支持DoH,DoT。
https://pymumu.github.io/smartdns/
GNU General Public License v3.0
8.33k stars 1.07k forks source link

[分享]弄了个Cloudflare加速的脚本 #1679

Open qwerttvv opened 7 months ago

qwerttvv commented 7 months ago
#!/bin/sh
set -eo pipefail

# 下载Cloudflare的IP地址列表
wget -O /usr/cfipv4.txt https://www.cloudflare-cn.com/ips-v4/
wget -O /usr/cfipv6.txt https://www.cloudflare-cn.com/ips-v6/

# 运行CDN速度测试,-n 222的线程数根据你设备性能调整
/usr/cdnspeedtest -dd -o /usr/1.cfipv4.txt -f /usr/cfipv4.txt -n 222
/usr/cdnspeedtest -dd -o /usr/1.cfipv6.txt -f /usr/cfipv6.txt -n 222
/usr/cdnspeedtest -dd -o /usr/2.cfipv4.txt -f /usr/cfipv4.txt -n 222
/usr/cdnspeedtest -dd -o /usr/2.cfipv6.txt -f /usr/cfipv6.txt -n 222
/usr/cdnspeedtest -dd -o /usr/3.cfipv4.txt -f /usr/cfipv4.txt -n 222
/usr/cdnspeedtest -dd -o /usr/3.cfipv6.txt -f /usr/cfipv6.txt -n 222
/usr/cdnspeedtest -dd -o /usr/4.cfipv4.txt -f /usr/cfipv4.txt -n 222
/usr/cdnspeedtest -dd -o /usr/4.cfipv6.txt -f /usr/cfipv6.txt -n 222

# 结果合并去重
awk -F, 'FNR > 1 && FNR <= 33 {print $1}' /usr/1.cfipv4.txt /usr/2.cfipv4.txt /usr/3.cfipv4.txt /usr/4.cfipv4.txt | sort -u > /usr/good.cfipv4.txt

awk -F, 'FNR > 1 && FNR <= 33 {print $1}' /usr/1.cfipv6.txt /usr/2.cfipv6.txt /usr/3.cfipv6.txt /usr/4.cfipv6.txt | sort -u > /usr/good.cfipv6.txt

# 对合并去重的结果重新测试
/usr/cdnspeedtest -o /usr/done.cfipv4.txt -f /usr/good.cfipv4.txt -n 100 -url=https://cloudflare.cdn.openbsd.org/pub/OpenBSD/7.3/src.tar.gz -sl 0.01 -dn 22
/usr/cdnspeedtest -o /usr/done.cfipv6.txt -f /usr/good.cfipv6.txt -n 100 -url=https://cloudflare.cdn.openbsd.org/pub/OpenBSD/7.3/src.tar.gz -sl 0.01 -dn 22

# 从done.cfipv4.txt文件中提取前16个IP地址
ips=$(awk -F, 'NR>1 && NR<18 {print $1}' /usr/done.cfipv4.txt | tr '\n' ',' | sed 's/,$//')

# 检查custom.conf文件中是否存在这两行命令
if grep -q "ip-set -name cloudflare-ipv4 -file /usr/cfipv4.txt" /etc/smartdns/custom.conf && grep -q "ip-rules ip-set:cloudflare-ipv4 -ip-alias" /etc/smartdns/custom.conf; then
    # 如果存在,替换IP地址
    sed -i "/ip-rules ip-set:cloudflare-ipv4 -ip-alias/c\ip-rules ip-set:cloudflare-ipv4 -ip-alias $ips" /etc/smartdns/custom.conf
else
    # 如果不存在,添加命令
    echo "" >> /etc/smartdns/custom.conf
    echo "" >> /etc/smartdns/custom.conf
    echo "#cloudflare ip-alias" >> /etc/smartdns/custom.conf
    echo "ip-set -name cloudflare-ipv4 -file /usr/cfipv4.txt" >> /etc/smartdns/custom.conf
    echo "ip-rules ip-set:cloudflare-ipv4 -ip-alias $ips" >> /etc/smartdns/custom.conf
fi

# 从done.cfipv6.txt文件中提取前16个IP地址
ips=$(awk -F, 'NR>1 && NR<18 {print $1}' /usr/done.cfipv6.txt | tr '\n' ',' | sed 's/,$//')

# 检查custom.conf文件中是否存在这两行命令
if grep -q "ip-set -name cloudflare-ipv6 -file /usr/cfipv6.txt" /etc/smartdns/custom.conf && grep -q "ip-rules ip-set:cloudflare-ipv6 -ip-alias" /etc/smartdns/custom.conf; then
    # 如果存在,替换IP地址
    sed -i "/ip-rules ip-set:cloudflare-ipv6 -ip-alias/c\ip-rules ip-set:cloudflare-ipv6 -ip-alias $ips" /etc/smartdns/custom.conf
else
    # 如果不存在,添加命令
    echo "" >> /etc/smartdns/custom.conf
    echo "ip-set -name cloudflare-ipv6 -file /usr/cfipv6.txt" >> /etc/smartdns/custom.conf
    echo "ip-rules ip-set:cloudflare-ipv6 -ip-alias $ips" >> /etc/smartdns/custom.conf
    echo "" >> /etc/smartdns/custom.conf
fi

# 清理文件
cd /usr/
rm 1.cfipv4.txt 2.cfipv4.txt 3.cfipv4.txt 4.cfipv4.txt 1.cfipv6.txt 2.cfipv6.txt 3.cfipv6.txt 4.cfipv6.txt good.cfipv4.txt good.cfipv6.txt

# 重启smartdns
/etc/init.d/smartdns restart

存成cloudflare.sh到usr目录,从 https://github.com/immortalwrt-collections/openwrt-cdnspeedtest/releases 下载你对应cpu的ipk直接解bin文件到usr目录,或者用原版,改应用程序名字,或者在链接中ipk直接装,改应用的位置。 再去弄个定时任务

50 4 * * * /bin/sh /usr/Cloudflare.sh

行了,每天4点50开始执行,替换20最快的ipv4和ipv6,smartdns开缓存和测速的话默认在20个里面选8个。222线程的话大概半个小时完成全过程

qwerttvv commented 7 months ago

另外谁知道aws官方有没有公布自己的ip地址啊

qwerttvv commented 7 months ago

呃,,那个,,,我还没实地测呢啊,应该是没问题,等我回去我就试试,有问题我再改

PikuZheng commented 7 months ago

根据 https://github.com/XIU2/CloudflareSpeedTest 的讨论,cf 的免费 ip 池和付费 ip 池是不一样的,用一个 ip 来替代 cf 公布的所有 ip,可能有网络不通的风险。 另外速度快的一般是104段,抽风概率很大

qwerttvv commented 7 months ago

cf 的免费 ip 池和付费 ip 池是不一样的,用一个 ip 来替代 cf 公布的所有 ip,可能有网络不通的风险。

我擦 那https://www.cloudflare-cn.com/ips-v4和https://www.cloudflare-cn.com/ips-v6包含了免费和收费,然后免费和收费的数据是隔离的,互相没有对方的数据或者单独一方没有另一方的?

PikuZheng commented 7 months ago

我擦 那https://www.cloudflare-cn.com/ips-v4和https://www.cloudflare-cn.com/ips-v6包含了免费和收费,然后免费和收费的数据是隔离的,互相没有对方的数据或者单独一方没有另一方的?

就我所知是不互通

qwerttvv commented 7 months ago

我擦 那https://www.cloudflare-cn.com/ips-v4和https://www.cloudflare-cn.com/ips-v6包含了免费和收费,然后免费和收费的数据是隔离的,互相没有对方的数据或者单独一方没有另一方的?

就我所知是不互通

那这个测速的玩意儿没意义了啊

那gcore和aws cloudfront呢?

PikuZheng commented 7 months ago

那这个测速的玩意儿没意义了啊

可以选举出固定的一个ip 把免费池映射过去,参考 #1062 。付费池正常查询是三个 ip,测速排序后基本没什么问题

那gcore和aws cloudfront呢?

aws 和 cloudfront 在我这是部分数据中心通部分数据中心墙。我是靠edns来优化到离我vps线路近的数据中心

qwerttvv commented 7 months ago

ip-alias功能上线最初不就是cf这个需求吗,那本来免费版的,测速匹配到付费服务器,然后服务器就没这个数据?这不闹着玩儿呢么?

PikuZheng commented 7 months ago

ip-alias功能上线最初不就是cf这个需求吗,那本来免费版的,测速匹配到付费服务器,然后服务器就没这个数据?这不闹着玩儿呢么?

免费的两个ip怎么测速也是在免费池中啊

qwerttvv commented 7 months ago

https://www.cloudflare-cn.com/ips-v4/

例如这个,这是免费的?还是免费收费全部?

PikuZheng commented 7 months ago

应该是全部 刚搜索了一下,我上面说的免费池收费池不对。应该是全部ip地址段中,有几个段是仅供付费用户使用的,有几个段是自有业务保留。用一个ip映射全部ip段应该是可行的。仅当个别付费用户指定了特定的ip段时才会不通(一般是地区限制

qwerttvv commented 7 months ago

ip-alias功能上线最初不就是cf这个需求吗,那本来免费版的,测速匹配到付费服务器,然后服务器就没这个数据?这不闹着玩儿呢么?

免费的两个ip怎么测速也是在免费池中啊

能行,一会儿我把CLOUDFRONT和GCORE也弄上

qwerttvv commented 7 months ago

另外还有几个都可以如法炮制吗?

https://api.bunny.net/system/edgeserverlist/plain https://api.fastly.com/public-ip-list https://www.keycdn.com/shield-prefixes.json https://cachefly.cachefly.net/ips/cdn.txt https://techdocs.akamai.com/origin-ip-acl/docs/update-your-origin-server

qwerttvv commented 7 months ago

路由器死活装不上jq。。。换了俩源也不对,我擦…

PikuZheng commented 7 months ago

另外还有几个都可以如法炮制吗?

https://api.bunny.net/system/edgeserverlist/plain https://api.fastly.com/public-ip-list https://www.keycdn.com/shield-prefixes.json https://cachefly.cachefly.net/ips/cdn.txt https://techdocs.akamai.com/origin-ip-acl/docs/update-your-origin-server

fastly被墙 用哪个无所谓吧 gcore可能会被ban ip 其他的不清楚

qwerttvv commented 7 months ago

中午试了一下cloudfront和akamai,因为找不到下载测速,就tcp ping看的话,测出来的结果和上游dns采用阿里腾讯百度字节最后smartdns给的结果差异不大,不值得折腾

也就cf对大陆默认的不太理想,有些实用性

PikuZheng commented 7 months ago

我昨晚试了一下akamai,他法国和香港的ip到我这都巨慢,最快的是韩国的。我认为akamai有必要。cloudfront到我这都挺慢的

qwerttvv commented 7 months ago

我昨晚试了一下akamai,他法国和香港的ip到我这都巨慢,最快的是韩国的。我认为akamai有必要。cloudfront到我这都挺慢的

我回头回家看看家里网络情况

qwerttvv commented 7 months ago

https://github.com/XIU2/CloudflareSpeedTest/issues/500

那边作者不做下载测速步骤的ip剔除,这样的话搭配smartdns用,下载测速就没有意义,只ping就好了

因为我这里发现有些ip在tcp ping和下载测速结果不相关,有些ping结果较好的下载测速比较慢,反而ping慢一些的下载速度相对好一些

总之我把在本地的脚本改了,直接加-dd就完了,下载测速不剔除ip的话,这个步骤就毫无意义

改完的贴1楼了

o0HalfLife0o commented 7 months ago

我昨晚试了一下akamai,他法国和香港的ip到我这都巨慢,最快的是韩国的。我认为akamai有必要。cloudfront到我这都挺慢的

cloudfront我这边是新加坡最好,日本ping和cft差不多,但是速度差很多

qwerttvv commented 7 months ago

我昨晚试了一下akamai,他法国和香港的ip到我这都巨慢,最快的是韩国的。我认为akamai有必要。cloudfront到我这都挺慢的

cloudfront我这边是新加坡最好,日本ping和cft差不多,但是速度差很多

老哥你cloudfront的下载测速地址是哪个呀,找不到能直连的大些的文件

o0HalfLife0o commented 7 months ago

我昨晚试了一下akamai,他法国和香港的ip到我这都巨慢,最快的是韩国的。我认为akamai有必要。cloudfront到我这都挺慢的

cloudfront我这边是新加坡最好,日本ping和cft差不多,但是速度差很多

老哥你cloudfront的下载测速地址是哪个呀,找不到能直连的大些的文件

自己设置cft源地址为别人分享的测速文件,cfst里很多

qwerttvv commented 7 months ago

我昨晚试了一下akamai,他法国和香港的ip到我这都巨慢,最快的是韩国的。我认为akamai有必要。cloudfront到我这都挺慢的

cloudfront我这边是新加坡最好,日本ping和cft差不多,但是速度差很多

老哥你cloudfront的下载测速地址是哪个呀,找不到能直连的大些的文件

自己设置cft源地址为别人分享的测速文件,cfst里很多

又找了一下,cloudfront的没有看到,cloudflare的倒是一大把

o0HalfLife0o commented 7 months ago

我昨晚试了一下akamai,他法国和香港的ip到我这都巨慢,最快的是韩国的。我认为akamai有必要。cloudfront到我这都挺慢的

cloudfront我这边是新加坡最好,日本ping和cft差不多,但是速度差很多

老哥你cloudfront的下载测速地址是哪个呀,找不到能直连的大些的文件

自己设置cft源地址为别人分享的测速文件,cfst里很多

又找了一下,cloudfront的没有看到,cloudflare的倒是一大把

意思就是自己设置一个cft cdn用来测速,源地址填cf测速地址就可以了

zmjjack commented 7 months ago

不明觉厉

qwerttvv commented 7 months ago

最近用了一阵子,发现有些ip是用不了的,不知道为什么,似乎也没什么规律

改了一下脚本,现在把这个问题去掉了,还贴在一层吧

maojianyou commented 4 months ago
#!/bin/sh
set -eo pipefail

# 下载Cloudflare的IP地址列表
wget -O /usr/cfipv4.txt https://www.cloudflare-cn.com/ips-v4/
wget -O /usr/cfipv6.txt https://www.cloudflare-cn.com/ips-v6/

# 运行CDN速度测试,-n 222的线程数根据你设备性能调整
/usr/cdnspeedtest -dd -o /usr/1.cfipv4.txt -f /usr/cfipv4.txt -n 222
/usr/cdnspeedtest -dd -o /usr/1.cfipv6.txt -f /usr/cfipv6.txt -n 222
/usr/cdnspeedtest -dd -o /usr/2.cfipv4.txt -f /usr/cfipv4.txt -n 222
/usr/cdnspeedtest -dd -o /usr/2.cfipv6.txt -f /usr/cfipv6.txt -n 222
/usr/cdnspeedtest -dd -o /usr/3.cfipv4.txt -f /usr/cfipv4.txt -n 222
/usr/cdnspeedtest -dd -o /usr/3.cfipv6.txt -f /usr/cfipv6.txt -n 222
/usr/cdnspeedtest -dd -o /usr/4.cfipv4.txt -f /usr/cfipv4.txt -n 222
/usr/cdnspeedtest -dd -o /usr/4.cfipv6.txt -f /usr/cfipv6.txt -n 222

# 结果合并去重
awk -F, 'FNR > 1 && FNR <= 33 {print $1}' /usr/1.cfipv4.txt /usr/2.cfipv4.txt /usr/3.cfipv4.txt /usr/4.cfipv4.txt | sort -u > /usr/good.cfipv4.txt

awk -F, 'FNR > 1 && FNR <= 33 {print $1}' /usr/1.cfipv6.txt /usr/2.cfipv6.txt /usr/3.cfipv6.txt /usr/4.cfipv6.txt | sort -u > /usr/good.cfipv6.txt

# 对合并去重的结果重新测试
/usr/cdnspeedtest -o /usr/done.cfipv4.txt -f /usr/good.cfipv4.txt -n 100 -url=https://cloudflare.cdn.openbsd.org/pub/OpenBSD/7.3/src.tar.gz -sl 0.01 -dn 22
/usr/cdnspeedtest -o /usr/done.cfipv6.txt -f /usr/good.cfipv6.txt -n 100 -url=https://cloudflare.cdn.openbsd.org/pub/OpenBSD/7.3/src.tar.gz -sl 0.01 -dn 22

# 从done.cfipv4.txt文件中提取前16个IP地址
ips=$(awk -F, 'NR>1 && NR<18 {print $1}' /usr/done.cfipv4.txt | tr '\n' ',' | sed 's/,$//')

# 检查custom.conf文件中是否存在这两行命令
if grep -q "ip-set -name cloudflare-ipv4 -file /usr/cfipv4.txt" /etc/smartdns/custom.conf && grep -q "ip-rules ip-set:cloudflare-ipv4 -ip-alias" /etc/smartdns/custom.conf; then
    # 如果存在,替换IP地址
    sed -i "/ip-rules ip-set:cloudflare-ipv4 -ip-alias/c\ip-rules ip-set:cloudflare-ipv4 -ip-alias $ips" /etc/smartdns/custom.conf
else
    # 如果不存在,添加命令
  echo "" >> /etc/smartdns/custom.conf
  echo "" >> /etc/smartdns/custom.conf
  echo "#cloudflare ip-alias" >> /etc/smartdns/custom.conf
    echo "ip-set -name cloudflare-ipv4 -file /usr/cfipv4.txt" >> /etc/smartdns/custom.conf
    echo "ip-rules ip-set:cloudflare-ipv4 -ip-alias $ips" >> /etc/smartdns/custom.conf
fi

# 从done.cfipv6.txt文件中提取前16个IP地址
ips=$(awk -F, 'NR>1 && NR<18 {print $1}' /usr/done.cfipv6.txt | tr '\n' ',' | sed 's/,$//')

# 检查custom.conf文件中是否存在这两行命令
if grep -q "ip-set -name cloudflare-ipv6 -file /usr/cfipv6.txt" /etc/smartdns/custom.conf && grep -q "ip-rules ip-set:cloudflare-ipv6 -ip-alias" /etc/smartdns/custom.conf; then
    # 如果存在,替换IP地址
    sed -i "/ip-rules ip-set:cloudflare-ipv6 -ip-alias/c\ip-rules ip-set:cloudflare-ipv6 -ip-alias $ips" /etc/smartdns/custom.conf
else
    # 如果不存在,添加命令
  echo "" >> /etc/smartdns/custom.conf
    echo "ip-set -name cloudflare-ipv6 -file /usr/cfipv6.txt" >> /etc/smartdns/custom.conf
    echo "ip-rules ip-set:cloudflare-ipv6 -ip-alias $ips" >> /etc/smartdns/custom.conf
  echo "" >> /etc/smartdns/custom.conf
fi

# 清理文件
cd /usr/
rm 1.cfipv4.txt 2.cfipv4.txt 3.cfipv4.txt 4.cfipv4.txt 1.cfipv6.txt 2.cfipv6.txt 3.cfipv6.txt 4.cfipv6.txt good.cfipv4.txt good.cfipv6.txt

# 重启smartdns
/etc/init.d/smartdns restart

存成cloudflare.sh到usr目录,从 https://github.com/immortalwrt-collections/openwrt-cdnspeedtest/releases 下载你对应cpu的ipk直接解bin文件到usr目录,或者用原版,改应用程序名字,或者在链接中ipk直接装,改应用的位置。 再去弄个定时任务

50 4 * * * /bin/sh /usr/Cloudflare.sh

行了,每天4点50开始执行,替换20最快的ipv4和ipv6,smartdns开缓存和测速的话默认在20个里面选8个。222线程的话大概半个小时完成全过程

https://cloudflare.cdn.openbsd.org/pub/OpenBSD/7.3/src.tar.gz 这个貌似不能下载了