<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>King Moon</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <icon>https://blog.eco.us.kg/favicon.ico</icon>
  <id>https://blog.eco.us.kg/</id>
  <link href="https://blog.eco.us.kg/" rel="alternate"/>
  <link href="https://blog.eco.us.kg/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, King Moon</rights>
  <subtitle>写代码，也写生活</subtitle>
  <title>King的部落格</title>
  <updated>2025-05-04T03:37:24.000Z</updated>
  <entry>
    <author>
      <name>King Moon</name>
    </author>
    <category term="文章" scheme="https://blog.eco.us.kg/categories/%E6%96%87%E7%AB%A0/"/>
    <content>
      <![CDATA[<h1 id="使用Masscan扫描Cloudflare反代IP的全面优化指南"><a href="#使用Masscan扫描Cloudflare反代IP的全面优化指南" class="headerlink" title="使用Masscan扫描Cloudflare反代IP的全面优化指南"></a>使用Masscan扫描Cloudflare反代IP的全面优化指南</h1><p>本指南详细介绍了如何使用<code>masscan</code>扫描IP范围、识别开放端口并检测Cloudflare反代的IP，以用于网络优化。指南包含每一步的详细说明、命令解析、最佳实践以及优化的Python脚本，用于处理扫描结果。本教程的目标是帮助用户高效地从指定IP范围内识别Cloudflare反代的IP。</p><hr><h2 id="前置条件"><a href="#前置条件" class="headerlink" title="前置条件"></a>前置条件</h2><p>在开始之前，请确保满足以下条件：</p><ul><li><strong>操作系统</strong>：推荐使用基于Linux的系统（如Ubuntu、CentOS），因为<code>masscan</code>在Linux上性能最佳。</li><li><strong>管理员权限</strong>：<code>masscan</code>需要root权限进行原始数据包扫描。</li><li><strong>Python环境</strong>：安装Python 3.6+，并使用<code>virtualenv</code>管理依赖。</li><li><strong>依赖项</strong>：安装必要的Python包（<code>requests</code>、<code>lxml</code>）和<code>masscan</code>。</li><li><strong>网络访问</strong>：确保系统能够访问互联网，以便在检测Cloudflare时发送HTTP请求。</li><li><strong>IP范围文件</strong>：准备一个文本文件（<code>ip_ranges</code>），包含要扫描的IP范围（例如，Cloudflare的<code>104.16.0.0/12</code>）。</li></ul><h3 id="硬件建议"><a href="#硬件建议" class="headerlink" title="硬件建议"></a>硬件建议</h3><ul><li><strong>CPU</strong>：多核处理器以加快扫描速度。</li><li><strong>内存</strong>：至少4GB，以处理大型XML输出文件。</li><li><strong>网络</strong>：高速、稳定的互联网连接，以避免HTTP请求超时。</li></ul><hr><h2 id="详细步骤"><a href="#详细步骤" class="headerlink" title="详细步骤"></a>详细步骤</h2><h3 id="1-设置工作目录"><a href="#1-设置工作目录" class="headerlink" title="1. 设置工作目录"></a>1. 设置工作目录</h3><p>进入工作目录以保持文件组织有序。该目录将存储脚本、IP范围文件和扫描结果。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /home/user</span><br></pre></td></tr></table></figure><p><strong>说明</strong>：</p><ul><li><code>/home/user</code> 是一个示例目录，可替换为您的工作目录（例如，<code>/home/user/scans</code>）。</li><li>确保您对该目录有写入权限。</li></ul><h3 id="2-激活Python虚拟环境"><a href="#2-激活Python虚拟环境" class="headerlink" title="2. 激活Python虚拟环境"></a>2. 激活Python虚拟环境</h3><p>为避免与系统级Python包冲突，建议使用虚拟环境。本步骤假设您已创建了一个名为<code>cfproxy_env</code>的虚拟环境。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> /home/user/cfproxy/cfproxy_env/bin/activate</span><br></pre></td></tr></table></figure><p><strong>说明</strong>：</p><ul><li><code>source</code>命令激活虚拟环境，修改shell的<code>PATH</code>以使用隔离的Python环境。</li><li>如果虚拟环境尚未创建，可使用以下命令创建：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 -m venv /home/user/cfproxy/cfproxy_env</span><br></pre></td></tr></table></figure></li><li>激活虚拟环境后，安装必要的Python包：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install requests lxml</span><br></pre></td></tr></table></figure></li></ul><h3 id="3-安装Masscan"><a href="#3-安装Masscan" class="headerlink" title="3. 安装Masscan"></a>3. 安装Masscan</h3><p><code>masscan</code>是一款高性能端口扫描工具，建议从源码安装以获取最新版本。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> masscan &amp;&amp; make install &amp;&amp; <span class="built_in">cd</span> ..</span><br></pre></td></tr></table></figure><p><strong>说明</strong>：</p><ul><li><code>cd masscan</code>进入<code>masscan</code>源码目录（假设已从GitHub克隆：<code>git clone https://github.com/robertdavidgraham/masscan</code>）。</li><li><code>make install</code>编译并安装<code>masscan</code>。请确保已安装<code>gcc</code>和<code>make</code>（Ubuntu上可运行<code>sudo apt install build-essential</code>）。</li><li><code>cd ..</code>返回工作目录。</li><li>验证安装：运行<code>masscan --version</code>检查版本。</li></ul><p><strong>注意</strong>：运行<code>masscan</code>需要使用<code>sudo</code>，因为它需要root权限进行原始数据包扫描。</p><h3 id="4-扫描开放端口"><a href="#4-扫描开放端口" class="headerlink" title="4. 扫描开放端口"></a>4. 扫描开放端口</h3><p>使用<code>masscan</code>扫描指定IP范围内的开放端口，重点关注Cloudflare常用的端口（如80、443、2052）。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> masscan -iL ip_ranges.txt -p80,443,2052 -oX scan_cf.xml --rate 1000000</span><br></pre></td></tr></table></figure><p><strong>说明</strong>：</p><ul><li><code>sudo</code>：原始数据包扫描需要root权限。</li><li><code>-iL ip_ranges.txt</code>：从<code>ip_ranges.txt</code>文件读取IP范围（格式：每行一个范围，例如<code>104.16.0.0/12</code>）。</li><li><code>-p80,443,2052</code>：扫描端口80（HTTP）、443（HTTPS）和2052（Cloudflare常用端口）。</li><li><code>-oX scan_cf.xml</code>：将结果以XML格式输出到<code>scan_cf.xml</code>。</li><li><code>--rate 1000000</code>：设置扫描速率为每秒100万个数据包。根据网络性能调整（例如，较慢网络可降至<code>100000</code>）。</li><li><strong>最佳实践</strong>：建议先使用较低速率（例如<code>10000</code>）测试网络稳定性，避免压垮路由器。</li></ul><p><strong>示例<code>ip_ranges.txt</code>文件</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">104.16.0.0/12</span><br><span class="line">162.158.0.0/15</span><br><span class="line">172.64.0.0/13</span><br></pre></td></tr></table></figure><h3 id="5-处理扫描结果以识别Cloudflare反代IP"><a href="#5-处理扫描结果以识别Cloudflare反代IP" class="headerlink" title="5. 处理扫描结果以识别Cloudflare反代IP"></a>5. 处理扫描结果以识别Cloudflare反代IP</h3><p>运行提供的Python脚本（<code>checkcf.py</code>）解析XML输出，检测Cloudflare反代IP，并将结果保存到CSV文件。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python checkcf.py /home/user/scan_cf.xml /home/user/cfoutput.csv</span><br></pre></td></tr></table></figure><p><strong>说明</strong>：</p><ul><li>脚本接受两个参数：输入XML文件（<code>scan_cf.xml</code>）和输出CSV文件（<code>cfoutput.csv</code>）。</li><li>脚本解析XML提取IP:端口对，发送HTTP请求检查Cloudflare特征头，并将反代IP写入CSV。</li><li>CSV输出包含IP和端口列，便于导入其他工具进行分析。</li></ul><hr><h2 id="优化的Python脚本-checkcf-py"><a href="#优化的Python脚本-checkcf-py" class="headerlink" title="优化的Python脚本 (checkcf.py)"></a>优化的Python脚本 (<code>checkcf.py</code>)</h2><p>以下是<code>checkcf.py</code>的优化版本，改进了错误处理、性能和日志记录。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br></pre></td><td class="code"><pre><span class="line">import xml.etree.ElementTree as ET</span><br><span class="line">import requests</span><br><span class="line">import csv</span><br><span class="line">import concurrent.futures</span><br><span class="line">import logging</span><br><span class="line">import sys</span><br><span class="line">import time</span><br><span class="line">from urllib.parse import urlencode</span><br><span class="line"></span><br><span class="line"># 配置日志</span><br><span class="line">logging.basicConfig(</span><br><span class="line">    level=logging.INFO,</span><br><span class="line">    format=&#x27;%(asctime)s - %(levelname)s - %(message)s&#x27;,</span><br><span class="line">    handlers=[</span><br><span class="line">        logging.FileHandler(&#x27;checkcf.log&#x27;),</span><br><span class="line">        logging.StreamHandler()</span><br><span class="line">    ]</span><br><span class="line">)</span><br><span class="line">logger = logging.getLogger(__name__)</span><br><span class="line"></span><br><span class="line">&quot;&quot;&quot;</span><br><span class="line">前置条件：</span><br><span class="line">1. 操作系统：Linux（如Ubuntu、CentOS），masscan在Linux上性能最佳。</span><br><span class="line">2. 管理员权限：masscan需root权限运行。</span><br><span class="line">3. Python环境：Python 3.6+，建议使用virtualenv。</span><br><span class="line">4. 依赖项：安装Python包（pip install requests lxml）和masscan。</span><br><span class="line">5. 网络：稳定互联网连接，用于HTTP请求。</span><br><span class="line">6. 输入文件：masscan生成的XML文件（包含IP和开放端口）。</span><br><span class="line">&quot;&quot;&quot;</span><br><span class="line"></span><br><span class="line">def parse_xml(file_path):</span><br><span class="line">    &quot;&quot;&quot;解析XML文件，提取开放端口的IP和端口对&quot;&quot;&quot;</span><br><span class="line">    try:</span><br><span class="line">        tree = ET.parse(file_path)</span><br><span class="line">        root = tree.getroot()</span><br><span class="line">        ip_ports = []</span><br><span class="line">        </span><br><span class="line">        for host in root.findall(&#x27;host&#x27;):</span><br><span class="line">            ip = host.find(&#x27;address&#x27;).get(&#x27;addr&#x27;)</span><br><span class="line">            for port in host.find(&#x27;ports&#x27;).findall(&#x27;port&#x27;):</span><br><span class="line">                port_id = port.get(&#x27;portid&#x27;)</span><br><span class="line">                state = port.find(&#x27;state&#x27;).get(&#x27;state&#x27;)</span><br><span class="line">                if state == &#x27;open&#x27;:</span><br><span class="line">                    ip_ports.append((ip, port_id))</span><br><span class="line">        logger.info(f&quot;从XML中提取到 &#123;len(ip_ports)&#125; 个IP:端口对&quot;)</span><br><span class="line">        return ip_ports</span><br><span class="line">    except ET.ParseError as e:</span><br><span class="line">        logger.error(f&quot;解析XML文件失败: &#123;e&#125;&quot;)</span><br><span class="line">        sys.exit(1)</span><br><span class="line">    except FileNotFoundError:</span><br><span class="line">        logger.error(f&quot;未找到XML文件: &#123;file_path&#125;&quot;)</span><br><span class="line">        sys.exit(1)</span><br><span class="line"></span><br><span class="line">def check_cloudflare(ip, port, timeout=5, retries=2):</span><br><span class="line">    &quot;&quot;&quot;检查IP:端口是否为Cloudflare反代，并验证FOFA表达式&quot;&quot;&quot;</span><br><span class="line">    url = f&quot;http://&#123;ip&#125;:&#123;port&#125;&quot;</span><br><span class="line">    headers = &#123;</span><br><span class="line">        &#x27;User-Agent&#x27;: &#x27;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36&#x27;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    for attempt in range(retries):</span><br><span class="line">        try:</span><br><span class="line">            response = requests.get(url, headers=headers, timeout=timeout, allow_redirects=False)</span><br><span class="line">            server_header = response.headers.get(&#x27;Server&#x27;, &#x27;&#x27;).lower()</span><br><span class="line">            cf_ray = response.headers.get(&#x27;CF-RAY&#x27;)</span><br><span class="line">            cf_cache_status = response.headers.get(&#x27;CF-Cache-Status&#x27;)</span><br><span class="line">            status_code = response.status_code</span><br><span class="line">            </span><br><span class="line">            # 检测是否为Cloudflare反代</span><br><span class="line">            is_cloudflare = &#x27;cloudflare&#x27; in server_header or cf_ray or cf_cache_status</span><br><span class="line">            </span><br><span class="line">            # FOFA表达式：server==&quot;cloudflare&quot; &amp;&amp; header=&quot;Forbidden&quot;</span><br><span class="line">            is_fofa_match = (</span><br><span class="line">                is_cloudflare and</span><br><span class="line">                status_code == 403</span><br><span class="line">            )</span><br><span class="line">            </span><br><span class="line">            logger.debug(f&quot;检查 &#123;ip&#125;:&#123;port&#125; - Cloudflare: &#123;is_cloudflare&#125;, FOFA匹配: &#123;is_fofa_match&#125;&quot;)</span><br><span class="line">            return ip, port, is_fofa_match</span><br><span class="line">        except requests.RequestException as e:</span><br><span class="line">            logger.debug(f&quot;第 &#123;attempt + 1&#125; 次尝试失败 &#123;ip&#125;:&#123;port&#125; - &#123;str(e)&#125;&quot;)</span><br><span class="line">            if attempt == retries - 1:</span><br><span class="line">                return ip, port, False</span><br><span class="line">            time.sleep(1)</span><br><span class="line"></span><br><span class="line">def write_to_csv(results, output_file):</span><br><span class="line">    &quot;&quot;&quot;仅将FOFA匹配成功的IP和端口写入CSV&quot;&quot;&quot;</span><br><span class="line">    try:</span><br><span class="line">        with open(output_file, &#x27;w&#x27;, newline=&#x27;&#x27;, encoding=&#x27;utf-8&#x27;) as csvfile:</span><br><span class="line">            writer = csv.writer(csvfile)</span><br><span class="line">            writer.writerow([&#x27;IP&#x27;, &#x27;PORT&#x27;])</span><br><span class="line">            for ip, port, is_fofa_match in results:</span><br><span class="line">                if is_fofa_match:</span><br><span class="line">                    writer.writerow([ip, port])</span><br><span class="line">        logger.info(f&quot;FOFA匹配结果已写入 &#123;output_file&#125;&quot;)</span><br><span class="line">    except IOError as e:</span><br><span class="line">        logger.error(f&quot;写入CSV失败: &#123;e&#125;&quot;)</span><br><span class="line">        sys.exit(1)</span><br><span class="line"></span><br><span class="line">def main(xml_file, output_csv, max_threads=50, timeout=5, retries=2):</span><br><span class="line">    &quot;&quot;&quot;主函数：处理XML，检查FOFA匹配，保存结果&quot;&quot;&quot;</span><br><span class="line">    start_time = time.time()</span><br><span class="line">    logger.info(&quot;开始检测FOFA匹配的Cloudflare反代&quot;)</span><br><span class="line">    </span><br><span class="line">    # 解析XML</span><br><span class="line">    ip_ports = parse_xml(xml_file)</span><br><span class="line">    </span><br><span class="line">    # 检查Cloudflare反代和FOFA匹配</span><br><span class="line">    results = []</span><br><span class="line">    with concurrent.futures.ThreadPoolExecutor(max_workers=max_threads) as executor:</span><br><span class="line">        future_to_ip_port = &#123;</span><br><span class="line">            executor.submit(check_cloudflare, ip, port, timeout, retries): (ip, port)</span><br><span class="line">            for ip, port in ip_ports</span><br><span class="line">        &#125;</span><br><span class="line">        for future in concurrent.futures.as_completed(future_to_ip_port):</span><br><span class="line">            ip, port = future_to_ip_port[future]</span><br><span class="line">            try:</span><br><span class="line">                result = future.result()</span><br><span class="line">                results.append(result)</span><br><span class="line">                if result[2]:</span><br><span class="line">                    logger.info(f&quot;在 &#123;ip&#125;:&#123;port&#125; 检测到FOFA匹配（server==cloudflare &amp;&amp; header=Forbidden）&quot;)</span><br><span class="line">            except Exception as e:</span><br><span class="line">                logger.error(f&quot;处理 &#123;ip&#125;:&#123;port&#125; 时出错: &#123;e&#125;&quot;)</span><br><span class="line">    </span><br><span class="line">    # 写入CSV</span><br><span class="line">    write_to_csv(results, output_csv)</span><br><span class="line">    </span><br><span class="line">    elapsed_time = time.time() - start_time</span><br><span class="line">    logger.info(f&quot;完成，耗时 &#123;elapsed_time:.2f&#125; 秒&quot;)</span><br><span class="line"></span><br><span class="line">if __name__ == &quot;__main__&quot;:</span><br><span class="line">    if len(sys.argv) != 3:</span><br><span class="line">        print(&quot;用法: python checkcf.py &lt;输入XML文件&gt; &lt;输出CSV文件&gt;&quot;)</span><br><span class="line">        sys.exit(1)</span><br><span class="line">    </span><br><span class="line">    xml_file_path = sys.argv[1]</span><br><span class="line">    output_csv_path = sys.argv[2]</span><br><span class="line">    main(xml_file_path, output_csv_path)</span><br></pre></td></tr></table></figure><h3 id="脚本优化亮点"><a href="#脚本优化亮点" class="headerlink" title="脚本优化亮点"></a>脚本优化亮点</h3><ul><li><strong>日志记录</strong>：同时输出到文件（<code>checkcf.log</code>）和控制台，便于调试和记录。</li><li><strong>重试机制</strong>：为HTTP请求添加重试逻辑，处理网络不稳定问题。</li><li><strong>扩展检测</strong>：增加<code>CF-Cache-Status</code>头检查，提升Cloudflare检测准确性。</li><li><strong>性能统计</strong>：记录总执行时间，便于性能分析。</li><li><strong>错误处理</strong>：改进文件未找到和XML解析错误的处理逻辑。</li><li><strong>CSV输出</strong>：新增<code>是否Cloudflare</code>列，方便结果筛选。</li></ul><hr><h2 id="最佳实践与优化建议"><a href="#最佳实践与优化建议" class="headerlink" title="最佳实践与优化建议"></a>最佳实践与优化建议</h2><ol><li><p><strong>IP范围选择</strong>：</p><ul><li>使用Cloudflare官方公布的IP范围（可从<code>https://www.cloudflare.com/ips/</code>获取），避免无意义的扫描。</li><li>将大范围分割为较小的子范围，以管理内存和处理负载。</li></ul></li><li><p><strong>扫描速率</strong>：</p><ul><li>根据网络和硬件调整<code>--rate</code>参数。过高的速率（例如<code>1000000</code>）可能导致丢包或路由器过载。</li><li>建议先用小范围测试，找到最佳速率。</li></ul></li><li><p><strong>线程管理</strong>：</p><ul><li><code>checkcf.py</code>中的<code>max_threads</code>参数控制并发HTTP请求。性能强的系统可增加线程数（例如<code>100</code>），但需监控CPU和网络使用率。</li><li>线程过多可能导致目标服务器限速。</li></ul></li><li><p><strong>超时与重试</strong>：</p><ul><li>根据网络可靠性调整<code>timeout</code>（默认5秒）和<code>retries</code>（默认2次）。</li><li>较长的超时可能提高准确性，但会减慢处理速度。</li></ul></li><li><p><strong>结果分析</strong>：</p><ul><li>CSV输出可导入Excel或Pandas进行进一步分析。</li><li>筛选<code>是否Cloudflare=True</code>的记录用于优化任务。</li></ul></li><li><p><strong>法律与道德考量</strong>：</p><ul><li>确保有权限扫描目标IP范围。未经授权的扫描可能违反服务条款或当地法律。</li><li>避免过于激进的扫描，以免干扰服务。</li></ul></li></ol><hr><h2 id="故障排查"><a href="#故障排查" class="headerlink" title="故障排查"></a>故障排查</h2><ul><li><p><strong>Masscan无法运行</strong>：</p><ul><li>确认使用<code>sudo</code>运行。</li><li>检查<code>masscan</code>是否正确安装（运行<code>masscan --version</code>）。</li><li>确保<code>ip_ranges</code>文件存在且格式正确。</li></ul></li><li><p><strong>XML解析错误</strong>：</p><ul><li>检查<code>scan_cf.xml</code>文件是否损坏（用文本编辑器打开确认）。</li><li>确保磁盘空间足够存储大型XML文件。</li></ul></li><li><p><strong>未检测到Cloudflare IP</strong>：</p><ul><li>确认IP范围包含Cloudflare的范围。</li><li>检查端口80、443、2052是否适用于您的场景。</li><li>增加<code>checkcf.py</code>中的<code>timeout</code>或<code>retries</code>。</li></ul></li><li><p><strong>CPU或网络使用率过高</strong>：</p><ul><li>降低<code>masscan</code>的<code>--rate</code>或<code>checkcf.py</code>的<code>max_threads</code>。</li><li>在非高峰时段运行扫描。</li></ul></li></ul><hr><h2 id="示例输出"><a href="#示例输出" class="headerlink" title="示例输出"></a>示例输出</h2><h3 id="cfoutput-csv"><a href="#cfoutput-csv" class="headerlink" title="cfoutput.csv"></a><code>cfoutput.csv</code></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">IP,端口,是否Cloudflare</span><br><span class="line">104.16.1.1,443,True</span><br><span class="line">104.16.1.2,80,False</span><br><span class="line">162.158.2.3,443,True</span><br></pre></td></tr></table></figure><h3 id="checkcf-log"><a href="#checkcf-log" class="headerlink" title="checkcf.log"></a><code>checkcf.log</code></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">2025-05-03 10:00:00,123 - INFO - 开始检测Cloudflare反代</span><br><span class="line">2025-05-03 10:00:01,456 - INFO - 从XML中提取到 1000 个IP:端口对</span><br><span class="line">2025-05-03 10:00:05,789 - INFO - 在 104.16.1.1:443 检测到Cloudflare</span><br><span class="line">2025-05-03 10:00:10,234 - INFO - 结果已写入 /home/user/cfoutput.csv</span><br><span class="line">2025-05-03 10:00:10,567 - INFO - 完成，耗时 10.44 秒</span><br></pre></td></tr></table></figure><hr><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>本指南和优化的<code>checkcf.py</code>脚本为使用<code>masscan</code>扫描和识别Cloudflare反代IP提供了一个强大的解决方案。通过遵循步骤、优化参数并遵循最佳实践，您可以高效地收集用于网络优化的数据。始终确保扫描行为符合道德和法律要求。</p><p>如需进一步定制，可根据需求修改脚本以支持更多特征头、代理类型或输出格式。</p>]]>
    </content>
    <id>https://blog.eco.us.kg/2025/05/03/%E4%BC%98%E9%80%89cf/</id>
    <link href="https://blog.eco.us.kg/2025/05/03/%E4%BC%98%E9%80%89cf/"/>
    <published>2025-05-03T04:28:59.000Z</published>
    <summary>使用Masscan扫描Cloudflare反代IP的全面优化指南本指南详细介绍了如何使用masscan扫描IP范围、识别开放端口并检测Cloudflare反代的IP，以用于网络优化。指南包含每一步的详细说明、命令解析、最佳实践以及优化的Python脚本，用于处理扫描结果。本教程的目标是帮助用户高效地</summary>
    <title>优选cf</title>
    <updated>2025-05-04T03:37:24.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>King Moon</name>
    </author>
    <category term="文章" scheme="https://blog.eco.us.kg/categories/%E6%96%87%E7%AB%A0/"/>
    <content>
      <![CDATA[<p>Masscan 是一个高效的网络扫描工具，能够快速扫描大量 IP 地址。以下是 Masscan 的详细使用教程，包括所有主要参数和选项。</p><h3 id="1-安装-Masscan"><a href="#1-安装-Masscan" class="headerlink" title="1. 安装 Masscan"></a>1. 安装 Masscan</h3><p>在使用 Masscan 之前，您需要先安装它。可以通过以下命令在 Linux 系统中安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt-get install masscan</span><br></pre></td></tr></table></figure><p>或者从源代码编译：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt-get --assume-yes install git make gcc</span><br><span class="line">git <span class="built_in">clone</span> https://github.com/robertdavidgraham/masscan.git</span><br><span class="line"><span class="built_in">cd</span> masscan</span><br><span class="line">make</span><br><span class="line">make install</span><br></pre></td></tr></table></figure><h3 id="2-基本用法"><a href="#2-基本用法" class="headerlink" title="2. 基本用法"></a>2. 基本用法</h3><p>Masscan 的基本语法如下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">masscan &lt;ip范围&gt; -p &lt;端口&gt;</span><br></pre></td></tr></table></figure><p><strong>示例</strong>：扫描整个 192.168.1.0&#x2F;24 网段的 80 端口。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">masscan 192.168.1.0/24 -p80</span><br></pre></td></tr></table></figure><h3 id="3-常用参数"><a href="#3-常用参数" class="headerlink" title="3. 常用参数"></a>3. 常用参数</h3><p>以下是 Masscan 的常用参数及其说明：</p><h4 id="3-1-扫描目标"><a href="#3-1-扫描目标" class="headerlink" title="3.1 扫描目标"></a>3.1 扫描目标</h4><ul><li><code>&lt;ip范围&gt;</code>: 指定要扫描的 IP 地址范围，例如 <code>192.168.1.0/24</code> 或 <code>10.0.0.1-10.0.0.254</code>。</li></ul><h4 id="3-2-扫描端口"><a href="#3-2-扫描端口" class="headerlink" title="3.2 扫描端口"></a>3.2 扫描端口</h4><ul><li><p><code>-p &lt;端口&gt;</code>: 指定要扫描的端口，可以是单个端口、多个端口（用逗号分隔）或端口范围。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">-p80               <span class="comment"># 扫描80端口</span></span><br><span class="line">-p80,443          <span class="comment"># 扫描80和443端口</span></span><br><span class="line">-p1-100           <span class="comment"># 扫描1到100的所有端口</span></span><br></pre></td></tr></table></figure></li></ul><h4 id="3-3-输出格式"><a href="#3-3-输出格式" class="headerlink" title="3.3 输出格式"></a>3.3 输出格式</h4><ul><li><p><code>-oX &lt;文件名&gt;</code>: 输出为 XML 格式。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">masscan -p80 -oX results.xml</span><br></pre></td></tr></table></figure></li><li><p><code>-oJ &lt;文件名&gt;</code>: 输出为 JSON 格式。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">masscan -p80 -oJ results.json</span><br></pre></td></tr></table></figure></li><li><p><code>-oG &lt;文件名&gt;</code>: 输出为 grepable 格式。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">masscan -p80 -oG results.grep</span><br></pre></td></tr></table></figure></li><li><p><code>-oL &lt;文件名&gt;</code>: 输出为普通文本格式（默认）。</p></li></ul><h4 id="3-4-扫描速率"><a href="#3-4-扫描速率" class="headerlink" title="3.4 扫描速率"></a>3.4 扫描速率</h4><ul><li><p><code>--rate &lt;速率&gt;</code>: 设置每秒发送的包数量，默认值为 10000。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">masscan --rate=1000 &lt;ip范围&gt; -p&lt;端口&gt;</span><br></pre></td></tr></table></figure></li></ul><h4 id="3-5-网络接口"><a href="#3-5-网络接口" class="headerlink" title="3.5 网络接口"></a>3.5 网络接口</h4><ul><li><p><code>--interface &lt;接口名&gt;</code>: 指定要使用的网络接口。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">masscan --interface=eth0 &lt;ip范围&gt; -p&lt;端口&gt;</span><br></pre></td></tr></table></figure></li></ul><h4 id="3-6-排除特定-IP"><a href="#3-6-排除特定-IP" class="headerlink" title="3.6 排除特定 IP"></a>3.6 排除特定 IP</h4><ul><li><p><code>--exclude &lt;ip地址&gt;</code>: 排除特定 IP 地址或范围。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">masscan &lt;ip范围&gt; -p&lt;端口&gt; --exclude &lt;排除的IP&gt;</span><br></pre></td></tr></table></figure></li></ul><h3 id="4-高级选项"><a href="#4-高级选项" class="headerlink" title="4. 高级选项"></a>4. 高级选项</h3><h4 id="4-1-TCP-标志设置"><a href="#4-1-TCP-标志设置" class="headerlink" title="4.1 TCP 标志设置"></a>4.1 TCP 标志设置</h4><ul><li><code>--tcp-flags &lt;flags&gt;</code>: 设置 TCP 标志，例如 SYN、ACK 等。</li></ul><h4 id="4-2-自定义数据包大小"><a href="#4-2-自定义数据包大小" class="headerlink" title="4.2 自定义数据包大小"></a>4.2 自定义数据包大小</h4><ul><li><code>--packet-size &lt;大小&gt;</code>: 设置自定义数据包大小（默认是无）。</li></ul><h4 id="4-3-自定义源端口"><a href="#4-3-自定义源端口" class="headerlink" title="4.3 自定义源端口"></a>4.3 自定义源端口</h4><ul><li><code>--source-port &lt;端口&gt;</code>: 指定源端口。</li></ul><h4 id="4-4-DNS-查询"><a href="#4-4-DNS-查询" class="headerlink" title="4.4 DNS 查询"></a>4.4 DNS 查询</h4><ul><li><code>--dns-server &lt;IP&gt;</code>: 指定 DNS 查询服务器。</li></ul><h3 id="示例命令"><a href="#示例命令" class="headerlink" title="示例命令"></a>示例命令</h3><p>以下是一些示例命令，展示如何结合使用这些参数：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 扫描整个子网的80和443端口，并输出为XML格式</span></span><br><span class="line">masscan 192.168.1.0/24 -p80,443 -oX scan_results.xml</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置扫描速率为5000，排除特定IP，并输出为JSON格式</span></span><br><span class="line">masscan --rate=5000 --exclude=192.168.1.5 192.168.1.0/24 -p1-100 -oJ scan_results.json</span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定网络接口并扫描特定IP范围的特定端口</span></span><br><span class="line">masscan --interface=eth0 --rate=1000 -p22,80,443 10.0.0.1/24 </span><br></pre></td></tr></table></figure><h3 id="进阶命令"><a href="#进阶命令" class="headerlink" title="进阶命令"></a>进阶命令</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 扫描cn2 gia开放443端口的ip</span></span><br><span class="line">masscan -iL cn2.txt -p443 -oX scan_AS4809_2024-10-6.xml --rate 10000</span><br></pre></td></tr></table></figure><p>调用he.net查询ASN IP段，以下是一些常用的ASN</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#CN2</span></span><br><span class="line">4809</span><br><span class="line"><span class="comment">#阿里云</span></span><br><span class="line">45102</span><br><span class="line"><span class="comment">#甲骨文</span></span><br><span class="line">31898</span><br><span class="line"><span class="comment">#搬瓦工</span></span><br><span class="line">25820</span><br></pre></td></tr></table></figure><p>安装python依赖</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install requests BeautifulSoup4</span><br></pre></td></tr></table></figure><p>使用python查询asn的ip段</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> bs4 <span class="keyword">import</span> BeautifulSoup</span><br><span class="line"><span class="keyword">import</span> csv</span><br><span class="line"></span><br><span class="line"><span class="comment"># 目标URL</span></span><br><span class="line">asn = <span class="string">&quot;AS4809&quot;</span></span><br><span class="line">url = <span class="string">f&quot;https://bgp.he.net/<span class="subst">&#123;asn&#125;</span>#_prefixes&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取网页内容</span></span><br><span class="line">response = requests.get(url)</span><br><span class="line">response.encoding = <span class="string">&#x27;utf-8&#x27;</span>  <span class="comment"># 确保使用utf-8编码</span></span><br><span class="line">html_content = response.text</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用BeautifulSoup解析HTML</span></span><br><span class="line">soup = BeautifulSoup(html_content, <span class="string">&quot;html.parser&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 找到目标表格</span></span><br><span class="line">table = soup.find(<span class="string">&quot;table&quot;</span>, &#123;<span class="string">&quot;id&quot;</span>: <span class="string">&quot;table_prefixes4&quot;</span>&#125;)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 准备CSV文件</span></span><br><span class="line">csv_file = <span class="string">f&quot;<span class="subst">&#123;asn&#125;</span>_prefixes.csv&quot;</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(csv_file, mode=<span class="string">&quot;w&quot;</span>, newline=<span class="string">&#x27;&#x27;</span>, encoding=<span class="string">&quot;utf-8&quot;</span>) <span class="keyword">as</span> file:</span><br><span class="line">    writer = csv.writer(file)</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 写入表头</span></span><br><span class="line">    headers = [<span class="string">&quot;Prefix&quot;</span>, <span class="string">&quot;Description&quot;</span>, <span class="string">&quot;Country&quot;</span>]</span><br><span class="line">    writer.writerow(headers)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 写入表格内容</span></span><br><span class="line">    <span class="keyword">for</span> row <span class="keyword">in</span> table.find_all(<span class="string">&quot;tr&quot;</span>)[<span class="number">1</span>:]:  <span class="comment"># 跳过表头</span></span><br><span class="line">        prefix_cell = row.find(<span class="string">&quot;td&quot;</span>, &#123;<span class="string">&quot;class&quot;</span>: <span class="string">&quot;nowrap&quot;</span>&#125;)</span><br><span class="line">        description_cell = row.find_all(<span class="string">&quot;td&quot;</span>)[<span class="number">1</span>]</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 提取前缀</span></span><br><span class="line">        prefix = prefix_cell.find(<span class="string">&quot;a&quot;</span>).get_text(strip=<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 提取描述</span></span><br><span class="line">        description = description_cell.get_text(strip=<span class="literal">True</span>).split(<span class="string">&quot;\n&quot;</span>)[<span class="number">0</span>]  <span class="comment"># 只取公司名称</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 提取国家信息</span></span><br><span class="line">        country_flag = description_cell.find(<span class="string">&quot;img&quot;</span>)</span><br><span class="line">        <span class="keyword">if</span> country_flag:</span><br><span class="line">            country = country_flag[<span class="string">&#x27;alt&#x27;</span>]</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            country = <span class="string">&quot;Unknown&quot;</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 写入到CSV</span></span><br><span class="line">        writer.writerow([prefix, description, country])</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">f&quot;表格数据已保存到 <span class="subst">&#123;csv_file&#125;</span> 文件中。&quot;</span>)</span><br></pre></td></tr></table></figure><h3 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h3><ul><li><strong>法律合规</strong>：在进行网络扫描时，请确保遵循相关法律法规，避免对目标网络造成影响。</li><li><strong>防火墙配置</strong>：在某些情况下，防火墙可能会阻止 Masscan 的扫描请求，因此需要进行适当的配置。</li></ul>]]>
    </content>
    <id>https://blog.eco.us.kg/2024/10/07/Masscan%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</id>
    <link href="https://blog.eco.us.kg/2024/10/07/Masscan%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/"/>
    <published>2024-10-07T02:20:48.000Z</published>
    <summary>Masscan 是一个高效的网络扫描工具，能够快速扫描大量 IP 地址。以下是 Masscan 的详细使用教程，包括所有主要参数和选项。 1. 安装 Masscan在使用 Masscan 之前，您需要先安装它。可以通过以下命令在 Linux 系统中安装： 1sudo apt-get install</summary>
    <title>Masscan 详细使用教程</title>
    <updated>2025-05-03T10:27:44.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>King Moon</name>
    </author>
    <category term="文章" scheme="https://blog.eco.us.kg/categories/%E6%96%87%E7%AB%A0/"/>
    <content>
      <![CDATA[<p>本文详细介绍了如何使用Hexo框架搭建一个个人博客，并将其部署到GitHub Pages和Cloudflare Pages上。主要内容包括：</p><ul><li>环境准备：安装Node.js和Git</li><li>配置Git和GitHub：设置SSH密钥，创建GitHub仓库</li><li>初始化Hexo项目：安装Hexo，创建新博客</li><li>部署到GitHub Pages：配置部署设置，推送静态文件</li><li>部署到Cloudflare Pages：连接GitHub仓库，自动部署</li><li>基本使用方法：创建新文章，本地预览，发布更新</li></ul><p>这个教程适合那些想要快速搭建个人博客，但又不想花费太多成本的人。通过使用Hexo、GitHub和Cloudflare的免费服务，您可以轻松创建一个高效、简洁的博客网站。</p><hr><h2 id="1-事前准备"><a href="#1-事前准备" class="headerlink" title="1.事前准备"></a>1.事前准备</h2><ol><li>域名（<strong>非必须</strong>，你也可以使用免费域名，或者<code>GitHub.io</code>或<code>Pages.dev</code>分配的域名也可以）</li><li><a target="_blank" rel="noopener" href="https://github.com/">GitHub</a>（<strong>必须</strong>，你需要注册一个GitHub帐号）</li><li><a target="_blank" rel="noopener" href="https://dash.cloudflare.com/">Cloudflare</a>（<strong>非必须</strong>，你需要注册一个Cloudflare帐号，这样你就可以将博客部署在CF的CDN里加速，但是你也可以直接使用<code>GitHub.io</code>分配的域名）</li></ol><hr><h2 id="2-软件支持"><a href="#2-软件支持" class="headerlink" title="2.软件支持"></a>2.软件支持</h2><ol><li><a href="./#2-1-%E5%AE%89%E8%A3%85-Node">Node</a>（<strong>必须</strong>）</li><li><a href="./#2-2-%E5%AE%89%E8%A3%85-Git">Git</a>（<strong>必须</strong>）</li><li><a target="_blank" rel="noopener" href="https://code.visualstudio.com/">VSCode</a>（<strong>非必须</strong>，这是一款轻量型的代码编辑器，可以帮助你养成一个很好的编程习惯）</li></ol><h3 id="2-1-安装-Node"><a href="#2-1-安装-Node" class="headerlink" title="2.1.安装 Node"></a>2.1.安装 Node</h3><ol><li><p>打开Node官网，下载和自己系统相配的Node的安装程序，否则会出现安装问题。下载地址：<a target="_blank" rel="noopener" href="https://nodejs.org/en">https://nodejs.org/en</a></p></li><li><p>下载后安装，安装的目录可以使用默认目录<code>C:/Program Files/nodejs/</code></p></li><li><p>安装完成后，检查是否安装成功。在键盘按下win + R键，输入CMD，然后回车，打开CMD窗口，执行<code>node -v</code>命令，看到版本信息，则说明安装成功。</p></li><li><p>修改npm源。npm下载各种模块，默认是从国处服务器下载，速度较慢，建议配置成华为云镜像源。打开CMD窗口，运行如下命令:</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm config <span class="built_in">set</span> registry https://mirrors.huaweicloud.com/repository/npm/</span><br></pre></td></tr></table></figure></li></ol><h3 id="2-2-安装-Git"><a href="#2-2-安装-Git" class="headerlink" title="2.2.安装 Git"></a>2.2.安装 Git</h3><ol><li><p>进入官网下载适合你当前系统的 Git：<a target="_blank" rel="noopener" href="https://git-scm.com/downloads">https://git-scm.com/downloads</a></p></li><li><p>下载后傻瓜式安装Git即可，安装的目录最好使用默认目录<code>C:/Program Files/Git</code></p></li><li><p>点击电脑左下角开始即可看见<code>Git CMD</code>、<code>Git Bash</code>、<code>Git GUI</code>。</p><ul><li><code>Git CMD</code> 是windows 命令行的指令风格</li><li><code>Git Bash</code> 是linux系统的指令风格（建议使用）</li><li><code>Git GUI</code>是图形化界面（新手学习不建议使用）</li></ul></li></ol><hr><h2 id="3-配置-Git-密钥并连接至-Github"><a href="#3-配置-Git-密钥并连接至-Github" class="headerlink" title="3.配置 Git 密钥并连接至 Github"></a>3.配置 Git 密钥并连接至 Github</h2><p>常用 Git 命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git config -l  //查看所有配置</span><br><span class="line">git config --system --list //查看系统配置</span><br><span class="line">git config --global --list //查看用户（全局）配置</span><br></pre></td></tr></table></figure><h3 id="3-1-配置用户名和邮箱"><a href="#3-1-配置用户名和邮箱" class="headerlink" title="3.1. 配置用户名和邮箱"></a>3.1. 配置用户名和邮箱</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git config --global user.name <span class="string">&quot;你的用户名&quot;</span></span><br><span class="line">git config --global user.email <span class="string">&quot;你的邮箱&quot;</span></span><br></pre></td></tr></table></figure><p>通过<code>git config -l</code> 检查是否配置成功。</p><h3 id="3-2-配置公钥连接Github"><a href="#3-2-配置公钥连接Github" class="headerlink" title="3.2. 配置公钥连接Github"></a>3.2. 配置公钥连接Github</h3><ol><li><p>执行以下命令生成ssh公钥，此公钥用于你的计算机连接Github</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t rsa -C <span class="string">&quot;你的邮箱&quot;</span></span><br></pre></td></tr></table></figure></li></ol><ul><li><code>id_rsa</code>私钥</li><li><code>id_rsa.pub</code>公钥<br>用记事本打开上述图片中的公钥<code>id_rsa.pub</code>，复制里面的内容，然后开始在github中配置ssh密钥。</li></ul><ol><li><p>将 SSH KEY 配置到 GitHub<br>进入github，点击右上角头像 选择<code>settings</code>，进入设置页后选择 <code>SSH and GPG keys</code>，名字随便起，公钥填到<code>Key</code>那一栏。</p></li><li><p>测试连接，输入以下命令</p></li></ol><p>第一次连接会提示<code>Are you sure you want to continue connecting (yes/no/[fingerprint])?</code>，输入<code>yes</code>即可<br>出现连接到账户的信息，说明已经大功告成，至此完成了环境准备工作。</p><pre><code><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh -T git@github.com</span><br></pre></td></tr></table></figure></code></pre><h3 id="3-3-创建GitHub-io仓库"><a href="#3-3-创建GitHub-io仓库" class="headerlink" title="3.3. 创建GitHub.io仓库"></a>3.3. 创建GitHub.io仓库</h3><ol><li>点击右上角的<code>+</code>按钮，选择<strong>New repository</strong>，创建一个<code>&lt;用户名&gt;.github.io</code>的仓库。</li><li>仓库名字的格式必须为：<code>&lt;用户名&gt;.github.io</code> (注意：前缀必须为用户名，此为预览博客需要，后期可修改仓库名)</li><li>可见性必须选择 <code>Public</code> 方便第一次部署检查问题，点击 <strong>Creat repository</strong> 进行创建即可</li></ol><hr><h2 id="4-初始化-Hexo-博客"><a href="#4-初始化-Hexo-博客" class="headerlink" title="4.初始化 Hexo 博客"></a>4.初始化 Hexo 博客</h2><ol><li><p>创建一个文件夹来保存博客源码（我这里选的路径为<code>D:/Hexo-Blog</code>），在文件夹内右键鼠标，选择<code>Open Git Bash here</code></p></li><li><p>在<code>Git BASH</code>输入如下命令安装 Hexo</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -g hexo-cli &amp;&amp; hexo -v</span><br></pre></td></tr></table></figure></li><li><p>安装完后输入<code>hexo -v</code>验证是否安装成功。</p></li><li><p>初始化 Hexo 项目安装相关依赖。</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hexo init blog-demo</span><br><span class="line"><span class="built_in">cd</span> blog-demo</span><br><span class="line">npm i</span><br></pre></td></tr></table></figure></li><li><p>初始化项目后，<code>blog-demo</code>有如下结构：</p></li></ol><ul><li><strong>node_modules</strong>：依赖包</li><li><strong>scaffolds</strong>：生成文章的一些模板</li><li><strong>source</strong>：用来存放你的文章</li><li><strong>themes</strong>：主题</li><li><strong>.npmignore</strong>：发布时忽略的文件（可忽略）</li><li><strong>_config.landscape.yml</strong>：主题的配置文件</li><li><strong>config.yml</strong>：博客的配置文件</li><li><strong>package.json</strong>：项目名称、描述、版本、运行和开发等信</li></ul><ol><li><p>输入<code>hexo cl &amp;&amp; hexo s</code>启动项目</p></li><li><p>打开浏览器，输入地址：<a target="_blank" rel="noopener" href="http://localhost:4000/">http://localhost:4000/</a> ，看到下面的效果，说明你的博客已经构建成功了。</p></li></ol><hr><h2 id="5-将静态博客挂载到-GitHub-Pages"><a href="#5-将静态博客挂载到-GitHub-Pages" class="headerlink" title="5.将静态博客挂载到 GitHub Pages"></a>5.将静态博客挂载到 GitHub Pages</h2><ol><li><p>安装 hexo-deployer-git</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-deployer-git --save</span><br></pre></td></tr></table></figure></li><li><p>修改 <code>_config.yml</code> 文件<br>在blog-demo目录下的_config.yml，就是整个Hexo框架的配置文件了。可以在里面修改大部分的配置。详细可参考官方的<a target="_blank" rel="noopener" href="https://hexo.io/zh-cn/docs/configuration">配置描述</a>。<br>修改最后一行的配置，将repository修改为你自己的github项目地址即可，还有分支要改为<code>main</code>代表主分支（注意缩进）。</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">deploy:</span><br><span class="line">  <span class="built_in">type</span>: git</span><br><span class="line">  repository: git@github.com:kingmoon3/kingmoon3.github.io.git</span><br><span class="line">  branch: main</span><br></pre></td></tr></table></figure></li><li><p>修改好配置后，运行如下命令，将代码部署到 GitHub（Hexo三连）。</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">// Git BASH终端</span><br><span class="line">hexo clean &amp;&amp; hexo generate &amp;&amp; hexo deploy  </span><br><span class="line"></span><br><span class="line">// 或者</span><br><span class="line"></span><br><span class="line">// VSCODE终端</span><br><span class="line">hexo cl; hexo g; hexo d</span><br></pre></td></tr></table></figure></li></ol><ul><li><strong>hexo clean</strong>：删除之前生成的文件，可以用<code>hexo cl</code>缩写。</li><li><strong>hexo generate</strong>：生成静态文章，可以用<code>hexo g</code>缩写</li><li><strong>hexo deploy</strong>：部署文章，可以用<code>hexo d</code>缩写<em>注意：deploy时可能要你输入 username 和 password。</em></li></ul><p>如果出现<strong>Deploy done</strong>，则说明部署成功了。</p><p>稍等两分钟，打开浏览器访问：<a target="_blank" rel="noopener" href="https://kingmoon3.github.io/">https://kingmoon3.github.io</a> ，这时候我们就可以看到博客内容了。</p><hr><h2 id="6-将静态博客挂载到-Cloudflare-Pages"><a href="#6-将静态博客挂载到-Cloudflare-Pages" class="headerlink" title="6.将静态博客挂载到 Cloudflare Pages"></a>6.将静态博客挂载到 Cloudflare Pages</h2><ol><li><p>在 <code>Workers 和 Pages</code> 中选择 <code>Pages</code> 的 <code>连接到 Git</code></p></li><li><p>然后登录你Blog仓库对应的GitHub帐号</p></li><li><p>点击<code>保存并部署</code>后等待部署完成即可。</p></li><li><p>提示<code>成功！您的项目已部署到以下区域：全球</code>后，浏览器访问：<a target="_blank" rel="noopener" href="https://kingmoon3-github-io.pages.dev/">https://kingmoon3-github-io.pages.dev</a> ，这时候我们就可以看到博客内容了。</p><p> <em>这时你也就可以将你的<code>&lt;用户名&gt;.github.io</code>的仓库设置为<code>Private</code>私库了</em></p></li><li><p>如果你有自己的域名，你可以在这里绑定你自己的自定义域，即可</p></li></ol><hr><h1 id="如何使用"><a href="#如何使用" class="headerlink" title="如何使用"></a>如何使用</h1><h2 id="新建一篇博文"><a href="#新建一篇博文" class="headerlink" title="新建一篇博文"></a>新建一篇博文</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo new 这是一篇新的博文</span><br></pre></td></tr></table></figure><p>然后用文本编辑器去编辑<code>_posts/这是一篇新的博文.md</code>里的内容即可，注意要使用<strong>Markdown</strong>格式书写。</p><p>详细使用方法可以查阅 <a target="_blank" rel="noopener" href="https://hexo.io/zh-cn/docs/writing">https://hexo.io/zh-cn/docs/writing</a></p><h2 id="编辑完文章保存后可以使用如下命令，生成本地页面-http-localhost-4000-，进行预览"><a href="#编辑完文章保存后可以使用如下命令，生成本地页面-http-localhost-4000-，进行预览" class="headerlink" title="编辑完文章保存后可以使用如下命令，生成本地页面 http://localhost:4000/ ，进行预览"></a>编辑完文章保存后可以使用如下命令，生成本地页面 <a target="_blank" rel="noopener" href="http://localhost:4000/">http://localhost:4000/</a> ，进行预览</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">// Git BASH终端</span><br><span class="line">hexo cl &amp;&amp; hexo s</span><br><span class="line"></span><br><span class="line">// 或者</span><br><span class="line"></span><br><span class="line">// VSCODE终端</span><br><span class="line">hexo cl; hexo s</span><br></pre></td></tr></table></figure><h2 id="确认无误后使用以下命令，将本地文章推送至GitHub仓库即可"><a href="#确认无误后使用以下命令，将本地文章推送至GitHub仓库即可" class="headerlink" title="确认无误后使用以下命令，将本地文章推送至GitHub仓库即可"></a>确认无误后使用以下命令，将本地文章推送至GitHub仓库即可</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">// Git BASH终端</span><br><span class="line">hexo cl &amp;&amp; hexo g &amp;&amp; hexo d</span><br><span class="line"></span><br><span class="line">// 或者</span><br><span class="line"></span><br><span class="line">// VSCODE终端</span><br><span class="line">hexo cl; hexo g; hexo d</span><br></pre></td></tr></table></figure><p>下一期会讲讲进阶的使用方法，<strong>主题美化</strong></p><hr><h1 id="VSCODE-终端首次执行报错"><a href="#VSCODE-终端首次执行报错" class="headerlink" title="VSCODE 终端首次执行报错"></a>VSCODE 终端首次执行报错</h1><p>使用管理员身份打开 powershell ,输入以下命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Set-ExecutionPolicy RemoteSigned</span><br></pre></td></tr></table></figure><hr><h1 id="附hexo简单命令"><a href="#附hexo简单命令" class="headerlink" title="附hexo简单命令"></a>附hexo简单命令</h1><h2 id="Hexo-博客部署教程"><a href="#Hexo-博客部署教程" class="headerlink" title="Hexo 博客部署教程"></a>Hexo 博客部署教程</h2><p>Hexo 是一个快速、简洁且高效的静态博客框架，支持 Markdown 语法，非常适合用来构建个人博客。以下是详细的 Hexo 部署教程，包括环境搭建、文章创建、生成和发布。</p><h3 id="环境准备"><a href="#环境准备" class="headerlink" title="环境准备"></a>环境准备</h3><ol><li><p><strong>安装 Node.js</strong></p><p> Hexo 依赖于 Node.js，因此首先需要在你的计算机上安装 Node.js。可以从 <a target="_blank" rel="noopener" href="https://nodejs.org/">Node.js 官网</a> 下载并安装。</p></li><li><p><strong>安装 Hexo</strong></p><p> 使用 npm（Node.js 自带的包管理工具）全局安装 Hexo。在命令行中输入以下命令：</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install -g hexo-cli</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p><strong>创建 Hexo 项目</strong></p><p> 在你想要存放博客的目录下，使用以下命令创建一个新的 Hexo 项目：</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">hexo init my-blog</span><br><span class="line"><span class="built_in">cd</span> my-blog</span><br><span class="line">npm install</span><br><span class="line"></span><br></pre></td></tr></table></figure></li></ol><h3 id="创建新文章"><a href="#创建新文章" class="headerlink" title="创建新文章"></a>创建新文章</h3><ol><li><p><strong>生成文章</strong></p><p> 在项目根目录下，使用以下命令创建一篇新文章：</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo new <span class="string">&quot;文章标题&quot;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p> 这将在 <code>source/_posts</code> 目录下生成一个名为 <code>文章标题.md</code> 的文件。</p></li><li><p><strong>撰写文章</strong></p><p> 使用支持 Markdown 的文本编辑器打开生成的 <code>.md</code> 文件，编辑内容。文件开头的 Front-matter 部分用于配置文章信息，例如：</p> <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">title:</span> <span class="string">文章标题</span></span><br><span class="line"><span class="attr">date:</span> <span class="string">YYYY-MM-DD</span> <span class="string">HH:MM:SS</span></span><br><span class="line"><span class="attr">tags:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">标签1</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">标签2</span></span><br><span class="line"><span class="attr">categories:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">分类1</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">分类2</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="meta"></span></span><br></pre></td></tr></table></figure><p> 在 Front-matter 中，确保属性和属性值之间有一个空格，以避免解析错误。</p></li></ol><h3 id="生成和预览博客"><a href="#生成和预览博客" class="headerlink" title="生成和预览博客"></a>生成和预览博客</h3><ol><li><p><strong>清理旧数据</strong></p><p> 在每次修改文章后，建议先清理旧的数据：</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo clean</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p><strong>生成静态文件</strong></p><p> 使用以下命令生成新的静态文件：</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo generate</span><br><span class="line"></span><br></pre></td></tr></table></figure><p> 或简写为：</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo g</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p><strong>启动本地服务器</strong></p><p> 启动本地服务器以预览博客：</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo server</span><br><span class="line"></span><br></pre></td></tr></table></figure><p> 然后在浏览器中访问 <code>http://localhost:4000</code> 查看效果。</p></li></ol><h3 id="部署博客"><a href="#部署博客" class="headerlink" title="部署博客"></a>部署博客</h3><ol><li><p><strong>部署到远程服务器</strong></p><p> 确保你已经在 <code>_config.yml</code> 文件中配置了部署信息，例如 GitHub Pages 或其他托管服务。然后使用以下命令进行部署：</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo deploy</span><br><span class="line"></span><br></pre></td></tr></table></figure><p> 或简写为：</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo d</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p><strong>合并生成和部署命令</strong></p><p> 如果想要同时生成和部署，可以使用以下命令：</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo d -g</span><br><span class="line"></span><br></pre></td></tr></table></figure></li></ol><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><p><a target="_blank" rel="noopener" href="https://hexo.io/zh-cn/">https://hexo.io/zh-cn/</a></p><p><a target="_blank" rel="noopener" href="https://www.fomal.cc/posts/e593433d.html">https://www.fomal.cc/posts/e593433d.html</a></p><p><a target="_blank" rel="noopener" href="https://docs.anheyu.com/">https://docs.anheyu.com/</a></p><h1 id="致谢项目"><a href="#致谢项目" class="headerlink" title="致谢项目"></a>致谢项目</h1><p><a target="_blank" rel="noopener" href="https://github.com/hexojs/hexo">https://github.com/hexojs/hexo</a></p>]]>
    </content>
    <id>https://blog.eco.us.kg/2024/10/07/%E6%90%AD%E5%BB%BAHexo%E5%8D%9A%E5%AE%A2/</id>
    <link href="https://blog.eco.us.kg/2024/10/07/%E6%90%AD%E5%BB%BAHexo%E5%8D%9A%E5%AE%A2/"/>
    <published>2024-10-07T02:20:48.000Z</published>
    <summary>本文详细介绍了如何使用Hexo框架搭建一个个人博客，并将其部署到GitHub Pages和Cloudflare Pages上。主要内容包括：  环境准备：安装Node.js和Git 配置Git和GitHub：设置SSH密钥，创建GitHub仓库 初始化Hexo项目：安装Hexo，创建新博客 部署到G</summary>
    <title>搭建Hexo博客，快速简洁高效，零成本搭建个人博客：Hexo + GitHub Pages + Cloudflare Pages 完整指南</title>
    <updated>2025-05-03T10:27:44.000Z</updated>
  </entry>
</feed>
