← 返回 TimeAmber
logo NodeSeekbeta

【开源】纯真IP库在线查询系统 - IP地理位置查询、本机IP查询、域名解析

开源一个纯真IP库在线查询系统,支持IP地理位置查询、本机IP查询、域名解析等,支持API接口调用。

本项目全程由AI辅助开发!

Hermes Agent 部署全指南,手把手教你搭建你的第一个AI助手:https://blog.zeruns.com/archives/939.html


项目简介

ip-query-web 是一个基于纯真 IP 数据库(qqwry.ipdb)的 IP 地理位置在线查询系统。你可以用它:

  • 查询 IP 归属地 — 输入任意 IPv4/IPv6 地址,获取国家、省份、城市、区县、运营商等信息
  • 域名解析 — 自动解析域名的 A/AAAA 记录并查询每个 IP 的地理位置
  • 获取客户端 IP — 通过 /api/myip/api/mylocation 获取访问者真实的来源 IP
  • 批量查询 — 通过 POST /api/batch 单次最多查询 50 个 IP 地址
  • API 服务 — 提供 RESTful API,支持 JSON 和纯文本双格式,方便集成到各类应用中
  • 网站统计 — 内置 PV 和 API 调用统计面板,基于 Chart.js 图表展示日/周/月/年数据
  • 自动更新 — 每周一凌晨 3:00 自动从纯真 IP 库 GitHub 仓库拉取最新数据
  • 中英文双语 — 支持中文 / English 界面切换,自动检测浏览器语言
  • 命令行工具node cli.js <IP/域名> 直接查询

适用场景

  • 获取网站访客来源信息(配合 Nginx 反代可识别真实 IP,支持 Cloudflare / 阿里云 CDN 等)
  • 为其他应用提供 IP 地理位置查询 API
  • 用作自定义查询工具或集成到自动化脚本中
  • 学习 Node.js/Express Web 开发与项目架构

安装部署

方式一:裸机安装(推荐)

# 需要 Node.js 18+
git clone https://github.com/zeruns/ip-query-web.git
cd ip-query-web
npm install --production
cp .env.example .env
node server.js

方式二:Docker 部署

# Docker Compose V2(Docker Desktop / Docker Engine 20.10+)
docker compose up -d --build

# Docker Compose V1(旧版,命令带横线)
docker-compose up -d --build

方式三:宝塔面板

在宝塔「Node 项目管理」中添加项目,启动命令 node server.js,端口 6688。

访问

地址 说明
http://localhost:6688 主查询界面
http://localhost:6688/api-docs.html API 文档(在线测试)
http://localhost:6688/stats.html 网站统计(Chart.js 图表)

在线演示

🔗 https://ip-query.zeruns.com/

功能特性

  • IPv4 / IPv6 双栈双库 — IPv4 查询使用纯真 Dat 格式(qqwry.dat),IPv6 查询使用 IPIP.net 格式(qqwry.ipdb),数据更精准
  • 域名解析 — 自动解析 A / AAAA 记录并查询每个 IP
  • 双格式 API — JSON 和纯文本(.txt)输出,适应不同场景
  • 暗色 Web 界面 — 自带查询页面、API 文档、统计面板
  • 中英文双语 — 支持中文和 English 界面切换,自动检测浏览器语言偏好
  • 命令行工具node cli.js <IP/域名> 直接查询
  • IP 库自动更新 — 每周一凌晨 3:00 自动拉取最新纯真 IP 库(支持 GitHub 镜像加速)
  • 网站统计 — PV 和 API 调用统计,基于 Chart.js 图表展示
  • 三层安全防护 — CC 防护 + 全页面分级限流(普通API 120次/分钟、DNS 30次/分钟、页面 120次/分钟)+ 安全头

API 接口

所有接口支持 JSON 和纯文本(后缀 .txt?format=txt)双格式。

接口 说明 限流(次/分钟)
GET /api/query?q=<IP或域名> 综合查询(推荐,支持IP和域名) 30
GET /api/myip 获取客户端 IP 地址(通过请求头识别) 120
GET /api/location?q=<IP> IP 查地理位置(仅支持 IP) 120
GET /api/mylocation 获取访问者来源 IP 及地理位置 120
GET /api/resolve4?q=<域名> 域名解析 IPv4 地址 30
GET /api/resolve6?q=<域名> 域名解析 IPv6 地址 30
GET /api/info 数据库版本信息 120
GET /api/status 数据库状态(含可用性检查) 120
GET /api/stats?range=daily weekly monthly yearly 网站统计数据 120
POST /api/batch 批量 IP 查询(≤50) 120
GET /health 健康检查(无限制)

调用示例

# JSON 格式 — 综合查询(支持 IP 和域名)
curl http://localhost:6688/api/query?q=8.8.8.8

# 纯文本格式
curl http://localhost:6688/api/query.txt?q=8.8.8.8

# 获取客户端 IP
curl http://localhost:6688/api/myip

# 批量查询
curl -X POST http://localhost:6688/api/batch \
  -H "Content-Type: application/json" \
  -d '{"ips":["8.8.8.8","1.1.1.1","2001:4860:4860::8888"]}'

命令行查询

node cli.js 114.114.114.114     # 查 IP 归属地
node cli.js blog.zeruns.com     # 查域名(解析 + 归属地)
node cli.js -6 ipv6.google.com  # 强制 IPv6

配置

所有配置通过环境变量或 .env 文件管理。源码中配置位于 src/config.js.env.example 包含完整模板。

cp .env.example .env   # 复制默认配置
vim .env               # 按需修改

服务配置

变量 默认值 说明
PORT 6688 服务端口
HOST :: 监听地址:::=双栈(推荐)、0.0.0.0=仅IPv4、127.0.0.1=仅本地
LOG_LEVEL info 日志级别:debuginfowarnerror

限流配置

变量 默认值 说明
RATE_LIMIT_MAX 120 普通 API 查询限流(次/分钟/单IP)
RATE_LIMIT_DNS 30 域名查询接口限流(涉及 DNS 解析,限制更严)
RATE_LIMIT_PAGE 120 页面/静态资源限流(次/分钟/单IP)

CC 防护配置

变量 默认值 说明
CC_MAX_CONCURRENT 20 单 IP 最大并发连接数,超限自动封禁
CC_BURST_WINDOW 2000 突发检测窗口(毫秒)
CC_BURST_MAX 40 窗口内最大新建连接数
CC_SLOW_TIMEOUT 15000 慢速攻击超时(毫秒),超时未完成请求视为攻击
CC_BLOCK_DURATION 60000 自动封禁时长(毫秒),默认 60 秒
CC_WHITELIST IP 白名单(逗号分隔),白名单内 IP 不受任何限制
CC_BLACKLIST IP 黑名单(逗号分隔),永远拦截

DNS 和网络配置

变量 默认值 说明
PUBLIC_DNS 8.8.8.8,8.8.4.4 域名解析用公共 DNS 服务器(逗号分隔,依次尝试)
PUBLIC_IP_SOURCES https://ipinfo.io/ip,https://api.ipify.org,https://checkip.amazonaws.com 获取公网 IP 的查询源(逗号分隔,取最快响应)

IP 库更新配置

变量 默认值 说明
GITHUB_MIRROR https://gh-proxy.com/ GitHub 镜像加速地址。境内服务器必配,境外留空直连
DATA_DIR ./data IP 数据库和统计文件存放目录

HTTPS 配置

变量 默认值 说明
SSL_KEY SSL 私钥文件路径,设置后启用 HTTPS
SSL_CERT SSL 证书文件路径

如使用 Nginx/Caddy 反向代理做 SSL 终端,这两个变量保持注释即可。

网站信息配置(静态文件)

以下配置项通过修改 HTML 静态文件完成,详见各文件内的标签:

配置项 修改位置 说明
网站域名 各 HTML 页面 <meta name="site-url"> 用于 SEO 的 canonical URL
ICP 备案号 public/components/footer.html 底部备案号链接
SEO 标题/描述/关键词 各 HTML 页面 <title><meta name="description"><meta name="keywords"> 搜索引擎优化

示例 .env

# 服务端口
PORT=6688

# 国内服务器推荐配置
GITHUB_MIRROR=https://gh-proxy.com/

# 限流调大(高并发场景)
RATE_LIMIT_MAX=300
RATE_LIMIT_DNS=60

# CC 防护调宽松
CC_MAX_CONCURRENT=50
CC_BLOCK_DURATION=30000

安全防护

系统内置三层防护链,公网部署无需额外配置:

层级 实现 功能
1 CC 防护(纯 Node) 并发限制 + 突发检测 + 慢速攻击防御 + 自动封禁 + IP 黑白名单
2 express-rate-limit 按接口类型分级限流(普通 / DNS 解析)
3 安全头 X-Frame-OptionsX-XSS-ProtectionX-Content-Type-OptionsReferrer-PolicyCORS 控制

Nginx 反向代理

建议前面加 Nginx 做 SSL 终端:

server {
    listen 443 ssl http2;
    server_name ip.example.com;

    ssl_certificate /etc/ssl/certs/example.crt;
    ssl_certificate_key /etc/ssl/private/example.key;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;

    location / {
        proxy_pass http://127.0.0.1:6688;
        proxy_http_version 1.1;
        proxy_read_timeout 60s;
    }
}

CDN 兼容

系统通过 getClientIP() 智能识别客户端真实 IP,优先级从高到低:

CDN / 代理 请求头 自动识别
Cloudflare CF-Connecting-IP
阿里云 ESA ali-real-client-ip
Cloudflare / 阿里云 / Google Cloud True-Client-IP
阿里云 CDN Ali-CDN-Real-IP
Nginx 反代 X-Real-IP
通用 X-Forwarded-For(取第一个)

使用 CDN 时需要配置两处:

1. CDN 侧 — 开启真实 IP 传递:

  • 阿里云 ESA(方法一,推荐):ESA 控制台 → 站点 → 规则设置 → 转换规则 → 托管转换 → 开启「添加真实客户端 IP 标头」,默认标头名 ali-real-client-ip
  • 阿里云 ESA(方法二):规则设置 → 转换规则 → 新增请求头规则,将真实客户端 IP 通过 X-Forwarded-For 传递。
  • Cloudflare:默认已开启,无需额外配置。

2. Nginx 侧 — 信任代理 IP:

server {
    set_real_ip_from 0.0.0.0/0;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;

    location / {
        proxy_pass http://127.0.0.1:6688;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        ...
    }
}

Cloudflare 用户将 real_ip_header 改为 CF-Connecting-IP

第三方API推荐

除了自建服务,也可以用以下第三方 IP 查询 API:第三方API推荐

项目结构

├── server.js              # Express 服务器入口
├── cli.js                 # 命令行查询工具
├── package.json           # 项目配置与依赖
├── .env.example           # 环境变量模板
├── LICENSE                # GPL-3.0 许可证
├── src/
│   ├── config.js          # 统一配置层
│   ├── ipdb.js            # IP 库查询引擎
│   ├── updater.js         # 数据库自动更新(支持镜像加速)
│   ├── ccProtection.js    # CC 防护中间件
│   ├── stats.js           # 网站统计模块
│   └── classifier.js      # 智能字段分类器
├── public/
│   ├── index.html         # 主查询页面(暗色主题)
│   ├── api-docs.html      # API 文档(在线测试)
│   ├── api-recommend.html # 第三方 API 对比
│   ├── stats.html         # 统计面板(Chart.js 图表)
│   ├── i18n.js            # 中英文双语切换
│   ├── favicon.ico        # 网站图标
│   ├── favicon.png        # 网站图标
│   └── components/        # 页头/页尾组件
└── data/                  # IP 数据库 & 统计数据

运行条件

  • Node.js 18+
  • 内存 256MB+
  • 存储 ~150MB(含 IP 库 ~40MB)
  • 系统 Linux / macOS / Windows (WSL)

数据来源

IP 地理位置数据来自 纯真 IP 库 (CZ88.NET),通过 npm 包 qqwry.ipdb 分发,每周一凌晨 3:00 自动更新。

推荐阅读

English Version of the Article: https://blog.zeruns.top/archives/91.html

  • image

  • 好长

  • 确实长

    ✉️ 站内私信 | ☃️ ☄️ ♠️ ♥️ ♦️ ♣️ ✂️ ☢️ ☣️☺️ ☹️

  • @xzxc #1 发布于2026/5/27 22:36:33

    image

    🔒 错误解析:ERR_SSL_VERSION_OR_CIPHER_MISMATCH

    这个错误的核心原因是:浏览器(客户端)与网站服务器在协商HTTPS加密连接时,无法找到双方都支持的TLS/SSL协议版本或加密套件,导致握手失败,浏览器为了安全直接阻止了访问。

    简单来说,要么是网站用了太老旧、不安全的加密方式,被现代浏览器直接拒绝;要么是你的浏览器/网络环境配置有问题,无法和服务器正常协商加密协议。


    一、如果你是访问他人网站(客户端侧排查)

    按从简单到复杂的顺序排查:

    1. 先检查系统时间和时区
      SSL证书的有效性依赖系统时间,如果你的电脑/手机时间严重错误,会导致浏览器误判证书失效,进而触发协议不兼容错误。

      • 修正方法:开启系统的“自动设置时间/时区”,确保和当前北京时间一致。
    2. 临时关闭VPN/代理/防火墙/杀毒软件
      这类工具可能会对网络流量进行“中间人”解密,修改或替换加密套件,导致握手失败。

      • 测试方法:关闭所有代理、VPN、企业防火墙或第三方杀毒软件,直接访问网站,看错误是否消失。
    3. 清理浏览器缓存和Cookie
      旧的缓存或Cookie可能保存了错误的加密连接信息,导致新的协商失败。

      • 操作:浏览器设置 → 隐私和安全 → 清除浏览数据 → 勾选“缓存文件”和“Cookie”,清除后重启浏览器。
    4. 尝试禁用浏览器的QUIC协议
      部分网络环境下,QUIC协议会干扰TLS握手,可临时禁用:

      • Chrome/Edge地址栏输入 chrome://flags/#enable-quic,将“Experimental QUIC protocol”设为Disabled,重启浏览器。
    5. 更换浏览器测试
      比如用Firefox、Safari或手机自带浏览器访问,排除当前浏览器的配置问题。如果所有浏览器都报错,基本可以确定是网站服务器的配置问题。


    二、如果你是自己运营的网站(服务端侧排查)

    这是最常见的场景,说明你的服务器加密配置不符合现代浏览器的安全要求:

    1. 检查服务器支持的TLS协议版本
      现代浏览器已默认禁用TLS 1.0/1.1,仅支持TLS 1.2和TLS 1.3。如果你的服务器只开启了旧版本协议,就会触发此错误。

      • 配置方法:
        • Nginx:修改配置文件,在ssl_protocols中只保留 TLSv1.2 TLSv1.3
        • Apache:修改ssl.conf,设置SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
        • 云服务器/CDN:在控制台的“HTTPS配置”中,禁用TLS 1.0/1.1,仅保留1.2+
    2. 更新加密套件列表
      服务器使用了浏览器不支持的弱加密套件,需要更新为现代浏览器兼容的套件。

      • 推荐套件(Nginx示例):
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
        ssl_prefer_server_ciphers off;
        
    3. 检查SSL证书配置
      部分证书签发机构已停止支持旧算法(如SHA-1),如果你的证书使用了弱算法,也可能导致协议协商失败。建议使用Let's Encrypt或正规CA签发的证书,并确保使用SHA-256算法。

    4. 测试配置兼容性
      可以使用在线工具(如SSL Labs Server Test)扫描你的网站,它会详细列出服务器支持的TLS版本、加密套件,并给出兼容性评分和修复建议。


    💡 补充说明:这个错误无法通过“添加安全例外”绕过,因为它是协议层面的不兼容,而非证书不受信任。如果是访问他人网站,最可能的情况是网站服务器的配置过时或错误,你只能等待网站管理员修复;如果是自己的网站,按上面的服务端步骤排查即可。

    需要我根据你使用的服务器(比如Nginx/Apache/CDN)给你一份直接可用的配置模板吗?

  • 顶一下,空了看

内容
预览
对照
快捷回复
图床已就绪
AC娘
洋葱头
小黄鸡
Fluent
App