# IP归属地查询系统
**Repository Path**: zeruns/ip-query-web
## Basic Information
- **Project Name**: IP归属地查询系统
- **Description**: 纯真IP库在线查询系统 — 支持IPv4/IPv6/域名解析,自带暗色Web界面和RESTful API。
IP geolocation query service powered by QQWry database.
- **Primary Language**: NodeJS
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: https://blog.zeruns.com/
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2026-05-24
- **Last Updated**: 2026-05-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 纯真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 和纯文本双格式,方便集成到各类应用中
- **网站统计** — 内置 PV 和 API 调用统计面板,基于 Chart.js 图表展示日/周/月/年数据
- **自动更新** — 每周一凌晨 3:00 自动从纯真 IP 库 GitHub 仓库拉取最新数据
- **中英文双语** — 支持中文 / English 界面切换,自动检测浏览器语言
- **命令行工具** — `node cli.js ` 直接查询
### 适用场景
- 获取网站访客来源信息(配合 Nginx 反代可识别真实 IP,支持 Cloudflare / 阿里云 CDN 等)
- 为其他应用提供 IP 地理位置查询 API
- 用作自定义查询工具或集成到自动化脚本中
- 学习 Node.js/Express Web 开发与项目架构
## 安装部署
### 方式一:裸机安装(推荐)
```bash
# 需要 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。
```bash
# 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/api-docs.html` | API 文档(在线测试) |
| `http://localhost:6688/stats.html` | 网站统计(Chart.js 图表) |
## 在线演示
🔗 [https://ip-query.zeruns.com/](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 库自动更新** — 每周一凌晨 3:00 自动拉取最新纯真 IP 库(支持 GitHub 镜像加速)
- **网站统计** — PV 和 API 调用统计,基于 Chart.js 图表展示
- **三层安全防护** — CC 防护 + 全页面分级限流(普通API 120次/分钟、DNS 30次/分钟、页面 120次/分钟)+ 安全头
## API 接口
所有接口支持 JSON 和纯文本(后缀 `.txt` 或 `?format=txt`)双格式。
| 接口 | 说明 | 限流(次/分钟) |
|------|------|:---:|
| `GET /api/query?q=` | 综合查询(推荐,支持IP和域名) | 30 |
| `GET /api/myip` | 获取客户端 IP 地址(通过请求头识别) | 120 |
| `GET /api/location?q=` | 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` | 健康检查(无限制) | ∞ |
### 调用示例
```bash
# 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"]}'
```
## 命令行查询
```bash
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` 包含完整模板。
```bash
cp .env.example .env # 复制默认配置
vim .env # 按需修改
```
### 服务配置
| 变量 | 默认值 | 说明 |
|------|--------|------|
| `PORT` | `6688` | 服务端口 |
| `HOST` | `::` | 监听地址:`::`=双栈(推荐)、`0.0.0.0`=仅IPv4、`127.0.0.1`=仅本地 |
| `LOG_LEVEL` | `info` | 日志级别:`debug`、`info`、`warn`、`error` |
### 限流配置
| 变量 | 默认值 | 说明 |
|------|--------|------|
| `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 页面 `` | 用于 SEO 的 canonical URL |
| ICP 备案号 | `public/components/footer.html` | 底部备案号链接 |
| SEO 标题/描述/关键词 | 各 HTML 页面 ``、``、`` | 搜索引擎优化 |
### 示例 `.env`
```bash
# 服务端口
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` 中设置:
```bash
# 允许加载 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 终端:
```nginx
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:**
>
> ```nginx
> 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推荐](https://ip-query.zeruns.com/api-recommend.html)
## 项目结构
```
├── 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)](https://github.com/nmgliangwei/qqwry.ipdb),通过 npm 包 `qqwry.ipdb` 分发,每周一凌晨 3:00 自动更新。
## 作者
[Zeruns's Blog](https://blog.zeruns.com/)
## 交流群
**站长交流群:[767557452](https://jq.qq.com/?_wv=1027&k=wgSx4AYc)**
## VPS/云服务器推荐
需要服务器部署本项目?可参考以下推荐:
- 👉 [VPS/云服务器推荐列表](https://blog.vpszj.cn/archives/41.html)
- 👉 [阿里云服务器(优惠)](https://www.aliyun.com/minisite/goods?userCode=jdjc69nf)
## 推荐阅读
- **高性价比和便宜的VPS/云服务器推荐:** [https://blog.zeruns.com/archives/383.html](https://blog.zeruns.com/archives/383.html)
- 我的世界开服教程:[https://blog.zeruns.com/tag/mc/](https://blog.zeruns.com/tag/mc/)
- 跨境电商独立站搭建教程,WordPress外贸建站指南:[https://blog.zeruns.com/archives/889.html](https://blog.zeruns.com/archives/889.html)
- Hermes Agent 部署全指南,手把手教你搭建你的第一个AI助手:[https://blog.zeruns.com/archives/939.html](https://blog.zeruns.com/archives/939.html)
- 阿里云ESA(CDN)测评,免费不限流量,全球节点(含境内):[https://blog.zeruns.com/archives/920.html](https://blog.zeruns.com/archives/920.html)
- Discourse论坛搭建教程,零基础部署Discourse开源社区论坛网站:[https://blog.zeruns.com/archives/919.html](https://blog.zeruns.com/archives/919.html)
## 许可证
[GNU General Public License v3.0](LICENSE)