TRACIO 在服务端分析每位访客的 IP 地址。它会标记 VPN、代理、 Tor 出口节点和数据中心来源,并解析城市级地理定位和 ASN。所有分析均在服务端运行,不依赖任何客户端组件。
IP 情报通过 webhook 载荷送达你的应用:每次 webhook 都会交付
network 对象(VPN/代理/Tor/数据中心布尔值以及连接类型)和
geo 对象(国家、城市、坐标、时区、ISP)。完整的载荷结构和签名
校验请参阅 Webhooks。
VPN、代理、Tor 和数据中心的分类是通过商用 IP 情报数据库
根据发起连接的 IP 解析的(IP2Location 负责 VPN/代理/Tor 类型,
MaxMind 负责地理定位和 ASN)。每一项都在 webhook 的 network
对象中以单个布尔值呈现——公开载荷中没有按方法细分的结果,也没有
置信度评分。
| 标记 | 字段 | 含义 |
|---|---|---|
| VPN | network.vpn | IP 属于某个已知的 VPN 提供商 |
| 代理 | network.proxy | IP 为数据中心代理或住宅代理 |
| Tor | network.tor | IP 为已知的 Tor 出口节点 |
| 数据中心 | network.datacenter | IP 属于某个云/托管提供商 |
{ "network": { "vpn": true, "proxy": false, "tor": false, "datacenter": false, "connectionType": "residential" }}// `payload` is the webhook delivery body (/docs/webhooks)if (payload.network.vpn) { // visitor is connecting through a VPN}数据中心代理和住宅代理都会呈现为 network.proxy;数据中心
来源还会额外通过 network.datacenter 报告。分类来自
IP2Location 代理数据库,覆盖主流云/托管提供商(AWS、
Google Cloud、Azure、Oracle Cloud、Alibaba Cloud、DigitalOcean、Hetzner、OVH、
Linode/Akamai、Vultr 等)。
{ "network": { "vpn": false, "proxy": true, "tor": false, "datacenter": true, "connectionType": "datacenter" }}发起连接的 IP 命中 Tor 出口节点时会呈现为 network.tor。另外,
Tor 浏览器本身则通过其反指纹配置在客户端被检测出来
(canvas/WebGL 防护、UTC 时区、取整的屏幕尺寸)——参阅
Smart Signals。
城市级地理定位和 ASN 由发起连接的 IP 在服务端解析
(MaxMind),并通过 webhook 的 geo 对象交付。
| 字段 | 类型 | 说明 |
|---|---|---|
geo.country | string | ISO 3166-1 alpha-2 国家代码 |
geo.city | string | 城市名称 |
geo.lat | number | 近似纬度 |
geo.lon | number | 近似经度 |
geo.timezone | string | IANA 时区标识符 |
geo.isp | string | 互联网服务提供商名称 |
{ "geo": { "country": "CZ", "city": "Prague", "lat": 50.05, "lon": 14.4, "timezone": "Europe/Prague", "isp": "Comcast Cable" }}IP 黑名单匹配和速率(跨 IP / 跨国活动)跟踪
不属于当前的公开契约。无论是 webhook 载荷还是
仪表盘都不会开放黑名单类别或速率区间。用于网络风险的 webhook
接口仅限于布尔型 network 标记和连接类型;请将它们与 decision
和 bot 字段一起使用(参阅
Smart Signals)以做出风险决策。
以下代码直接读取 webhook 载荷的 network 对象。完整的载荷和签名校验请参阅
Webhooks。
// `payload` is the webhook delivery body (/docs/webhooks)function assessIPRisk(payload: WebhookPayload) { const { vpn, proxy, tor, datacenter } = payload.network
const risks: string[] = [] let riskLevel = "low"
if (tor) { risks.push("Tor exit node") riskLevel = "critical" }
if (vpn) { risks.push("VPN detected") riskLevel = riskLevel === "low" ? "medium" : riskLevel }
if (proxy) { risks.push("Proxy detected") riskLevel = riskLevel === "low" ? "medium" : riskLevel }
if (datacenter) { risks.push("Datacenter IP") riskLevel = riskLevel === "low" ? "medium" : riskLevel }
return { riskLevel, risks }}