域名劫持问题分析与解决方案

📋 问题描述

现象

  • 访问 ky.xiaojieyahu.top 会指向 au.xiaojieyahu.top 的内容
  • 新建的二级域名 asd.xiaojieyahu.top 也会显示 au.xiaojieyahu.top 的内容
  • 明明是两个不同的站点,但内容却相同

用户困惑

  • 已删除DNS泛域名解析,但问题依然存在
  • 担心是否遭受了域名劫持攻击

🔍 根本原因分析

1. DNS解析层面

# 查询结果显示
asd.xiaojieyahu.top → XXX.XXX.XXX.XXX (你的服务器IP)
ky.xiaojieyahu.top  → XXX.XXX.XXX.XXX (另一个服务器IP)

原因

  • 可能存在泛域名解析 *.xiaojieyahu.top
  • 或者有单独的A记录配置
  • DNS缓存导致删除后仍然生效

2. Nginx配置层面

通过分析服务器配置发现关键问题:

原始默认配置

# nginx默认配置文件
server {
    listen 80;
    server_name _;
    index index.html;
    root /var/www/html;
}

问题所在

  • 没有 default_server 标识
  • 当访问未配置的域名时,Nginx会选择第一个匹配的虚拟主机
  • au.xiaojieyahu.top 按字母顺序排在前面,成为了默认站点

3. Nginx虚拟主机匹配规则

访问流程:
1. 用户访问 asd.xiaojieyahu.top
2. DNS解析到服务器IP
3. 请求到达Nginx服务器
4. Nginx查找匹配的server_name
5. 找不到 asd.xiaojieyahu.top 的配置
6. 使用第一个虚拟主机 au.xiaojieyahu.top
7. 显示 au.xiaojieyahu.top 的内容

🛡️ 解决方案

方案一:修改默认虚拟主机(推荐)

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    server_name _;
    
    # SSL配置(防止SSL错误)
    ssl_certificate /path/to/your/cert/fullchain.pem;
    ssl_certificate_key /path/to/your/cert/privkey.pem;
    
    # 为未配置的域名返回404页面
    location / {
        return 404 "Domain not configured / 域名未配置";
    }
}

优点

  • ✅ 符合HTTP标准
  • ✅ 用户体验友好
  • ✅ 防止域名劫持
  • ✅ 不影响正常站点

方案二:返回444状态码(不推荐)

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    server_name _;
    return 444;  # 直接关闭连接
}

缺点

  • ❌ 浏览器显示 ERR_HTTP2_PROTOCOL_ERROR
  • ❌ 用户体验差
  • ❌ 不符合HTTP标准

方案三:DNS层面解决

  • 删除泛域名解析 *.xiaojieyahu.top
  • 删除不需要的单独A记录
  • 清除DNS缓存

🔧 实施步骤

1. 修改Nginx配置

# 编辑默认配置文件
vim /path/to/nginx/default.conf

# 测试配置
nginx -t

# 重载配置
nginx -s reload

2. 验证效果

# 测试未配置域名
curl -I -H "Host: test.yourdomain.top" http://YOUR_SERVER_IP/
# 预期结果: HTTP/1.1 404 Not Found

# 测试正常域名
curl -I -H "Host: yourdomain.top" http://YOUR_SERVER_IP/
# 预期结果: HTTP/1.1 301 Moved Permanently

3. DNS清理

  • 登录DNS管理面板(如DNSPod)
  • 删除不需要的A记录
  • 清除本地DNS缓存

📊 测试结果

修复前

未配置域名 → 显示其他站点内容 ❌
访问未配置域名 → 内容泄露风险 ❌

修复后

未配置域名 → 404 "Domain not configured / 域名未配置" ✅
正常域名 → 正常重定向到HTTPS ✅
其他已配置域名 → 正常访问 ✅

🔐 安全效果

防护措施

  1. 防止域名劫持 - 未配置域名无法访问站点内容
  2. 防止内容泄露 - 避免敏感信息被恶意域名获取
  3. SEO保护 - 防止重复内容影响搜索排名
  4. 品牌保护 - 避免恶意域名冒充官方站点

安全检查清单

  • [x] 配置默认虚拟主机
  • [x] 返回适当的HTTP状态码
  • [x] 测试未配置域名访问
  • [x] 验证正常域名功能
  • [x] 清理DNS记录
  • [x] 监控异常访问

💡 预防措施

1. DNS管理

  • 定期检查DNS记录
  • 避免使用泛域名解析(除非必要)
  • 及时删除不需要的子域名记录

2. 服务器配置

  • 始终配置默认虚拟主机
  • 使用白名单方式配置域名
  • 定期审查Nginx配置

3. 监控告警

  • 监控异常域名访问
  • 设置404错误日志告警
  • 定期检查访问日志

📝 总结

这次问题不是真正的域名劫持攻击,而是由于:

  1. DNS泛域名解析配置
  2. Nginx默认虚拟主机机制
  3. 缺乏适当的安全配置

通过修改Nginx默认配置,我们成功:

  • ✅ 阻止了未配置域名的访问
  • ✅ 保护了网站内容安全
  • ✅ 提供了用户友好的错误提示
  • ✅ 维持了正常站点的功能

这是一个典型的服务器配置安全问题,通过正确的配置可以有效防范。


创建时间:2025-09-18
问题状态:✅ 已解决
风险等级:🟡 中等(已修复)

最后修改:2025 年 09 月 18 日
如果觉得我的文章对你有用,请随意赞赏