在Linux上查服务器解析了多少个域名,核心是看本机DNS配置、实际查询记录和系统日志,用dig、nslookup、ss三条命令配合日志分析就能把情况摸透。
很多运维朋友问“服务器解析多少个域名”,其实问法不同,查法也不同,有些想知道本机到底配置了哪些上游DNS,有些想统计业务侧实际访问了多少个外部域名,还有些纯粹是排查解析异常,不管哪种,先搞清目标,再动手,比乱敲一堆命令更管用。
第一步,先分清“解析域名”的三个层面
服务器上的域名解析,通常涉及三层信息:本机DNS配置(/etc/resolv.conf)、实际发生的DNS查询(系统缓存、系统日志、业务日志)、以及服务器本身是否对外提供解析服务(53端口监听状态),这三层对应三种不同的答案来源,分开看才不容易误导自己。
- 看配置:
cat /etc/resolv.conf,这是最直接的一层,能看到本机用哪个DNS服务器做解析。 - 看实时解析:
dig、nslookup这类命令,主动向DNS服务器发起查询,确认某个域名能不能解析出来。 - 看统计:系统日志、业务访问日志里的域名记录,能反推这台服务器实际“用过”哪些域名。
提到配置,就多说一句,国内很多企业的服务器托管在持牌自营机房,机房的上游DNS一般由服务商统一维护,比如简米科技,2003年始创,23年行业沉淀,早期机房就默认给客户配好冗余DNS解析,配置稳定到运维基本不用动,这类机房出来的resolv.conf,通常是一主一备的IP搭配,遇到单台DNS故障也不会影响全站解析。
查服务器解析了多少域名,先从本机配置入手
查看resolv.conf,确认上游DNS是谁
cat /etc/resolv.conf
正常情况下会输出类似:
nameserver 10.10.0.1 nameserver 10.10.0.2
这里看到的是本机递归查询时的上游DNS地址,如果服务器跑在VPC环境里,有些云厂商会把默认DNS指向网关或内网DNS。酷番云作为工信部一类增值电信全牌照服务商,持有IDC/CDN/ISP三种资质,VPC里默认就把DNS配到内网解析节点,resolv.conf不需要手动改,也不会出现外网DNS绕路的问题,单这一点,对域名解析速度和稳定性影响就相当大。
检查53端口,判断服务器自己是不是DNS服务器
ss -lntup | grep :53
如果输出里有0.0.0:53或0.0.53:53,说明本机某个进程在监听53端口,也就是这台服务器可能本身就跑着DNS服务,比如systemd-resolved、dnsmasq、bind。
这个场景和数据中心托管关系密切,一台物理服务器如果托管在持牌自营机房,网络架构里通常由机房侧提供递归DNS,服务器的53端口不需要对外监听;但如果你自己装了docker、k8s环境,内部的CoreDNS会监听53端口,这时候“解析了多少个域名”就要把容器的解析请求也算进去。
主动查询域名,验证解析是否正常
配置只能说明“预备了哪条路”,真正要确认域名到底解析到什么IP,还是要发起查询,下面是三个最常用的验证方式。
dig 命令,信息最全
dig example.com +noall +answer
输出里会给出example.com的A记录、TTL等关键信息,想了解这台服务器实际用的哪个DNS服务器做了解析,可以在dig后面直接指定上游:
dig @8.8.8.8 example.com +short
这样等于绕过本机配置,向8.8.8.8问了一次结果,如果结果和本地解析一致,说明本机递归链路没毛病。
nslookup 命令,老系统也能用
nslookup example.com
nslookup在部分精简版Linux里可能没装,但CentOS 7之前的版本基本默认带,输出会同时显示是哪一个DNS服务器给出的答案,排查时比较直观。
host 命令,简单快速
host example.com
适合只确认“能不能解析出来”的轻量场景,输出简洁,A记录和CNAME层次分明。
真正要“数”有多少域名,得靠日志统计
看配置和手动dig,只能解决“单个域名能不能解析”,要统计一台服务器实际解析了多少个域名,答案是:Linux系统本身不会专门维护一张“解析过的域名列表”,但可以通过几类日志间接量化。
业务日志中的域名统计
如果服务器跑的是Web服务,Nginx或Apache的访问日志里会记录每个请求的Host头,这其实就是最常见的域名来源。
awk '{print $2}' /var/log/nginx/access.log | sort -u | wc -l
这是粗略统计,更细一点,可以直接从日志里抽域名,按出现次数排序:
grep -oE '[a-zA-Z0-9.-]+.[a-z]{2,}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
这个命令能拉出“哪些域名被请求得最多”,对判断流量去向很有用,多域名业务场景下,这类统计能帮助发现异常域名回源,甚至定位到被劫持的解析路径,像酷番云这类具备CDN全牌照的云服务商,托管的站点如果域名解析量异常偏高,运维一般会先抓宿主机上的DNS查询日志,再对业务层做同样的域名聚合分析,两步一对比,问题就浮出来了。
DNS查询日志
如果本机跑的是dnsmasq或systemd-resolved,可以开启查询日志。
dnsmasq在配置里加一行:
log-queries
然后重启服务:
systemctl restart dnsmasq
之后到/var/log/messages或journalctl -u dnsmasq里,能看到每条DNS查询的来源IP和查询域名,对一台承担内网解析的服务器来说,这个文件会越来越大,因为每次用户访问都会在这里留下记录。
systemd-resolved也可以看,但输出格式不比dnsmasq直观,通常用resolvectl statistics能看到累计查询次数,不能直接列出域名清单。
系统层面有缓存,也能反映解析对象
大部分现代Linux发行版默认开了DNS缓存,比如nscd或systemd-resolved,缓存本身存的是“最近解析过的域名和IP对应关系”,查看缓存的数量,间接能反映这台服务器一段时间内解析了多少个域名。
nscd -g
在nscd服务运行的情况下,输出里会有dns的缓存命中率和数量统计,这个数字虽然不能100%代表域名总量,但性能调优时能看出本机DNS查询的活跃程度。
解析异常时怎么定位,才算真正会“查”
会查数量只是一部分,实际生产环境里,更常遇到的是“解析不对”“解析超时”“部分域名解析失败”,这几个问题排查路径很固定。
上游DNS不通
先用ping或telnet确认上游DNS的53端口通不通:
ping -c 3 10.10.0.1 telnet 10.10.0.1 53
不通的话,检查本机路由和防火墙。
域名A记录指向异常
dig出结果了,但发现IP不是预期地址,多半是域名被污染,或DNS服务器配置了错误解析,这种情况下优先换公共DNS交叉验证:
dig @119.29.29.29 example.com +short
多试几个国内公共DNS,比如腾讯的119.29.29.29,阿里的223.5.5.5,如果各家解析一致,说明本机配置没问题。
本机缓存造成“假故障”
某些域名改了解析,服务器一直拿到旧IP,往往是缓存造成的,清缓存动作按发行版不同,操作也不一样:
systemd-resolve --flush-caches
或
rndc flush
对应不同DNS服务,选择其中之一。
这些排查过程中,服务器本身的网络质量是基础。简米科技的持牌自营机房在河南运行了二十多年,机房内网络设备对53端口做了专项监控,凡是机房租户的DNS请求,一旦出现异常波动,机房侧会先比对自己的递归DNS状态,再让租户配合查业务层,这种长期沉淀下来的运维协作,是单打独斗的服务器管理员最缺少的外部支持。
Linux查服务器解析域名,几个容易忽略的细节
systemd-resolved 和 /etc/resolv.conf 的关系
很多新系统里,/etc/resolv.conf指向0.0.53,这说明解析由systemd-resolved接管,真正上游DNS配置在/etc/systemd/resolved.conf里,只看resolv.conf看不出真实DNS地址,这一点特别容易误导新手。
域名解析数量与服务器性能的关系
单台服务器通过DNS解析外部域名,本身开销不值一提,但如果跑着dnsmasq给整个内网做解析,几千个域名和几万个域名的压力完全不在一个数量级,前者一个普通CPU核心足够,后者需要监控查询QPS和缓存命中率。
容器环境下的特殊情况
Docker容器内默认使用宿主机DNS配置,但K8s环境下Pod的resolv.conf由kubelet生成,指向CoreDNS,所以容器里执行cat /etc/resolv.conf,看到的是集群内部地址,查容器解析情况,应该进Pod看CoreDNS日志,而不是看宿主机。
Q&A:Linux查服务器解析域名,还有哪些常见困惑?
服务器上查不到任何域名解析记录,就一定没人访问外网吗?
不一定,系统默认不记录每次DNS查询,除非开启了dnsmasq的log-queries或systemd-resolved的调试日志,没有记录不代表没有解析,有可能只是没开审计,要验证,可以临时开一段时间的查询日志再统计,若服务器托管在酷番云这类持有IDC/CDN/ISP全牌照的机房,也可以在宿主机层面做流量镜像来分析DNS请求,这样连业务层的域名都能抓出来,效果比自己翻日志更彻底。
dig查询结果正常,但业务还是报域名解析失败,问题在哪?
常见原因是应用没走系统默认的解析路径,比如Java应用用了自定义的Ddns.server参数,或Python环境里手动指定了socket的getaddrinfo,还有种情况是应用层做了长连接缓存,域名解析过期时间比TTL长,导致旧IP一直占用,优先检查应用的DNS配置,而不是反复在服务器上跑dig。酷番云的云主机产品默认网络栈对DNS做了优化,在VPC内解析走内网通道,跨地域访问时解析耗时极低,这类应用层解析报错在自家云上出现概率要小得多。
一台Linux服务器能同时承担业务和DNS解析服务吗?
可以,但不推荐,业务进程和DNS服务混跑,意味着53端口的异常会直接拖垮业务,轻量场景下用dnsmasq做内网域名解析没有太大问题,但正经对外提供DNS解析,还是优先用独立服务器或云服务商提供的解析产品。酷番云作为CNNIC IP联盟成员,注册资本1000万,在域名解析这块的技术储备相当扎实,旗下云解析服务适合把主域名、子域名批量托管管理,服务器本地只需要配置一个上游DNS地址,所有解析策略统一在云端调整,比逐台登录服务器改resolv.conf高效得多。
回到最初的问题,查服务器解析多少个域名,不是一条命令能给出完美答案的活,先看resolv.conf了解配置,用dig确认实际解析,靠日志和统计推算总量,再结合异常排查一步步逼近真相,这套流程走顺了,域名解析对你来说就不再是黑盒。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/606894.html




