blog icon indicating copy to clipboard operation
blog copied to clipboard

CloudFront自选IP完全手册

Open dalaolala opened this issue 5 years ago • 3 comments

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

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

1.如何找到AWS在国内的边缘节点 2.如何进行CDN侧的自选IP设置 3.如何实现自动push优选后的IP到DNS上

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

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

  sudo apt-get install bison ed gawk gcc libc6-dev make
  sudo apt install zmap
  zmap -w iplist.txt -p 443 -B 30M -o ip-new.txt

2.扫描AWSCloudFront边缘节点 可以构造一个python脚本,使用脚本进行扫描,脚本从github抄的,核心代码很简单

#!/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为线程数(卡顿调小)

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

dalaolala avatar Nov 04 '20 06:11 dalaolala

https://www.kx521.com/post/39.html 安装zmap

dalaolala avatar Nov 07 '20 03:11 dalaolala

443-ip.txt为包含了IP的txt文件,这个文件是要IP一个个列出来还是能用IP段

lxmicode avatar Jun 18 '21 02:06 lxmicode

你的代码好多有关缩进的语法错误啊

z836454898 avatar Apr 19 '22 13:04 z836454898