获取使用腾讯云 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暴露,可以参考以下措施加强防护:
-
严格配置防火墙:在源站服务器防火墙或安全组上,只允许腾讯云EO的回源IP访问你的服务器端口(如80、443),拒绝任何其他来源的IP直接访问。
-
验证Host头:在源站Web服务器(如Nginx)配置中,检查请求的
Host
头部字段。如果不是你的合法域名,则拒绝响应。server { listen 80 default_server; server_name _; return 444; }
-
分离服务:避免让邮件服务器、数据库、FTP等服务和Web站点使用相同的IP地址或服务器。
-
使用云服务商提供的私有回源或专线连接(如果支持),进一步隐藏源站IP。
获取使用腾讯云 EO 防护网站的真实源站 IP 测试
https://uniomo.com/archives/wei-ming-ming-wen-zhang