Loading... 这两天折腾梯子的 cf ip 优选的时候,看到了[这个](https://github.com/pymumu/smartdns/issues/707 "这个") ![](https://blog.zhpjy.com/usr/uploads/2022/11/383263728.png) 给我了一个启发:合理配置在路由器的 dnsmasq 上,当 dns解析的 ip 是 cf ip 时,dnsmasq 会将这个结果替换成优选后的 ip ,达到优化内网客户端访问 cloudflare cdn 保护的网站的访问速度的效果。 ## 效果 浙江这边的联通宽带优化后,cf 转发的梯子可以全天流畅播放油管 8k 的视频,另外显著提升 cf 保护网站的访问速度,比如猫站。 ## 配置过程 ### 生成 dnsmasq 配置文件模板 cloudflare 提供了所有 ipv4 的 [ip 列表](https://www.cloudflare.com/ips-v4 "ip 列表") 但是比较坑的是 dnsmasq 的 alias 配置不支持 cidr 形式的 ip 范围,而且不支持将一个 ip 段替换成指定单一 ip。因此只能遍历所有的 ip,每行配置写一个 ip 规则了。 遍历 ip 的 python 代码如下 ```python import ipaddress l = [str(ip) for ip in ipaddress.IPv4Network('173.245.48.0/20')] l += [str(ip) for ip in ipaddress.IPv4Network('103.21.244.0/22')] l += [str(ip) for ip in ipaddress.IPv4Network('103.22.200.0/22')] l += [str(ip) for ip in ipaddress.IPv4Network('103.31.4.0/22')] l += [str(ip) for ip in ipaddress.IPv4Network('141.101.64.0/18')] l += [str(ip) for ip in ipaddress.IPv4Network('141.101.64.0/18')] l += [str(ip) for ip in ipaddress.IPv4Network('108.162.192.0/18')] l += [str(ip) for ip in ipaddress.IPv4Network('190.93.240.0/20')] l += [str(ip) for ip in ipaddress.IPv4Network('188.114.96.0/20')] l += [str(ip) for ip in ipaddress.IPv4Network('197.234.240.0/22')] l += [str(ip) for ip in ipaddress.IPv4Network('198.41.128.0/17')] l += [str(ip) for ip in ipaddress.IPv4Network('162.158.0.0/15')] l += [str(ip) for ip in ipaddress.IPv4Network('104.16.0.0/13')] l += [str(ip) for ip in ipaddress.IPv4Network('104.24.0.0/14')] l += [str(ip) for ip in ipaddress.IPv4Network('172.64.0.0/13')] l += [str(ip) for ip in ipaddress.IPv4Network('131.0.72.0/22')] print ("alias=",end="") print(*l,sep=",127.0.0.1\nalias=",end="") print (",127.0.0.1",end="") ``` 使用 shell 重定向输出结果到文件中,就生成了配置文件模板。 ### 获取优选后的 CF IP 我使用的是 [cloudflareST](https://github.com/XIU2/CloudflareSpeedTest "cloudflareST") 这个项目 获取IP的脚本如下 ```shell ./CloudflareST IP=$(sed -n '2p' CloudflareST_linux_amd64/result.csv | grep -Eo '^[0-9.]+') echo "better cloudflare IP: $IP" ``` ### 将配置中的 IP 替换成选后的 IP ```shell #假设优选后的IP是 2.2.2.2 sed -E "s/[0-9\.]+$/2.2.2.2/g" cloudflare-replace.conf > cloudflare.conf ``` ### 部署配置文件并生效 我的路由器用的是 OPNsense 将生成的 cloudflare.conf 拷贝到 dnsmasq 配置文件路径,然后重启服务即可。参考脚本如下 ```shell scp cloudflare.conf root@192.168.2.1:/usr/local/etc/dnsmasq.conf.d/ ssh root@192.168.2.1 "pluginctl -s dnsmasq restart" ``` openwrt 的用户需要在 /etc/dnsmasq.conf 添加一行配置```conf-dir=/etc/dnsmasq.d```,然后新建 /etc/dnsmasq.d 文件夹,将 cloudflare.conf 拷贝到 /etc/dnsmasq.d ,使用 ```/etc/init.d/dnsmasq restart ``` 重启 dnsmasq 服务 ## OPNsense 脚本参考 我将以下脚本部署在了内网一台24小时运行的 linux 服务器上,并且配置了 cron 定时执行。 使用此脚本需要配置服务器与路由器的免密登陆 ```shell #!/bin/bash cd `dirname $0` set -e cd CloudflareST_linux_amd64 ./CloudflareST cd .. IP=$(sed -n '2p' CloudflareST_linux_amd64/result.csv | grep -Eo '^[0-9.]+') echo "better cloudflare IP: $IP" sed -E "s/[0-9\.]+$/$IP/g" cloudflare-replace.conf > cloudflare.conf scp cloudflare.conf root@192.168.2.1:/usr/local/etc/dnsmasq.conf.d/ ssh root@192.168.2.1 "pluginctl -s dnsmasq restart" ``` 最后修改:2022 年 11 月 09 日 11 : 31 PM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 ×Close 赞赏作者 扫一扫支付 支付宝支付 微信支付