Linux命令行模式下查询DNS包括NS记录利器dig命令详解( 二 )


通过它的man page,你可以通过+multiline选项获得冗长的多行模式人性化注释的DSN的SOA记录,一般来说,
用+multiline选项获得的信息可以显示很多,就像BIND配置文件一样 。
$ dig +nocmd ogi.edu any +multiline +noall +answer
ogi.edu. 14267 IN A 129.95.59.31
ogi.edu. 14267 IN MX 5 cse.ogi.edu.
ogi.edu. 14267 IN MX 15 hermes.admin.ogi.edu.
ogi.edu. 14267 IN SOA zeal.admin.ogi.edu. hostmaster.admin.ogi.edu. (
200408230 ; serial
14400 ; refresh (4 hours)
900 ; retry (15 minutes)
3600000 ; expire (5 weeks 6 days 16 hours)
14400 ; minimum (4 hours)
)
ogi.edu. 14267 IN NS zeal.admin.ogi.edu.
ogi.edu. 14267 IN NS cse.ogi.edu.
ogi.edu. 14267 IN NS fork.admin.ogi.edu.
查找PTR记录?
可以用 -x的选项查找IP地址的主机名 。
$ dig -x 204.152.184.167 +short
mx-1.isc.org.
在这个循环中,脚本很灵活地在给出的子网中映射出名字 。
#!/bin/bash
NET=18.7.22
for n in $(seq 1 254); do
ADDR=${NET}.${n}
echo -e "${ADDR}t$(dig -x ${ADDR} +short)"
done
查询一个不同的命名服务器?
查询命令如下:
dig @ns1.google.com www.google.com
使用/etc/resolv.conf里面的记录查询
主机将从/etc/resolv.conf文件里面自动查询DNS记录
$ host www
www.madboa.com has address 65.102.49.170
但是,默认情况下,dig会产生出一些意想不到的输出 。如果你想查询本地主机名而不是全域名时候,使用
+search 选项
dig www +search
处理大部分的查询?
如果你想查询大量的主机名,你可以把它们存放在一个文本文件中(一条记录一行),使用带-f参数的dig来依
次查询 。
# 查询大量的主机名
dig -f /path/to/host-list.txt
# 相同的,更明确的输出
dig -f /path/to/host-list.txt +noall +answer
但是我要告诉你的是,dig 9.2.3以及以后的版本都不支持使用-f的选项反向查询了 。
验证DNS映射
不正确的DNS配置会给你带来很多苦恼,你可以通过如下两种方式验证你的DNS配置:
1.每个主机名应该被解析到一个IP地址,而且那个IP地址也应该反指向那个主机名 。
2.如果你子网上一个地址被反指向一个主机名,那么那个主机名也必须指向这个IP 。
对于这两条规则来说,还有一些例外情况,比如CNAME应该首先解析到另外一个主机名,而且只能指向一个IP
,有时多个主机名指向了相同的IP地址,但是那个IP只能有一个PTR记录 。
综上,这些有助于你检查你的DNS映射是否像你想象的那样工作 。
你也可以编写一个测试脚本写入你已知的主机名,如下所示,内容很简单;它执行时当捕捉到一个CNAME时它
就会中断,如果多个主机名指向同一个IP地址它会报错 。我们假设这个文件包含你的主机名叫做named-hosts

#!/bin/bash
#
# test DNS forward- and reverse-mApping
#
# edit this variable to reflect local class C subnet(s)
NETS="192.168.1 192.168.2"
# Test name to address to name validity
echo
echo -e "tname -> address -> name"
echo '----------------------------------'
while read H; do
ADDR=$(dig $H +short)
if test -n "$ADDR"; then
HOST=$(dig -x $ADDR +short)
if test "$H" = "$HOST"; then
echo -e "okt$H -> $ADDR -> $HOST"
elif test -n "$HOST"; then
echo -e "failt$H -> $ADDR -> $HOST"
else
echo -e "failt$H -> $ADDR -> [unassigned]"
fi
else
echo -e "failt$H -> [unassigned]"
fi
done < named-hosts
# Test address to name to address validity
echo
echo -e "taddress -> name -> address"
echo '-------------------------------------'
for NET in $NETS; do
for n in $(seq 1 254); do
A=${NET}.${n}
HOST=$(dig -x $A +short)
if test -n "$HOST"; then
ADDR=$(dig $HOST +short)
if test "$A" = "$ADDR"; then
echo -e "okt$A -> $HOST -> $ADDR"
elif test -n "$ADDR"; then
echo -e "failt$A -> $HOST -> $ADDR"
else
echo -e "failt$A -> $HOST -> [unassigned]"
fi
fi
done
done
有趣的dig
创建属于你自己的named.root文件
任何连接到internet 的DNS服务器肯定会有InterNIC的named.root文件的拷贝,文件列出所有internet的根
DNS,如果你不怕麻烦的话,你可以经常从InterNIC的ftp服务器上把它下载下来,或者,你可以使用dig命令


推荐阅读