L 记事本
warp+连接切换EndPoints
cloudflare,Nice!
cloudflare 提供了warp 隧道(实际上就是WireGuard),帮助大家保护隐私不被第三方窃取。
可惜,咱们国内链接初始化的时候考缘分,有的地方能连上,有的不能,网上一些都是说导出配置使用wireguard,但是wireguard不支持域名过滤,只能通过ip来判断是否走隧道,比较麻烦。
注意
注意 warp+并不能隐藏你的ip,只能保证你的访问不被第三方知道,网站还是能获取到你的ip信息的。
warp+ 选择对端ip
目前看到的优选warp教程 都是windows 端的
这里在前人的肩膀上稍微改动下,在mac上选一个没墙的endpoint 。
脚本来自 https://github.com/badafans/better-cloudflare-ip
ip 来自 https://github.com/yonggekkk/warp-yg/
步骤
- 将下面代码复制保存为 cf.sh
- 终端中 执行
sh cf.sh
cd /Applications/Cloudflare\ WARP.app/Contents/Resources/
warp-cli set-custom-endpoint 优选的ip:2408
代码
#!/bin/bash
# better-cloudflare-ip
echo '162.159.192.0/24
162.159.193.0/24
162.159.195.0/24
188.114.96.0/24
188.114.97.0/24
188.114.98.0/24
188.114.99.0/24' > ips-v4.txt
function bettercloudflareip(){
read -p "请设置期望的带宽大小(默认最小1,单位 Mbps):" bandwidth
read -p "请设置RTT测试进程数(默认10,最大50):" tasknum
if [ -z "$bandwidth" ]
then
bandwidth=1
fi
if [ $bandwidth -eq 0 ]
then
bandwidth=1
fi
if [ -z "$tasknum" ]
then
tasknum=10
fi
if [ $tasknum -eq 0 ]
then
echo "进程数不能为0,自动设置为默认值"
tasknum=10
fi
if [ $tasknum -gt 50 ]
then
echo "超过最大进程限制,自动设置为最大值"
tasknum=50
fi
speed=$[$bandwidth*128*1024]
starttime=$(date +%s)
cloudflaretest
realbandwidth=$[$max/128]
endtime=$(date +%s)
echo "从服务器获取详细信息"
unset temp
if [ "$ips" == "ipv4" ]
then
if [ $tls == 1 ]
then
temp=($(curl --resolve $domain:443:$anycast --retry 1 -s https://$domain/cdn-cgi/trace --connect-timeout 2 --max-time 3))
else
temp=($(curl -x $anycast:80 --retry 1 -s http://$domain/cdn-cgi/trace --connect-timeout 2 --max-time 3))
fi
else
if [ $tls == 1 ]
then
temp=($(curl --resolve $domain:443:$anycast --retry 1 -s https://$domain/cdn-cgi/trace --connect-timeout 2 --max-time 3))
else
temp=($(curl -x [$anycast]:80 --retry 1 -s http://$domain/cdn-cgi/trace --connect-timeout 2 --max-time 3))
fi
fi
if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | grep colo= | wc -l) == 0 ]
then
publicip=获取超时
colo=获取超时
else
publicip=$(echo ${temp[@]} | sed -e 's/ /\n/g' | grep ip= | cut -f 2- -d'=')
colo=$(grep -w "($(echo ${temp[@]} | sed -e 's/ /\n/g' | grep colo= | cut -f 2- -d'='))" colo.txt | awk -F"-" '{print $1}')
fi
clear
echo "优选IP $anycast"
echo "公网IP $publicip"
if [ $tls == 1 ]
then
echo "warp+ 支持端口 2408"
else
echo "warp+ 支持端口 2408"
fi
echo "设置带宽 $bandwidth Mbps"
echo "实测带宽 $realbandwidth Mbps"
echo "峰值速度 $max kB/s"
echo "往返延迟 $avgms 毫秒"
echo "数据中心 $colo"
echo "总计用时 $[$endtime-$starttime] 秒"
}
function rtthttps(){
avgms=0
n=1
for ip in `cat rtt/$1.txt`
do
while true
do
if [ $n -le 3 ]
then
rsp=$(curl --resolve $domain:443:$ip https://$domain/cdn-cgi/trace -o /dev/null -s --connect-timeout 1 --max-time 3 -w %{time_connect}_%{http_code})
if [ $(echo $rsp | awk -F_ '{print $2}') != 200 ]
then
avgms=0
n=1
break
else
avgms=$[$(echo $rsp | awk -F_ '{printf ("%d\n",$1*1000000)}')+$avgms]
n=$[$n+1]
fi
else
avgms=$[$avgms/3000]
if [ $avgms -lt 10 ]
then
echo 00$avgms $ip >> rtt/$1.log
elif [ $avgms -ge 10 ] && [ $avgms -lt 100 ]
then
echo 0$avgms $ip >> rtt/$1.log
else
echo $avgms $ip >> rtt/$1.log
fi
avgms=0
n=1
break
fi
done
done
rm -rf rtt/$1.txt
}
function rtthttp(){
avgms=0
n=1
for ip in `cat rtt/$1.txt`
do
while true
do
if [ $n -le 3 ]
then
if [ $(echo $ip | grep : | wc -l) == 0 ]
then
rsp=$(curl -x $ip:80 http://$domain/cdn-cgi/trace -o /dev/null -s --connect-timeout 1 --max-time 3 -w %{time_connect}_%{http_code})
else
rsp=$(curl -x [$ip]:80 http://$domain/cdn-cgi/trace -o /dev/null -s --connect-timeout 1 --max-time 3 -w %{time_connect}_%{http_code})
fi
if [ $(echo $rsp | awk -F_ '{print $2}') != 200 ]
then
avgms=0
n=1
break
else
avgms=$[$(echo $rsp | awk -F_ '{printf ("%d\n",$1*1000000)}')+$avgms]
n=$[$n+1]
fi
else
avgms=$[$avgms/3000]
if [ $avgms -lt 10 ]
then
echo 00$avgms $ip >> rtt/$1.log
elif [ $avgms -ge 10 ] && [ $avgms -lt 100 ]
then
echo 0$avgms $ip >> rtt/$1.log
else
echo $avgms $ip >> rtt/$1.log
fi
avgms=0
n=1
break
fi
done
done
rm -rf rtt/$1.txt
}
function speedtesthttps(){
rm -rf log.txt speed.txt
curl --resolve $domain:443:$1 https://$domain/$file -o /dev/null --connect-timeout 1 --max-time 10 > log.txt 2>&1
cat log.txt | tr '\r' '\n' | awk '{print $NF}' | sed '1,3d;$d' | grep -v 'k\|M' >> speed.txt
for i in `cat log.txt | tr '\r' '\n' | awk '{print $NF}' | sed '1,3d;$d' | grep k | sed 's/k//g'`
do
k=$i
k=$[$k*1024]
echo $k >> speed.txt
done
for i in `cat log.txt | tr '\r' '\n' | awk '{print $NF}' | sed '1,3d;$d' | grep M | sed 's/M//g'`
do
i=$(echo | awk '{print '$i'*10 }')
M=$i
M=$[$M*1024*1024/10]
echo $M >> speed.txt
done
max=0
for i in `cat speed.txt`
do
if [ $i -ge $max ]
then
max=$i
fi
done
rm -rf log.txt speed.txt
echo $max
}
function speedtesthttp(){
rm -rf log.txt speed.txt
if [ $(echo $1 | grep : | wc -l) == 0 ]
then
curl -x $1:80 http://$domain/$file -o /dev/null --connect-timeout 1 --max-time 10 > log.txt 2>&1
else
curl -x [$1]:80 http://$domain/$file -o /dev/null --connect-timeout 1 --max-time 10 > log.txt 2>&1
fi
cat log.txt | tr '\r' '\n' | awk '{print $NF}' | sed '1,3d;$d' | grep -v 'k\|M' >> speed.txt
for i in `cat log.txt | tr '\r' '\n' | awk '{print $NF}' | sed '1,3d;$d' | grep k | sed 's/k//g'`
do
k=$i
k=$[$k*1024]
echo $k >> speed.txt
done
for i in `cat log.txt | tr '\r' '\n' | awk '{print $NF}' | sed '1,3d;$d' | grep M | sed 's/M//g'`
do
i=$(echo | awk '{print '$i'*10 }')
M=$i
M=$[$M*1024*1024/10]
echo $M >> speed.txt
done
max=0
for i in `cat speed.txt`
do
if [ $i -ge $max ]
then
max=$i
fi
done
rm -rf log.txt speed.txt
echo $max
}
function cloudflaretest(){
while true
do
while true
do
rm -rf rtt rtt.txt log.txt speed.txt
mkdir rtt
echo "正在生成 $ips"
unset temp
if [ "$ips" == "ipv4" ]
then
n=0
iplist=100
while true
do
for i in `awk 'BEGIN{srand()} {print rand()"\t"$0}' $filename | sort -n | awk '{print $2} NR=='$iplist' {exit}' | awk -F\. '{print $1"."$2"."$3}'`
do
temp[$n]=$(echo $i.$(($RANDOM%256)))
n=$[$n+1]
done
if [ $n -ge $iplist ]
then
break
fi
done
while true
do
if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ]
then
break
else
for i in `awk 'BEGIN{srand()} {print rand()"\t"$0}' $filename | sort -n | awk '{print $2} NR=='$[$iplist-$(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l)]' {exit}' | awk -F\. '{print $1"."$2"."$3}'`
do
temp[$n]=$(echo $i.$(($RANDOM%256)))
n=$[$n+1]
done
fi
done
else
n=0
iplist=100
while true
do
for i in `awk 'BEGIN{srand()} {print rand()"\t"$0}' $filename | sort -n | awk '{print $2} NR=='$iplist' {exit}' | awk -F: '{print $1":"$2":"$3}'`
do
temp[$n]=$(echo $i:$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))))
n=$[$n+1]
done
if [ $n -ge $iplist ]
then
break
fi
done
while true
do
if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ]
then
break
else
for i in `awk 'BEGIN{srand()} {print rand()"\t"$0}' $filename | sort -n | awk '{print $2} NR=='$[$iplist-$(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l)]' {exit}' | awk -F: '{print $1":"$2":"$3}'`
do
temp[$n]=$(echo $i:$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))))
n=$[$n+1]
done
fi
done
fi
ipnum=$(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l)
if [ $tasknum == 0 ]
then
tasknum=1
fi
if [ $ipnum -lt $tasknum ]
then
tasknum=$ipnum
fi
n=1
for i in `echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u`
do
echo $i>>rtt/$n.txt
if [ $n == $tasknum ]
then
n=1
else
n=$[$n+1]
fi
done
n=1
while true
do
if [ $tls == 1 ]
then
rtthttps $n &
else
rtthttp $n &
fi
if [ $n == $tasknum ]
then
break
else
n=$[$n+1]
fi
done
while true
do
n=$(ls rtt | grep txt | wc -l)
if [ $n -ne 0 ]
then
echo "$(date +'%H:%M:%S') 等待RTT测试结束,剩余进程数 $n"
else
echo "$(date +'%H:%M:%S') RTT测试完成"
break
fi
sleep 1
done
n=$(ls rtt | grep log | wc -l)
if [ $n == 0 ]
then
echo "当前所有IP都存在RTT丢包"
echo "继续新的RTT测试"
else
cat rtt/*.log > rtt.txt
status=0
echo "待测速的IP地址"
cat rtt.txt | sort | awk '{print $2" 往返延迟 "$1" 毫秒"}'
for i in `cat rtt.txt | sort | awk '{print $1"_"$2}'`
do
avgms=$(echo $i | awk -F_ '{print $1}')
ip=$(echo $i | awk -F_ '{print $2}')
echo "正在测试 $ip"
if [ $tls == 1 ]
then
max=$(speedtesthttps $ip)
else
max=$(speedtesthttp $ip)
fi
if [ $max -ge $speed ]
then
status=1
anycast=$ip
max=$[$max/1024]
echo "$ip 峰值速度 $max kB/s"
rm -rf rtt rtt.txt
break
else
max=$[$max/1024]
echo "$ip 峰值速度 $max kB/s"
fi
done
if [ $status == 1 ]
then
break
fi
fi
done
break
done
}
function singlehttps(){
read -p "请输入需要测速的IP: " ip
read -p "请输入需要测速的端口(默认443): " port
if [ -z "$ip" ]
then
echo "未输入IP"
fi
if [ -z "$port" ]
then
port=443
fi
echo "正在测速 $ip 端口 $port"
speed_download=$(curl --resolve $domain:$port:$ip https://$domain:$port/$file -o /dev/null --connect-timeout 5 --max-time 15 -w %{speed_download} | awk -F\. '{printf ("%d\n",$1/1024)}')
}
function singlehttp(){
read -p "请输入需要测速的IP: " ip
read -p "请输入需要测速的端口(默认80): " port
if [ -z "$ip" ]
then
echo "未输入IP"
fi
if [ -z "$port" ]
then
port=80
fi
echo "正在测速 $ip 端口 $port"
if [ $(echo $ip | grep : | wc -l) == 0 ]
then
speed_download=$(curl -x $ip:$port http://$domain:$port/$file -o /dev/null --connect-timeout 5 --max-time 15 -w %{speed_download} | awk -F\. '{printf ("%d\n",$1/1024)}')
else
speed_download=$(curl -x [$ip]:$port http://$domain:$port/$file -o /dev/null --connect-timeout 5 --max-time 15 -w %{speed_download} | awk -F\. '{printf ("%d\n",$1/1024)}')
fi
}
function datacheck(){
clear
echo "如果这些下面这些文件下载失败,可以手动访问网址下载保存至同级目录"
echo "https://www.baipiao.eu.org/cloudflare/colo 另存为 colo.txt"
echo "https://www.baipiao.eu.org/cloudflare/url 另存为 url.txt"
echo "https://www.baipiao.eu.org/cloudflare/ips-v4 另存为 ips-v4.txt"
echo "https://www.baipiao.eu.org/cloudflare/ips-v6 另存为 ips-v6.txt"
while true
do
if [ ! -f "colo.txt" ]
then
echo "从服务器下载数据中心信息 colo.txt"
curl --retry 2 -s https://www.baipiao.eu.org/cloudflare/colo -o colo.txt
elif [ ! -f "url.txt" ]
then
echo "从服务器下载测速文件地址 url.txt"
curl --retry 2 -s https://www.baipiao.eu.org/cloudflare/url -o url.txt
elif [ ! -f "ips-v4.txt" ]
then
echo "从服务器下载IPV4数据 ips-v4.txt"
curl --retry 2 -s https://www.baipiao.eu.org/cloudflare/ips-v4 -o ips-v4.txt
elif [ ! -f "ips-v6.txt" ]
then
echo "从服务器下载IPV6数据 ips-v6.txt"
curl --retry 2 -s https://www.baipiao.eu.org/cloudflare/ips-v6 -o ips-v6.txt
else
break
fi
done
}
datacheck
url=$(sed -n '1p' url.txt)
domain=$(echo $url | cut -f 1 -d'/')
file=$(echo $url | cut -f 2- -d'/')
clear
while true
do
echo "1. IPV4优选(TLS)"
echo "2. IPV4优选 <<<<<<<<<<<<<<<<<<<<<<<<<<< 请选择此项"
echo "3. IPV6优选(TLS)"
echo "4. IPV6优选"
echo "5. 单IP测速(TLS)"
echo "6. 单IP测速"
echo "7. 清空缓存"
echo "8. 更新数据"
echo -e "0. 退出\n"
read -p "请选择菜单(默认0): " menu
if [ -z "$menu" ]
then
menu=0
fi
if [ $menu == 0 ]
then
clear
echo "退出成功"
break
fi
if [ $menu == 1 ]
then
ips=ipv4
filename=ips-v4.txt
tls=1
bettercloudflareip
break
fi
if [ $menu == 2 ]
then
ips=ipv4
filename=ips-v4.txt
tls=0
bettercloudflareip
break
fi
if [ $menu == 3 ]
then
ips=ipv6
filename=ips-v6.txt
tls=1
bettercloudflareip
break
fi
if [ $menu == 4 ]
then
ips=ipv6
filename=ips-v6.txt
tls=0
bettercloudflareip
break
fi
if [ $menu == 5 ]
then
singlehttps
clear
echo "$ip 平均速度 $speed_download kB/s"
fi
if [ $menu == 6 ]
then
singlehttp
clear
echo "$ip 平均速度 $speed_download kB/s"
fi
if [ $menu == 7 ]
then
rm -rf rtt rtt.txt log.txt speed.txt
clear
echo "缓存已经清空"
fi
if [ $menu == 8 ]
then
rm -rf colo.txt url.txt ips-v4.txt ips-v6.txt
datacheck
clear
fi
done