文章 优选cf King Moon 2025-05-03 2025-05-04 使用Masscan扫描Cloudflare反代IP的全面优化指南 本指南详细介绍了如何使用masscan扫描IP范围、识别开放端口并检测Cloudflare反代的IP,以用于网络优化。指南包含每一步的详细说明、命令解析、最佳实践以及优化的Python脚本,用于处理扫描结果。本教程的目标是帮助用户高效地从指定IP范围内识别Cloudflare反代的IP。
前置条件 在开始之前,请确保满足以下条件:
操作系统 :推荐使用基于Linux的系统(如Ubuntu、CentOS),因为masscan在Linux上性能最佳。
管理员权限 :masscan需要root权限进行原始数据包扫描。
Python环境 :安装Python 3.6+,并使用virtualenv管理依赖。
依赖项 :安装必要的Python包(requests、lxml)和masscan。
网络访问 :确保系统能够访问互联网,以便在检测Cloudflare时发送HTTP请求。
IP范围文件 :准备一个文本文件(ip_ranges),包含要扫描的IP范围(例如,Cloudflare的104.16.0.0/12)。
硬件建议
CPU :多核处理器以加快扫描速度。
内存 :至少4GB,以处理大型XML输出文件。
网络 :高速、稳定的互联网连接,以避免HTTP请求超时。
详细步骤 1. 设置工作目录 进入工作目录以保持文件组织有序。该目录将存储脚本、IP范围文件和扫描结果。
说明 :
/home/user 是一个示例目录,可替换为您的工作目录(例如,/home/user/scans)。
确保您对该目录有写入权限。
2. 激活Python虚拟环境 为避免与系统级Python包冲突,建议使用虚拟环境。本步骤假设您已创建了一个名为cfproxy_env的虚拟环境。
1 source /home/user/cfproxy/cfproxy_env/bin/activate
说明 :
source命令激活虚拟环境,修改shell的PATH以使用隔离的Python环境。
如果虚拟环境尚未创建,可使用以下命令创建:1 python3 -m venv /home/user/cfproxy/cfproxy_env
激活虚拟环境后,安装必要的Python包:1 pip install requests lxml
3. 安装Masscan masscan是一款高性能端口扫描工具,建议从源码安装以获取最新版本。
1 cd masscan && make install && cd ..
说明 :
cd masscan进入masscan源码目录(假设已从GitHub克隆:git clone https://github.com/robertdavidgraham/masscan)。
make install编译并安装masscan。请确保已安装gcc和make(Ubuntu上可运行sudo apt install build-essential)。
cd ..返回工作目录。
验证安装:运行masscan --version检查版本。
注意 :运行masscan需要使用sudo,因为它需要root权限进行原始数据包扫描。
4. 扫描开放端口 使用masscan扫描指定IP范围内的开放端口,重点关注Cloudflare常用的端口(如80、443、2052)。
1 sudo masscan -iL ip_ranges.txt -p80,443,2052 -oX scan_cf.xml --rate 1000000
说明 :
sudo:原始数据包扫描需要root权限。
-iL ip_ranges.txt:从ip_ranges.txt文件读取IP范围(格式:每行一个范围,例如104.16.0.0/12)。
-p80,443,2052:扫描端口80(HTTP)、443(HTTPS)和2052(Cloudflare常用端口)。
-oX scan_cf.xml:将结果以XML格式输出到scan_cf.xml。
--rate 1000000:设置扫描速率为每秒100万个数据包。根据网络性能调整(例如,较慢网络可降至100000)。
最佳实践 :建议先使用较低速率(例如10000)测试网络稳定性,避免压垮路由器。
示例ip_ranges.txt文件 :
1 2 3 104.16.0.0/12 162.158.0.0/15 172.64.0.0/13
5. 处理扫描结果以识别Cloudflare反代IP 运行提供的Python脚本(checkcf.py)解析XML输出,检测Cloudflare反代IP,并将结果保存到CSV文件。
1 python checkcf.py /home/user/scan_cf.xml /home/user/cfoutput.csv
说明 :
脚本接受两个参数:输入XML文件(scan_cf.xml)和输出CSV文件(cfoutput.csv)。
脚本解析XML提取IP:端口对,发送HTTP请求检查Cloudflare特征头,并将反代IP写入CSV。
CSV输出包含IP和端口列,便于导入其他工具进行分析。
优化的Python脚本 (checkcf.py) 以下是checkcf.py的优化版本,改进了错误处理、性能和日志记录。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 import xml.etree.ElementTree as ET import requests import csv import concurrent.futures import logging import sys import time from urllib.parse import urlencode # 配置日志 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler('checkcf.log'), logging.StreamHandler() ] ) logger = logging.getLogger(__name__) """ 前置条件: 1. 操作系统:Linux(如Ubuntu、CentOS),masscan在Linux上性能最佳。 2. 管理员权限:masscan需root权限运行。 3. Python环境:Python 3.6+,建议使用virtualenv。 4. 依赖项:安装Python包(pip install requests lxml)和masscan。 5. 网络:稳定互联网连接,用于HTTP请求。 6. 输入文件:masscan生成的XML文件(包含IP和开放端口)。 """ def parse_xml(file_path): """解析XML文件,提取开放端口的IP和端口对""" try: tree = ET.parse(file_path) root = tree.getroot() ip_ports = [] for host in root.findall('host'): ip = host.find('address').get('addr') for port in host.find('ports').findall('port'): port_id = port.get('portid') state = port.find('state').get('state') if state == 'open': ip_ports.append((ip, port_id)) logger.info(f"从XML中提取到 {len(ip_ports)} 个IP:端口对") return ip_ports except ET.ParseError as e: logger.error(f"解析XML文件失败: {e}") sys.exit(1) except FileNotFoundError: logger.error(f"未找到XML文件: {file_path}") sys.exit(1) def check_cloudflare(ip, port, timeout=5, retries=2): """检查IP:端口是否为Cloudflare反代,并验证FOFA表达式""" url = f"http://{ip}:{port}" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } for attempt in range(retries): try: response = requests.get(url, headers=headers, timeout=timeout, allow_redirects=False) server_header = response.headers.get('Server', '').lower() cf_ray = response.headers.get('CF-RAY') cf_cache_status = response.headers.get('CF-Cache-Status') status_code = response.status_code # 检测是否为Cloudflare反代 is_cloudflare = 'cloudflare' in server_header or cf_ray or cf_cache_status # FOFA表达式:server=="cloudflare" && header="Forbidden" is_fofa_match = ( is_cloudflare and status_code == 403 ) logger.debug(f"检查 {ip}:{port} - Cloudflare: {is_cloudflare}, FOFA匹配: {is_fofa_match}") return ip, port, is_fofa_match except requests.RequestException as e: logger.debug(f"第 {attempt + 1} 次尝试失败 {ip}:{port} - {str(e)}") if attempt == retries - 1: return ip, port, False time.sleep(1) def write_to_csv(results, output_file): """仅将FOFA匹配成功的IP和端口写入CSV""" try: with open(output_file, 'w', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile) writer.writerow(['IP', 'PORT']) for ip, port, is_fofa_match in results: if is_fofa_match: writer.writerow([ip, port]) logger.info(f"FOFA匹配结果已写入 {output_file}") except IOError as e: logger.error(f"写入CSV失败: {e}") sys.exit(1) def main(xml_file, output_csv, max_threads=50, timeout=5, retries=2): """主函数:处理XML,检查FOFA匹配,保存结果""" start_time = time.time() logger.info("开始检测FOFA匹配的Cloudflare反代") # 解析XML ip_ports = parse_xml(xml_file) # 检查Cloudflare反代和FOFA匹配 results = [] with concurrent.futures.ThreadPoolExecutor(max_workers=max_threads) as executor: future_to_ip_port = { executor.submit(check_cloudflare, ip, port, timeout, retries): (ip, port) for ip, port in ip_ports } for future in concurrent.futures.as_completed(future_to_ip_port): ip, port = future_to_ip_port[future] try: result = future.result() results.append(result) if result[2]: logger.info(f"在 {ip}:{port} 检测到FOFA匹配(server==cloudflare && header=Forbidden)") except Exception as e: logger.error(f"处理 {ip}:{port} 时出错: {e}") # 写入CSV write_to_csv(results, output_csv) elapsed_time = time.time() - start_time logger.info(f"完成,耗时 {elapsed_time:.2f} 秒") if __name__ == "__main__": if len(sys.argv) != 3: print("用法: python checkcf.py <输入XML文件> <输出CSV文件>") sys.exit(1) xml_file_path = sys.argv[1] output_csv_path = sys.argv[2] main(xml_file_path, output_csv_path)
脚本优化亮点
日志记录 :同时输出到文件(checkcf.log)和控制台,便于调试和记录。
重试机制 :为HTTP请求添加重试逻辑,处理网络不稳定问题。
扩展检测 :增加CF-Cache-Status头检查,提升Cloudflare检测准确性。
性能统计 :记录总执行时间,便于性能分析。
错误处理 :改进文件未找到和XML解析错误的处理逻辑。
CSV输出 :新增是否Cloudflare列,方便结果筛选。
最佳实践与优化建议
IP范围选择 :
使用Cloudflare官方公布的IP范围(可从https://www.cloudflare.com/ips/获取),避免无意义的扫描。
将大范围分割为较小的子范围,以管理内存和处理负载。
扫描速率 :
根据网络和硬件调整--rate参数。过高的速率(例如1000000)可能导致丢包或路由器过载。
建议先用小范围测试,找到最佳速率。
线程管理 :
checkcf.py中的max_threads参数控制并发HTTP请求。性能强的系统可增加线程数(例如100),但需监控CPU和网络使用率。
线程过多可能导致目标服务器限速。
超时与重试 :
根据网络可靠性调整timeout(默认5秒)和retries(默认2次)。
较长的超时可能提高准确性,但会减慢处理速度。
结果分析 :
CSV输出可导入Excel或Pandas进行进一步分析。
筛选是否Cloudflare=True的记录用于优化任务。
法律与道德考量 :
确保有权限扫描目标IP范围。未经授权的扫描可能违反服务条款或当地法律。
避免过于激进的扫描,以免干扰服务。
故障排查
Masscan无法运行 :
确认使用sudo运行。
检查masscan是否正确安装(运行masscan --version)。
确保ip_ranges文件存在且格式正确。
XML解析错误 :
检查scan_cf.xml文件是否损坏(用文本编辑器打开确认)。
确保磁盘空间足够存储大型XML文件。
未检测到Cloudflare IP :
确认IP范围包含Cloudflare的范围。
检查端口80、443、2052是否适用于您的场景。
增加checkcf.py中的timeout或retries。
CPU或网络使用率过高 :
降低masscan的--rate或checkcf.py的max_threads。
在非高峰时段运行扫描。
示例输出 cfoutput.csv1 2 3 4 IP,端口,是否Cloudflare 104.16.1.1,443,True 104.16.1.2,80,False 162.158.2.3,443,True
checkcf.log1 2 3 4 5 2025-05-03 10:00:00,123 - INFO - 开始检测Cloudflare反代 2025-05-03 10:00:01,456 - INFO - 从XML中提取到 1000 个IP:端口对 2025-05-03 10:00:05,789 - INFO - 在 104.16.1.1:443 检测到Cloudflare 2025-05-03 10:00:10,234 - INFO - 结果已写入 /home/user/cfoutput.csv 2025-05-03 10:00:10,567 - INFO - 完成,耗时 10.44 秒
总结 本指南和优化的checkcf.py脚本为使用masscan扫描和识别Cloudflare反代IP提供了一个强大的解决方案。通过遵循步骤、优化参数并遵循最佳实践,您可以高效地收集用于网络优化的数据。始终确保扫描行为符合道德和法律要求。
如需进一步定制,可根据需求修改脚本以支持更多特征头、代理类型或输出格式。