CloudFront: aws版CF使用方法及自选IP探索(附可用IP)

CF创建

在aws后台直接搜:CloudFront 来到CF面板,开始创建第一个CF。出现的第一个页面涉及到很多选项,有的还比较复杂繁琐,很多人都被拦在这里。
创建aws的CF,首先要关注两个东西:源域名和备用域名。原域名就是你的源站,可以是网站代理服务器等你想要加速的服务。因为CF不支持源站为IP格式,所以你先要弄个域名。备用域名就是你绑定并可以使用CF的域名。
CloudFront创建页

举例:服务器1.1.1.1上搭建了v2ray,然后创建域名cf-behind.mebi.me解析到1.1.1.1。那么原域名填写cf-behind.mebi.me,另外我还需一个域名cf-front.mebi.me,先不用解析,把这个域名填到备用域名。

接下来解决一些小问题。
CF的国内IP只支持443端口(暂不讨论能扫到80端口的IP),这就要求搭建的v2传输方式必须带有tls,cdn加速又必须用ws,所以传输方式就定死了,只能ws+tls。

最低源SSL协议

选TLSv1,版本越小越好,版本高了对你搭建的要求就高了。原协议策略选择仅HTTPS。CF可以支持源站任意端口,利用这点我们可以在一台服务器上搭建多个v2并且都走CF。
CloudFront SSL协议选择

查看协议策略

选择HTTP和HTTPS。这图是我别人博客拿的。如果我们要自选国内IP,选择将HTTP重定向到HTTPS基本屁用没有,因为CF的国内IP基本不支持80端口,哪来的重定向。
查看协议策略

关于SSL证书选择

如果你选择CF给的域名,格式 xxxxxxxxx.cloudfront.net,就选择默认CloudFront证书。如果你用自己域名 cf-front.mebi.me,加上我们自选的国内ip只开放443端口,我们必须要上传证书。
CloudFront SSL证书

默认自定义SSL证书是灰色点不了,我们先要点使用ACM请求或导入证书,我们可以通过aws来申请cf-front.mebi.me的证书,也可以把自己申请的证书导入。证书申请成功或者导入的证书有效之后,刷新创建CF的页面,当证书与填写的备用域名匹配,自定义SSL证书才可选。

我们可以借助certbot免费申请通配符证书,这样可以解决创建多个CF要导入多次ssl证书的麻烦。不用担心有效期只有90天,借助crontab就可以实现自动续签。但是你的CF能活满90天吗?

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
./certbot-auto certonly

前面说了aws也可以申请证书,我试过申请 *.域名 的形式,但好像这玩意不是通配符域名?

自选IP

原理

CF的节点打开,在响应的header里Server字段值为CloudFront,利用这方法我们可以用脚本自动检测CF的IP。
CF自选IP原理

脚本的大致思路是找到CF的所有IP段,然后用zmap工具检测这些IP的443端口通不通,保留通的IP再进行header里Server字段值的判断,值为CloudFront即为CF。

扫描脚本

脚本运行条件:python3环境、numpy和requests模块、另加zmap工具。python3环境可以改为python环境,只需要把脚本的queue模块名改成Queue,第十四行也改成Queue。zmap工具也可以是masscan或者nmap,这两种工具下面有介绍。

Ubuntu/Debian系统

apt-get install zmap python3 -y
apt-get install python3-pip
pip3 install requests
pip3 install numpy

CentOS系统

yum install gcc+ gcc-c++ make python3
wget ftp://ftp.gnu.org/gnu/gengetopt/gengetopt-2.22.6.tar.gz
tar -zvxf gengetopt-2.22.6.tar.gz
cd gengetopt-2.22.6
./configure
make
make install
cd .. && git clone https://github.com/zmap/zmap
cd zmap/
cmake .
make -j4
make install
pip3 install requests
pip3 install numpy

此脚本全复制自cloudfront_nodecat,这里仅做为备份和参考。

# coding=utf-8
import threading
import requests
import queue
import sys
import re
import os
import numpy as np

#
def bThread(iplist):
threadl = []
global q
q = queue.Queue()
for host in iplist:
q.put(host)

for x in range(0, int(SETTHREAD)):
threadl.append(tThread(q))

for t in threadl:
t.start()
for t in threadl:
t.join()

#create thread
class tThread(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = q

def run(self):
while not self.queue.empty():
host = self.queue.get()
try:
checkServer(host)
except:
continue


def checkalive():
print('\n[Step1] Scanning alive servers:\n')
zmap = os.popen('zmap -w ' + SETIPLIST + ' -p 443 -B 30M')
global IPLIST
IPLIST = zmap.read().splitlines()

def checkServer(host):
header ={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'}
aimurl = "http://"+host+":443"
response = requests.get(url=aimurl,headers=header,timeout=10)
serverText = response.headers['server']
if (serverText == "CloudFront"):
print("NewNode:" + host +" has been catched!\n")
if MUTEX.acquire(3):
with open("result.txt","a+") as file:
file.write(host+"\n")
file.close()
MUTEX.release()

if __name__ == '__main__':
os.system("clear")
print('\n############# Cloud Front Scan ################')
print('# Author Madlifer|blog:https://vicho.me #')
print('###############################################\n')
global SETIPLIST
global SETTHREAD
global MUTEX
MUTEX = threading.Lock()
SETIPLIST = sys.argv[1]
SETTHREAD = sys.argv[2]
checkalive()
print('\n[Step2] Start Scanning edge nodes:\n')
bThread(IPLIST)
print('\n[WOW] Winner Winner Chicken Dinner!\n')

在脚本的同级目录下新建iplist.txt,将CF的IP段放进去。运行:

python3 scan.py iplist.txt 200

上面的200表示python检测Server字段的多进程数量,越大进程越大速度越快。你还可以修改扫描脚本scan.py第43行内,把-B 30M参数调到更大,那么zmap工具扫描的更快。速度快能减省时间但牺牲准确度,这个度自己把握。速度越快有可能会被你的服务商视为扫描攻击,有劝退的风险。

国内IP段

自测zmap这工具不太准,有很多IP的443端口开着的但却扫不到。zmap速度是快但是丢掉了准确率,可以使用其他替代工具masscan和nmap。

nmap工具

nmap工具可以提供很详细的扫描情况但是速度最慢,如果需要提高速度就用如下参数,这是我自己试验出来的速度不错,这段命令是可以直接放到扫描脚本scan.py的第43行替换zmap。虽然速度有所提升但是还是比较慢,还有就是没有扫描进度。

nmap -sS -Pn --open --min-hostgroup 100 --min-parallelism 100 -n -T4 -iL iplist.txt -p443 -vv | awk '/Discovered open port 443\/tcp/{print $6}'

nmap安装
可以直接安装。

masscan工具

masscan速度处于zmap和nmap两者之间,准确度也处于两者之间。masscan可以兼容部分nmap参数。以下命令也可以直接替换zmap。

masscan/bin/masscan -sS -Pn -n -p443 --rate 500 -iL iplist.txt | awk '{print $6}'

masscan安装
CentOS

yum install git gcc make libpcap-devel
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make

Debian/Ubuntu

apt-get install git gcc make libpcap-dev
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make

masscan工具在masscan目录下的bin/masscan中。

给几个IP段

CF的国内IP质量挺高,有很多idc机房和大厂,但是断流你说难不难。给几个IP段自己去扫吧,很多都是我12月份自己扫的,新鲜的很。话说我为什么这么无私?不断流速度直接拉顶,断流让你欲哭无泪,谁用谁知道。

12月24日扫到两个Ucloud广州BGP:106.75.167.14、106.75.173.101

江苏电信
58.221.56.0/24
58.221.36.0/24

58.20.0.0/16

北京BGP
106.75.4.162
106.75.16.214
106.75.34.130
106.75.90.226
106.75.99.152
106.75.119.188
106.75.120.201

广州BGP
106.75.130.199
106.75.136.107
106.75.139.38
106.75.141.189
106.75.146.128
106.75.173.101
106.75.145.227

上海BGP
106.75.213.165
106.75.226.254
106.75.216.223
106.75.231.127
106.75.231.151
106.75.231.132
106.75.231.139
106.75.231.172

上海BGP
211.148.0.0/16

宁夏BGP
52.82.0.0/16 很多

广州广东
119.147.182.0/24 几乎全D段

漕河泾IDC
210.51.40.0/24

上海联通
211.95.52.157
211.95.52.172

只给我扫的部分,太多了。另外很多IP支持80端口。