Skip to content

怎么查网站服务器的 IP 归属地?站长自查指南(附 PHP 批量工具)

想查一个网站的服务器在哪,核心就两步:把域名解析成 IP,再查这个 IP 的归属地。真动手会发现一个域名可能解析出好几个 IP,有的显示"阿里云"有的显示"美国"——哪个才是真身?这篇讲清楚原理,再给一个 PHP 工具,域名丢进去,IP、省市、运营商一次列全。

一、先搞懂:域名、IP、归属地三者的关系

浏览器访问网站,第一步是 DNS 解析——把 www.example.com 换成服务器的 IP。所以"查网站服务器 IP"本质上就是一次 DNS 查询,拿到 IP 再查归属地。这里有个关键认知:

一个域名可能对应多个 IP。 套了 CDN 的网站,DNS 返回的是边缘节点 IP,不同地区解析结果可能不一样;没套 CDN 但做了多线接入的服务器也会返回多个 IP。所以多 IP 本身就是信息——大概率套了 CDN 或做了多线接入。

归属地返回的"省市 + 运营商"直接告诉你服务器在哪个机房:显示"浙江杭州 阿里云",就是托管在阿里云杭州机房;显示"美国 加利福尼亚",服务器就在海外。国内服务器还要备案,查出来在海外的大多就是没备案的站。

二、PHP 实现:域名列表换 IP 归属地表

选 PHP 是因为站长手里最容易有的环境就是它——虚拟主机、宝塔面板都自带,命令行能跑,丢到网站目录也能当网页工具用。核心就两个内置能力:dns_get_record() 做解析,file_get_contents() 调归属地接口。

php
<?php
// geo.php —— 批量查网站服务器 IP 归属地;用法: php geo.php <域名1> [域名2 ...]

function query_ipgeo(string $ip): ?array {
    $url = 'https://ip9.com.cn/get?ip=' . rawurlencode($ip);
    $ctx = stream_context_create(['http' => ['timeout' => 5]]);
    $body = @file_get_contents($url, false, $ctx);
    if ($body === false) return null;            // 网络异常
    $json = json_decode($body, true);
    if (($json['ret'] ?? 0) !== 200) return null; // 非法 IP 或限速
    return $json['data'] ?? [];
}

function lookup_domain(string $domain): void {
    $records = @dns_get_record($domain, DNS_A);   // IPv4 A 记录;IPv6 用 DNS_AAAA
    if (!$records) {
        echo "[$domain] 解析失败(域名不存在或没有 A 记录)\n";
        return;
    }
    echo "== $domain\n";
    foreach ($records as $r) {
        $ip  = $r['ip'];
        $geo = query_ipgeo($ip);
        if (!$geo) {
            echo "  $ip  查询失败(限速或网络问题)\n";
            continue;
        }
        $loc = ($geo['country'] ?? '') . ($geo['prov'] ?? '') . ($geo['city'] ?? '');
        printf("  %-16s %-10s %-14s %s\n",
            $ip, $loc, $geo['isp'] ?? '', $geo['ip_type'] ?? '');
        // ip_type 为 VIP 版字段:ISP=家庭宽带 BUS=企业宽带 IDC=机房
    }
}

if ($argc < 2) {
    echo "用法: php geo.php <域名1> [域名2 ...]\n";
    exit(1);
}
for ($i = 1; $i < $argc; $i++) {
    lookup_domain($argv[$i]);
    usleep(300000); // 限速防超免费额度(60次/分钟/IP)
}

把上面代码存成 geo.php,终端执行 php geo.php www.ip9.com.cn,会输出每个 IP 对应的省市、运营商和 IP 类型,一行一个。查 IPv6 就把 DNS_A 换成 DNS_AAAA,接口支持 IPv6 直接传。

三、结果怎么读:CDN、多线、机房一眼看穿

拿到表格后,按下面几条判断:

  • 多个 IP、归属地跨省、运营商是云厂商:几乎可断定套了 CDN——多个 IP 跨省且 isp 是云服务商,就是边缘节点,不是源站。
  • 单个 IP 且 isp 是电信/联通/移动:源站直连,就在归属地那个城市。
  • country 不是中国:服务器在海外。顺手在 beian.miit.gov.cn 查下备案,没备案 + 海外 IP 是常见组合。
  • ip_type 显示 IDC:确认是机房 IP。ip_typeip_asn 是 VIP 版字段;免费版的省市、运营商判断"国内/海外"已经够用。

看 CDN 时别钻牛角尖:查到边缘节点后不必执着"挖源站",你看到的就是访客实际访问的节点,判断"站在哪、快不快"已经足够,挖源站属于攻击前置动作。

四、落地注意事项

  • DNS 有缓存和多线路:本地 DNS 不同解析结果可能不一样,换 114.114.114.114 这类公共 DNS 再对比。
  • 批量要限速:免费接口 60 次/分钟/IP,代码里已加 0.3 秒间隔,几十个域名没问题,量大就分批。
  • 失败要容错:查询失败只打印提示不中断,别让一个域名挂掉后面全停。
  • 用途要正当:查自己/友链/联盟站点、识别钓鱼站服务器位置都没问题,拿去搞攻击就是另一回事。

总结

查网站服务器 IP 归属地是站长最常用的排查动作:确认机房、判断 CDN、识别海外服务器,一个 PHP 脚本全搞定。解析用 dns_get_record,归属地用 https://ip9.com.cn/get?ip=xxx——免费版返回国家、省市、运营商,够日常用;要机房类型(IDC/ISP/BUS)再看 VIP 版的 ip_type 字段,说明见官网 https://www.ip9.com.cn。工具在手,再有人问"这网站服务器在哪",三秒给答案。