AWSCloudFront自选IP完全手册

一,原理介绍

AWS提供CloudFront的CDN服务是不支持自选IP的,由于CloudFront边缘路由器只提供东南亚导致速度十分捉鸡,甚至不如cloudflare提供的免费服务好用。
但某人大佬意外发现可以通过Cloudflare方式将备用域名Cname到cloudfrontCDN服务器的方式实现自选IP,并且AWS在内部部署了很多的边缘路由器(未开放),由此提供了一个可能,即通过自选IP的方式将DNS解析到AWS内部边缘路由器,实现国内棉被CDN。

在实现这一步骤中,面临以下几个问题:

1.如何找到AWS在国内的边缘路由器
2.如何进行CDN侧的自选IP设置
3.如何实现自动推送优选后的IP到DNS上

最终到此处发布前,博主已实现1,2并应用至本站vicho.me上,实现IP优选和自动推送可以提供脚本,考虑成本和需求问题,暂时不做这操作。

二,扫描AWS国内边缘例程

如果发送一个request到AWS边缘节点的https端口,返回的headers信息中,server会显示为CloudFront,而大部分都会是nginx或其他web服务器,可以以此作为区分。

1.扫描开放443端口的IP段

Cloudfront在国内的边缘前端肯定部署在IDC机房,但目前国内IDC机房所在的IP段与家宽基本混为一起,所以无法直接找到国内的IDC机房IP段,只能盲扫全国IP,好在Zmap扫描速度很快,我们要做的就是扫描IP段内所有开放了443端口的IP。
可以通过以下命令安装Zmap并扫描IP

#安装Zmap运行环境sudo apt-get install bison ed gawk gcc libc6-dev make#安装Zmapsudo apt install zmap#扫描开放了443端口的IP,具体格式查看 zmap -hzmap -w iplist.txt -p 443 -B 30M -o ip-new.txt

如果有什么不清楚,可以查看录制的录像:

  -V,--version打印版本并退出                                                                            例子:                                                                                                                         例子:                                                                                                                             zmap -p 80(在Internet上扫描tcp / 80上的主机并将其输出到stdout)                                                           zmap -N 5 -B 10M -p 80(查找5个HTTP服务器,以10 Mb / s的速度扫描)                                                                 zmap -p 80 10.0.0.0/8 192.168.0.0/16 -o(扫描tcp / 80上的两个子网)                                                             zmap -p 80 1.2.3.4 10.0.0.3(在tcp / 80上扫描1.2.3.4、10.0.0.3)                                                                探针模块(tcp_synscan)帮助:                                                                                                  探针模块(tcp_synscan)帮助:                                                                                                  将TCP SYN数据包发送到特定端口的探测模块。可能                                                             分类为:synack和rst。SYN-ACK数据包被认为是成功的                                                     重置数据包被视为失败响应。                                                                               输出模块(csv)帮助:                                                                                                         输出模块(csv)帮助:                                                                                                         默认情况下,ZMap打印出唯一的成功IP地址(例如,来自                                                    TCP SYN扫描)以ASCII格式(例如192.168.1.5)到stdout或指定的                                                      输出文件。在内部,这由“ csv”输出模块处理,并且                                                         等效于运行zmap --output-module = csv --output-fields = saddr                                                              --output-filter =“ success = 1 && repeat = 0”。                                                                                      root @ VM-4-4-ubuntu:〜#ls                                                                                                              go1.15.3.linux-amd64.tar.gz    ssr.sh  zmap-install.cast  pan                                                     177片root @ VM-4-4-ubuntu:〜#ls                                                                                                          [读取851行(从DOS格式转换)  go1.15.3.linux-amd64.tar.gz  iplist.txt    ssr.sh  zmap-install.cast  pan                                         177片root@VM-4-4-ubuntu:~# zmap -w iplist.txt -p 443 -B 30M -o ip.txt                                                                  

02:01

iplist.txt为通过sftp上传的包含一个IP段的txt文件,格式为X.X.X.0 /24

2.扫描AWSCloudFront边缘节点

可以构造一个python脚本,使用脚本进行扫描,脚本从github抄的,核心代码很简单,有能力的大佬可以改成python3

#!/usr/bin/env python# coding=utf-8# python2.7 onlyimport threadingimport requestsimport Queueimport sysimport reimport numpy as np#def bThread(iplist):threadl = []queue = Queue.Queue()for host in iplist:queue.put(host)for x in xrange(0, int(SETTHREAD)):threadl.append(tThread(queue))for t in threadl:t.start()for t in threadl:t.join()#create threadclass tThread(threading.Thread):def __init__(self, queue):threading.Thread.__init__(self)self.queue = queuedef run(self):while not self.queue.empty():host = self.queue.get()try:checkServer(host)except:continuedef checkServer(hot):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 len(serverText) > 0:print "-"*50+"\n"+aimurl +"\nServer: "+serverTextif (serverText == "CloudFront"):if mutex.acquire(3):with open("result.txt","a+") as file:file.write(host+"\n")file.close()mutex.release()if __name__ == '__main__':print '\n############# Cloud Front Scan ################'print ' Author hostloc.com'print '################################################\n'global SETTHREADglobal mutexmutex = threading.Lock()try:SETTHREAD = sys.argv[2]filepath = sys.argv[1]with open(filepath, "r") as f:iplist = f.read().splitlines()#iplist = ip_range(sys.argv[1].split('-')[], sys.argv[1].split('-')[1])print '\n[Note] Will scan '+str(len(iplist))+" host...\n"bThread(iplist)except KeyboardInterrupt:print 'Keyboard I
#!/usr/bin/env python

# coding=utf-8

# python2.7 only



import threading

import requests

import Queue

import sys

import re

import numpy as np



#

def bThread(iplist):



threadl = []

queue = Queue.Queue()

for host in iplist:

queue.put(host)



for x in xrange(0, int(SETTHREAD)):

threadl.append(tThread(queue))



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 = queue



def run(self):



while not self.queue.empty():

host = self.queue.get()

try:

checkServer(host)

except:

continue



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 len(serverText) > 0:

print "-"*50+"\n"+aimurl +"\nServer: "+serverText

if (serverText == "CloudFront"):

if mutex.acquire(3):

with open("result.txt","a+") as file:

file.write(host+"\n")

file.close()

mutex.release()





if __name__ == '__main__':

print '\n############# Cloud Front Scan ################'

print ' Author hostloc.com'

print '################################################\n'



global SETTHREAD

global mutex

mutex = threading.Lock()

try:

SETTHREAD = sys.argv[2]

filepath = sys.argv[1]

with open(filepath, "r") as f:

iplist = f.read().splitlines()

#iplist = ip_range(sys.argv[1].split('-')[0], sys.argv[1].split('-')[1])

print '\n[Note] Will scan '+str(len(iplist))+" host...\n"



bThread(iplist)

except KeyboardInterrupt:

print 'Keyboard Interrupt!'

sys.exit()

使用示例:python cfscan.py 443-ip.txt 200
其中cfscan.py为脚本名,443-ip.txt为包含了IP的txt文件200为线程数(卡顿调小)

最后结果会输出为当前目录下的result.txt文件,结果即为可以使用的自选IP。

三,CDN设置

CDN设置中,首先你要给你要使用的域名申请SSL证书并配置好,确认https情况下可以访问你的网站。

1.设置源站解析

cloudfront中有一个源域名设置项,请

注意此处不要填充你要用的域名,这里其实是要填源站IP的,但是CloudFront不支持直接填充源站IP,所以你必须开个子域名直接指向源站IP,其中www.vicho.me此处的就是在DNS解析处指向了源站IP,如下

2.设置CloudFront

登录您的AWS账号(不能是edustarter账号,好像现在edustarter账号也进不去Cloudfront了),进入Cloudfront,创建分配。

原设置就填刚才你设置的,根据步骤不同需要设置不同的方式。

接下来重点就是,备用域名填充你要使用的域名,然后通过ACM上传证书(DNS方法解析一条验证记录即可)

后续不表,完成分配之后,会分配给你一个cname地址,如下图所示:

3.解析

转到您的DNS服务商处,将要使用的域名解析到上面显示的地址处,然后将要使用的域名条件解析到您的自选IP上

等待解析实现即可使用。

4.效果图

三,优选IP加上PUSH到你的DNS上

优选IP的原理很简单,ping你在第一步选出来的边缘节点IP,找到最低ping的一个,需要进行以下操作:

找一台电信单线的服务器,ping ip列表,选出最低ping值的IP,即为电信最优IP
找一台电信单线的服务器,ping ip列表,选出最低ping值的IP,即为联通最IP优IP
找一台移动单线的服务器,ping ip列表,选出最低ping值的IP,即为移动最优IP

push也有大佬提供的玩法,可以使用dnspod的API分界线进行解析,可以参考以下项目:
https://github.com/ddgth/cf2dns

迫于穷人,不能提供三台单线服务器选择出最优IP,有资源的大佬可以搞一下玩。

暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
联系:niu12503@gmail.com