Perl中使用dig和nali判断DNS解析地址归属地是否一致脚本分享
- 虚拟主机
- 2025-12-23
- 6
在运维工作中,经常需要排查DNS解析异常问题,其中判断DNS解析结果的IP地址归属地是否与预期一致是重要环节,本文将分享一个使用Perl脚本结合dig和nali工具实现自动化判断的方案,帮助运维人员快速定位问题。
环境准备
在运行脚本前,需确保系统已安装以下工具:
- dig:DNS查询工具,通常随bindutils或dnsutils包安装
- nali:IP地址归属地查询工具,可通过pip install nali或包管理器安装
- Perl:脚本运行环境,需支持open和qx等内置函数
脚本实现逻辑
脚本核心流程分为三步:
- 使用dig命令查询指定域名的解析结果
- 提取解析IP并使用nali查询归属地
- 比较IP归属地与预设目标区域的一致性
以下是完整脚本代码:


#!/usr/bin/perl use strict; use warnings; # 配置部分 my $domain = "example.com"; # 待检测域名 my $expected_region = "北京"; # 预期归属地(如:北京、上海等) # 1. 执行dig查询 my $dig_result = qx/dig +short $domain/; chomp $dig_result; # 检查dig是否返回有效IP unless ($dig_result =~ /^d{1,3}.d{1,3}.d{1,3}.d{1,3}$/) { die "错误:无法获取有效IP地址,dig返回: $dig_resultn"; } # 2. 使用nali查询归属地 my $nali_result = qx/nali $dig_result/; chomp $nali_result; # 提取归属地信息(去除IP部分) my $actual_region = $nali_result; $actual_region =~ s/^d+.d+.d+.d+s+//; # 3. 比较结果 print "域名: $domainn"; print "解析IP: $dig_resultn"; print "实际归属地: $actual_regionn"; print "预期归属地: $expected_regionn"; if ($actual_region eq $expected_region) { print " 检测通过:IP归属地与预期一致n"; } else { print " 检测失败:IP归属地与预期不一致n"; exit 1; }
脚本使用说明
- 将上述代码保存为check_dns_region.pl
- 修改配置部分的$domain和$expected_region变量
- 添加执行权限:chmod +x check_dns_region.pl
- 运行脚本:./check_dns_region.pl
输出示例
当检测通过时,输出如下:

域名: example.com 解析IP: 1.2.3.4 实际归属地: 北京 预期归属地: 北京 检测通过:IP归属地与预期一致
当检测失败时,输出如下:
域名: example.com 解析IP: 5.6.7.8 实际归属地: 上海 预期归属地: 北京 检测失败:IP归属地与预期不一致
扩展功能建议
- 批量检测:可修改脚本支持从文件读取多个域名列表
- 日志记录:增加日志功能,记录每次检测结果
- 告警机制:集成邮件或企业微信机器人,在检测失败时发送告警
- 多IP支持:处理域名返回多个IP的情况,支持全部或部分匹配
相关工具依赖说明
| 工具名称 | 功能 | 安装命令(CentOS) | 安装命令(Ubuntu) |
|---|---|---|---|
| dig | DNS查询 | yum install bindutils | apt install dnsutils |
| nali | IP归属地查询 | pip install nali 或 yum install nali | pip install nali 或 apt install nali |
相关问答FAQs
Q1: 如果域名解析返回多个IP地址,脚本如何处理?
A1: 当前脚本仅处理第一个返回的IP,如需支持多IP检测,可修改脚本逻辑,将dig结果按行分割,循环处理每个IP,并设置”全部匹配”或”任一匹配”的判断模式。
my @ips = split /n/, $dig_result; foreach my $ip (@ips) { my $nali_result = qx/nali $ip/; # 比较逻辑... }
Q2: 如何解决nali查询结果不准确的问题?
A2: nali的准确性依赖其内置的IP库,可通过以下方式优化:
- 定期更新nali:naliupdate
- 使用更精确的查询工具(如ipip)替代
- 手动维护白名单/黑名单,对特殊IP地址进行覆盖处理
- 结合多数据源交叉验证,例如同时查询nali和ipip的结果并比对