Skip to content

zeruns/ip-query-web

Repository files navigation

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

基于纯真IP库的精确地理定位服务
支持 IPv4 / IPv6 / 域名解析 · 双格式 API(JSON + TXT)· 自带暗色 Web 界面 · 中英文双语切换
本项目的设计与代码由 AI 辅助生成

项目简介 · 快速开始 · API 文档 · 配置说明 · 安全防护


项目简介

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 和纯文本双格式,方便集成到各类应用中
  • SEO 友好 — 支持 ?q=IP URL 参数直接查询,动态标题,每个查询结果页独立可收录
  • 网站统计 — 内置 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 Engine 20.10+ 和 Docker Compose V2。

# 1. 创建环境配置(必需!否则容器启动失败)
cp .env.example .env

# 2. 境内部署建议编辑 .env,改用国内 DNS 避免解析超时:
#     PUBLIC_DNS=223.5.5.5,119.29.29.29

# 3. 构建并启动
docker compose up -d --build

# 查看日志
docker compose logs -f

# 等待看到 "纯真IP库在线查询系统" 启动信息后访问 http://localhost:6688

注意: 首次启动时 IP 数据库可能为空,需手动触发更新或等待周一凌晨 3:00 自动更新。 ARM64 支持: node:18-alpine 多架构镜像原生支持 AMD64 / ARM64 / ARMv7。

方式三:宝塔面板

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

访问

地址 说明
http://localhost:6688 主查询界面
http://localhost:6688/?q=114.114.114.114 直接查询指定 IP(可用于分享链接或 SEO 收录)
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次/分钟)+ 安全头
  • 多层缓存加速 — 服务端 LRU 缓存 + 浏览器/ CDN HTTP 缓存头 + 客户端 500 条结果缓存

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 30000 慢速攻击超时(毫秒),DNS 解析最长可达 20s 需留余量
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 安全头 + CSP X-Frame-Options、CSP(script/img/connect-src)、HSTS、Referrer-Policy、CORS 控制

CSP 自定义域名

系统默认已允许百度统计、Google Analytics、Cloudflare、jsDelivr CDN 加载脚本和追踪像���。如需添加其他第三方服务域名,在 .env 中设置:

# 允许加载 JS 的域名(逗号分隔)
CSP_EXTRA_SCRIPT=https://sdk.example.com
# 允许加载图片/追踪像素的域名
CSP_EXTRA_IMG=https://analytics.example.com
# 允许 fetch/XHR 连接的域名
CSP_EXTRA_CONNECT=https://api.example.com

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 自动更新。

作者

Zeruns's Blog

交流群

站长交流群:767557452

VPS/云服务器推荐

需要服务器部署本项目?可参考以下推荐:

推荐阅读

许可证

GNU General Public License v3.0

About

纯真IP库在线查询系统 — 支持IPv4/IPv6/域名解析,自带暗色Web界面和RESTful API。 IP geolocation query service powered by QQWry database.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors