获取使用腾讯云 EO 防护网站的真实源站 IP 测试

import dns.resolver
import requests
import socket
import re
from bs4 import BeautifulSoup

def get_historical_dns(domain):
    """
    尝试查询域名的历史DNS记录(A记录),CDN启用前的IP可能被记录。
    实际中可能需要调用SecurityTrails、DNSdumpster等服务的API(通常付费)。
    """
    print(f"[*] 尝试查询 {domain} 的历史A记录...")
    # 这里无法直接实现,通常需要第三方数据库或API
    print("提示: 可尝试手动访问以下网站查询历史记录:")
    print("  - https://securitytrails.com/ ")
    print("  - https://dnsdumpster.com/ ")
    print("  - https://viewdns.info/iphistory/ ")
    print("  - https://web.archive.org/  (Wayback Machine)\n")

def check_subdomains(domain):
    """
    检查子域名,子域名可能未使用CDN。
    """
    print(f"[*] 尝试查找 {domain} 的子域名...")
    common_subdomains = ['www', 'mail', 'ftp', 'admin', 'api', 'dev', 'test', 'blog', 'm', 'mobile', 'img', 'cdn', 'static']
    found_ips = set()
    
    for sub in common_subdomains:
        subdomain = f"{sub}.{domain}"
        try:
            # 尝试解析子域名的A记录
            answers = dns.resolver.resolve(subdomain, 'A')
            for rdata in answers:
                ip = rdata.address
                if ip:
                    print(f"  发现子域名 {subdomain} -> {ip}")
                    found_ips.add(ip)
        except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer, dns.resolver.Timeout, dns.exception.DNSException):
            continue # 子域名不存在或无法解析
        except Exception as e:
            print(f"  查询 {subdomain} 时出错: {e}")
    
    # 也可以考虑使用子域名爆破工具如Sublist3r或调用API(如Virustotal)
    print("提示: 可使用专业子域名扫描工具如 Amass, Subfinder, Sublist3r 等进行更全面探测。\n")
    return found_ips

def check_ssl_cert(domain):
    """
    通过SSL证书信息查找关联IP(并非绝对可靠)。
    """
    print(f"[*] 尝试通过SSL证书信息查找 {domain} 关联IP...")
    # 一种间接方式:查询证书透明度日志或使用censys等搜索引擎
    print("提示: 可尝试通过以下方式搜索SSL证书信息:")
    print("  - https://crt.sh  (证书透明度日志)")
    print("  - https://censys.io/ ")
    print("  - https://shodan.io/  (搜索主机)\n")
    # 注意:这些服务可能需要API密钥或付费。

def get_mx_record(domain):
    """
    获取域名的邮件服务器(MX)记录,邮件服务器有时与Web服务器在同一网络。
    """
    print(f"[*] 尝试获取 {domain} 的MX记录...")
    try:
        answers = dns.resolver.resolve(domain, 'MX')
        for rdata in answers:
            exchange = rdata.exchange.to_text()
            try:
                mx_ips = dns.resolver.resolve(exchange, 'A')
                for ip in mx_ips:
                    print(f"  MX 服务器 {exchange} -> {ip.address}")
            except:
                print(f"  MX 服务器 {exchange} (无法解析IP)")
    except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer, dns.resolver.Timeout, dns.exception.DNSException):
        print("  未找到MX记录或查询失败。")
    except Exception as e:
        print(f"  查询MX记录时出错: {e}")
    print()

def main(target_domain):
    print(f"[+] 开始对目标域名 {target_domain} 进行信息收集 (请注意法律合规性!)")
    print("-" * 60)

    # 1. 查询历史DNS记录
    get_historical_dns(target_domain)

    # 2. 检查常见子域名
    found_ips = check_subdomains(target_domain)

    # 3. 检查SSL证书信息
    check_ssl_cert(target_domain)

    # 4. 获取MX记录
    get_mx_record(target_domain)

    # 5. 直接解析当前A记录(很可能返回CDN IP)
    try:
        current_ips = dns.resolver.resolve(target_domain, 'A')
        print(f"[*] 当前域名 {target_domain} 的A记录解析结果 (很可能为CDN节点):")
        for rdata in current_ips:
            print(f"  {rdata.address}")
    except Exception as e:
        print(f"解析当前A记录失败: {e}")
    print("\n[+] 信息收集完成。请注意甄别哪些IP可能是真实源站,哪些是CDN节点。")
    print("[+] 重要提醒: 所有操作必须在获得明确授权的前提下进行!")

if __name__ == "__main__":
    target = " www.xgz.com " # 请替换成你有权测试的域名
    main(target)

⚠️ 重要注意事项

  • 信息甄别:收集到的IP地址需要仔细分析,判断是CDN节点、云服务商IP还是可能的源站IP。

🔒 如何防护(给网站管理员)

如果你担心自己的源站IP暴露,可以参考以下措施加强防护:

  1. 严格配置防火墙:在源站服务器防火墙或安全组上,只允许腾讯云EO的回源IP访问你的服务器端口(如80、443),拒绝任何其他来源的IP直接访问。

  2. 验证Host头:在源站Web服务器(如Nginx)配置中,检查请求的 Host 头部字段。如果不是你的合法域名,则拒绝响应。

    server {
        listen 80 default_server;
        server_name _;
        return 444;
    }
    
  3. 分离服务:避免让邮件服务器、数据库、FTP等服务和Web站点使用相同的IP地址或服务器。

  4. 使用云服务商提供的私有回源专线连接(如果支持),进一步隐藏源站IP。


获取使用腾讯云 EO 防护网站的真实源站 IP 测试
https://uniomo.com/archives/wei-ming-ming-wen-zhang
作者
雨落秋垣
发布于
2025年07月14日
许可协议