IT技术博客大学习 共学习 共进步

nslookup通往DNS的桥梁

linux大棚-roclinux.cn 2012-08-23 00:02:38 浏览 5,624 次

    【nslookup何许人?】

    nslookup命令,是Linux里非常常用的网络命令,简而言之就是“查DNS信息用的”。

    通过man nslookup可以看到对于nslookup的官方解释是“query Internet name servers interactively”。

    【nslookup作者何许人?】

    通过man nslookup可以看到其作者是Andrew Cherenson,我寻找到了他的Linkedin主页,原来

    他是一位计算机科学的高材生,曾经就读于哈佛大学和加州大学伯克利分校。

    目前就职于ChoiceStream公司,

     【系统没有nslookup命令?】

    如果你的Linux系统没有nslookup命令,那么八成是你没有安装bind-utils包。

    直接yum install bind-utils就可以解决问题了。

    【nslookup的两种模式】

    nslookup是一个能够查询互联网域名服务器信息的程序。他有两种工作模式,即“交互模式”和“非交互模式”。

    在“交互模式”下,用户可以向域名服务器查询各类主机、域名的信息,或者输出域名中的主机列表。

    而在“非交互模式”下,用户可以针对一个主机或域名仅仅获取特定的名称或所需信息。

    【如何进入交互模式?】

    进入交互模式,总共有两种方法。

    第一种方法,直接输入nslookup命令,不加任何参数,则直接进入交互模式,此时nslookup会连接到默认的域名服务器(即/etc/resolv.conf的第一个dns地址)。

    第二种方法,是支持选定不同域名服务器的。需要设置第一个参数为“-”,然后第二个参数是设置要连接的域名服务器主机名或IP地址。

    【如何进入非交互模式?】

    如果你直接在nslookup命令后加上所要查询的IP或主机名,那么就进入了非交互模式。当然,这个时候你也可以在第二个参数位置设置所要连接的域名服务器。

    【选项和参数】

    nslookup不仅支持设置参数,也是支持设置选项(options)的。比如可以使用-query来设置查询类型为主机信息,同时设置初始超时时限为10秒:

nslookup -query=hinfo -timeout=10

    【交互模式很强大】

    1 直接查询域名

     如果你直接输入域名(以www.baidu.com举例),会有类似如下的输出:

$ nslookup
> www.baidu.com
Server:         61.139.2.69 //上连的DNS服务器
Address:        61.139.2.69#53 //上连的DNS服务器的IP地址与端口号

Non-authoritative answer: //非权威答案,即从上连DNS服务器的本地缓存中读取出的值,而非实际去查询到的值
www.baidu.com   canonical name = www.a.shifen.com. //说明www.baidu.com有个别名叫www.a.shifen.com
Name:   www.a.shifen.com //域名www.a.shifen.com
Address: 119.75.217.56 //对应的IP地址之一
Name:   www.a.shifen.com
Address: 119.75.218.77//对应的IP地址之二

    2 server [domain]

     首先nslookup会连接到当前的默认上连DNS服务器去查询domain的IP地址,并将之作为当前默认上连DNS服务器。

     另外,还有一个命令叫做lserver [domain],它与server的区别在于,它是取本地的第一台DNS服务器来查询domain的IP地址,并将之作为当前默认上连DNS服务器。(lserver中的首字母l就是local的意思)

$ nslookup
> www.baidu.com //以默认的上连DNS服务器来查询
Server:         61.139.2.69
Address:        61.139.2.69#53

Non-authoritative answer:
www.baidu.com   canonical name = www.a.shifen.com.
Name:   www.a.shifen.com
Address: 119.75.218.77 //对应的描述信息为“北京市 百度网讯科技”
Name:   www.a.shifen.com
Address: 119.75.217.56
> server 8.8.8.8 //更改了上连的DNS服务器地址
Default server: 8.8.8.8
Address: 8.8.8.8#53
> www.baidu.com ////以更改后的上连DNS服务器来查询
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
www.baidu.com   canonical name = www.a.shifen.com.
Name:   www.a.shifen.com
Address: 220.181.111.147 //对应的描述信息为“北京市(南三环洋桥电信机房) 电信”

    可见,两个不同的上连DNS服务器返回的IP地址是不同的。

    3 exit

     退出nslookup的交互模式。

    4 set all

     列出nslookup工具的常用选项的当前设置值。

> set all
Default server: 8.8.8.8 //当前的上连DNS服务器
Address: 8.8.8.8#53 //当前的上连DNS服务器的IP地址和端口

Set options:
  novc                  nodebug         nod2
  search                recurse
  timeout = 0           retry = 3       port = 53
  querytype = A         class = IN
  srchlist =

    5 set class=[value]

     可以更改查询类,而不同的类设定了不同的协议族。

IN:Internet类(默认)
CH:Chaos类
HS:Hesiod类

    一般我们最长使用IN。而Hesiod之前仅在M.I.T(Massachusetts Institute of Technology,即麻省理工学院)范围内使用,现在甚至已经无人使用。而Chaos也几乎灭绝,曾经BIND套装用Chaos来协助检查版本号信息。

    6 set [no]debug

     可以用来设置是否进入调试模式。如果set debug,则会进入到调试模式,查询过程中会显示完整的响应包以及其中的交互包。

$ nslookup
> set debug //进入调试模式
> www.baidu.com
Server:         61.139.2.69
Address:        61.139.2.69#53

------------
    QUESTIONS: //发出的查询请求
        www.baidu.com, type = A, class = IN 
    ANSWERS: //返回的信息
    ->  www.baidu.com
        canonical name = www.a.shifen.com.
        ttl = 1192
    ->  www.a.shifen.com
        internet address = 119.75.217.56
        ttl = 262
    ->  www.a.shifen.com
        internet address = 119.75.218.77
        ttl = 262
    AUTHORITY RECORDS:
    ADDITIONAL RECORDS:
------------
Non-authoritative answer:
www.baidu.com   canonical name = www.a.shifen.com.
Name:   www.a.shifen.com
Address: 119.75.217.56
Name:   www.a.shifen.com
Address: 119.75.218.77

    7 set [no]d2

     开启了高级调试模式,会输出很多nslookup内部工作的信息,包括了许多函数调用信息。

    8 set domain=[name]

     用于设置默认的域。这样的话,对于所有不包含“.”的查询请求,都会自动在尾部追查此域。

$ nslookup
> set all //首先显示上连DNS服务器信息以及所有的当前选项信息
Default server: 61.139.2.69
Address: 61.139.2.69#53
Default server: 8.8.8.8
Address: 8.8.8.8#53
Default server: 202.102.224.68
Address: 202.102.224.68#53

Set options:
  novc                  nodebug         nod2
  search                recurse
  timeout = 0           retry = 3       port = 53
  querytype = A         class = IN
  srchlist =  //可以看到srchlist(即search list为空)
> set domain=baidu.com //设置默认域为baidu.com
> image //直接查询image
Server:         61.139.2.69
Address:        61.139.2.69#53

Non-authoritative answer:
image.baidu.com canonical name = image.n.shifen.com. //可以看到已默认追加了.baidu.com域,变成了image.baidu.com
Name:   image.n.shifen.com
Address: 220.181.111.131
> set domain= //清除domain设置
> image
Server:         61.139.2.69
Address:        61.139.2.69#53

Non-authoritative answer:
Name:   image
Address: 61.139.8.100 //于是,可以发现,域名解析又被劫持了...

    9 set [no]search

     如果设置了set search,那么当查询的字串中只包含一个句点,且结尾非句点时,nslookup会将domain设置的域追加到查询字串的尾部来尝试查询。

    10 set port=[value]

     众所周知,DNS默认的服务端口是53。当某些特殊情况,此端口改变时,可以通过本命令来设置。

    11 set type=[value]

     也可以写成set querytype=[value],用于更改信息查询类型。

     默认情况下,nslookup是查询域名所对应的A记录,而如果你想查询其对应的MX记录等信息时,就需要专门设置type值了。

     目前常用的type值如下:

A:查看主机的IPv4地址
AAAA:查看主机的IPv6地址
ANY:查看关于主机域的所有信息
CNAME:查找与别名对应的正式名字
HINFO:查找主机的CPU与操作系统类型
MINFO:查找邮箱信息
MX:查找邮件交换信息
NS:查找主机域的域名服务器
PTR:查找与给定IP地址匹配的主机名
RP:查找域负责人记录
SOA:查找域内的SOA地址
UINFO:查找用户信息

    例如,针对MX类型的查询结果如下:

> set type=MX
> baidu.com //查询MX信息
Server:         61.139.2.69
Address:        61.139.2.69#53

Non-authoritative answer:
baidu.com       mail exchanger = 20 jpmx.baidu.com.
baidu.com       mail exchanger = 20 mx50.baidu.com.
baidu.com       mail exchanger = 10 mx.mailcdn.baidu.com.
baidu.com       mail exchanger = 20 mx1.baidu.com.

Authoritative answers can be found from:
> set type=A
> baidu.com //查询A记录
Server:         61.139.2.69
Address:        61.139.2.69#53

Non-authoritative answer:
Name:   baidu.com
Address: 123.125.114.144
Name:   baidu.com
Address: 220.181.111.85
Name:   baidu.com
Address: 220.181.111.86

    12 retry=[number] / timeout=[number]

     可以用来设置查询重试的次数,以及每次查询的超时时限。

    【总结】

     其实nslookup命令的man信息不长,大家仔细阅读个20、30分钟也就基本掌握了。

     nslookup命令很小,但却很实用,它是我们与DNS服务器之间很好很方便的通讯桥梁。

    谢谢!

建议继续学习

  1. 自建DNS以防止GFW干扰 (阅读 12,945)
  2. 强制刷新本地 DNS 缓存记录 (阅读 10,642)
  3. 2014年1月21日中国互联网DNS瘫痪事件原因分析 (阅读 8,224)
  4. 关于 SOCKS 代理的远端 DNS 解析 (阅读 7,745)
  5. DNS 隧道 (阅读 7,024)
  6. 什么是DNS劫持和DNS污染? (阅读 6,104)
  7. DNS解析过程及DNS TTL值 (阅读 5,904)
  8. CentOS下通过Webmin管理BIND实现DNS轮询 (阅读 5,763)
  9. dig挖出DNS的秘密 (阅读 5,621)
  10. public DNS servers (阅读 5,242)