关于
一次请求,一个地址,一个城市级的位置,以及一份如实列出的局限。
页面返回的内容
浏览器请求 /api/ip,服务器返回四组字段:
| 分组 | 字段 | 来源 |
|---|---|---|
| 地址 | IP,IPv4 或 IPv6,私有或公网 | 连接本身,由服务器读取 |
| 位置 | 国家、地区、城市、邮政编码、纬度、经度、时区 | IP 数据库 |
| 网络 | ISP、组织、ASN、域名 | IP 数据库的连接记录 |
| 解读 | 住宅、移动、托管或企业;可能为动态或未知 | 根据 ISP 和组织名称推断 |
请求路径
- 页面发送同源的 GET /api/ip。请求体和查询字符串中都不携带地址。
- Nginx 将请求转交给应用,并在边缘代理解析出客户端地址后,通过 X-Real-IP 提供该地址。
- 应用只接受来自该请求头的地址,用严格的 IP 解析器校验,并拒绝私有或保留地址段。
- 对于公网地址,服务器向 ipwho.is 查询位置和连接字段,超时时间为四秒。
- 结果在服务器内存中缓存最多 1 小时,并以 JSON 返回。页面仅用文本节点渲染。
主接口刻意不提供地址输入框:它只报告发起调用的连接。双栈网络中,页面还会从 IPv4 回显服务取得浏览器的 IPv4 地址,并携带短时令牌、同源校验和每客户端每日限额,将其发送到单独的接口;它不是通用的地址查询服务。
连接类型如何推断
数据库并不发布“住宅”标记。页面会在 ISP、组织和域名字段中查找关键词:
| 信号 | 示例 | 标签 |
|---|---|---|
| 托管和云服务名称 | Amazon、AWS、Google Cloud、Microsoft Azure、DigitalOcean、Hetzner、Cloudflare、数据中心或托管服务商 | 数据中心 / 云 |
| 住宅接入名称 | Broadband、fibre、cable、DSL、Comcast、Charter、Verizon、China Telecom、China Unicom | 住宅宽带 |
| 移动接入名称 | Mobile、cellular、wireless、LTE、5G | 移动网络 |
| 其他具名网络 | 公司、大学或公共机构 | 企业网络 |
| 无可用名称 | 空的连接记录 | 未知 |
这是关键词启发式判断,而非注册信息查询。住宅线路的转售商可能显示为企业,移动运营商也可能销售家庭宽带,公共 DNS 解析器也可能位于 ISP 的地址段上。该标签只是对网络类型的提示,并不代表对用户的定性。
为何固定 / 非固定标记较为谨慎
没有公开数据库记录 ISP 是否为某条线路分配了静态地址。因此页面报告三种状态之一:
- 可能为非固定:住宅宽带和移动网络,这类地址通常会变化。
- 非家庭连接:托管和云网络。
- 未知:企业网络和未分类网络。
这些都不是确凿证据。住宅用户可能付费购买了静态 IP;企业也可能使用 DHCP。唯一确定的检查方式是查看 ISP 的账户记录,或连续几天观察路由器的 WAN 地址。
准确性与盲区
- 城市级,而非设备级。坐标是城市或网络的中心点,通常与实际设备相距数十公里。它们不是 GPS。
- 运营商级 NAT。如果 ISP 在众多用户之间共享一个公网地址,位置属于运营商,而非用户。
- VPN 和代理。显示的地址是出口节点。位置属于 VPN 服务商。
- 移动和卫星。这些网络通过区域网关路由流量,因此城市可能远离手机所在位置。
- IPv6。IPv6 地址以相同方式处理;数据库覆盖良好,但并不均匀。
- 记录陈旧。地址块会被重新分配。数据库可能比转移滞后数周或数月。
速率限制与缓存
上游免费接口允许本服务器每天发起有限次数的请求。页面通过三种方式降低负载:每个地址缓存 1 小时;限制并发上游请求;当服务繁忙或每日额度用尽时,仅返回 IP 并附上提示。刷新页面通常命中内存缓存,而非请求服务商。
为何页面没有地图
地图上的标记看起来精确。底层数据是城市中心点,因此标记会是一种虚假的承诺。坐标以文本形式打印,并在旁边注明精度限制。地图还需要第三方瓦片服务器,那会看到访客的地址,并向页面添加脚本。
更正
如果某个网络被错误标注或某个字段缺失,修复应落在分类表或响应映射中,而不是手工编辑页面。用于检查改动的示例包括:一个 Google 地址(数据中心)、一个 China Telecom 地址(住宅)、一个私有地址(不查询)以及一个连接记录为空的地址(未知)。