[转]Iperf 带宽性能测试使用方法与参数说明

Iperf是一个网络性能测试工具。可以测试TCP和UDP带宽质量,可以测量最大TCP带宽,具有多种参数和UDP特性,可以报告带宽,延迟抖动和数据包丢失。Iperf在linux和windows平台均有二进制版本供自由使用。

Iperf was developed by NLANRDAST as a modern alternative for measuring maximum TCP and UDP bandwidth performance. Iperf allows the tuning of various parameters and UDP characteristics. Iperf reports bandwidth, delay jitter, datagram loss.

Iperf使用方法与参数说明

参数说明

-s 以server模式启动,eg:iperf -s

-c host以client模式启动,host是server端地址,eg:iperf -c 222.35.11.23

通用参数

-f [kmKM] 分别表示以Kbits, Mbits, KBytes, MBytes显示报告,默认以Mbits为单位,eg:iperf -c 222.35.11.23 -f K

-i sec 以秒为单位显示报告间隔,eg:iperf -c 222.35.11.23 -i 2

-l 缓冲区大小,默认是8KB,eg:iperf -c 222.35.11.23 -l 16

-m 显示tcp最大mtu值

-o 将报告和错误信息输出到文件eg:iperf -c 222.35.11.23 -o ciperflog.txt

-p 指定服务器端使用的端口或客户端所连接的端口eg:iperf -s -p 9999;iperf -c 222.35.11.23 -p 9999

-u 使用udp协议

-w 指定TCP窗口大小,默认是8KB

-B 绑定一个主机地址或接口(当主机有多个地址或接口时使用该参数)

-C 兼容旧版本(当server端和client端版本不一样时使用)

-M 设定TCP数据包的最大mtu值

-N 设定TCP不延时

-V 传输ipv6数据包

server专用参数

-D 以服务方式运行iperf,eg:iperf -s -D

-R 停止iperf服务,针对-D,eg:iperf -s -R

client端专用参数

-d 同时进行双向传输测试

-n 指定传输的字节数,eg:iperf -c 222.35.11.23 -n 100000

-r 单独进行双向传输测试

-t 测试时间,默认10秒,eg:iperf -c 222.35.11.23 -t 5

-F 指定需要传输的文件

-T 指定ttl值

应用实例

使用 iperf -s 命令将 Iperf 启动为 server 模式,在客户机上使用 iperf -c启动client模式。

iperf –s

————————————————————

Server listening on TCP port 5001

TCP window size: 8.00 KByte (default)

————————————————————

iperf -c 59.128.103.56

上面使用服务端和客户端的默认设置进行测试

iperf -s -w 300K

————————————————————

Server listening on TCP port 5001

TCP window size:  300 KByte

————————————————————

iperf -c 59.128.103.56 -f K -i 2 -w 300K

设定报告间隔为2秒,服务器端和客户端的TCP窗口都开到300KB

iperf -c 59.128.103.56 -f K -i 2 -w 300K –n 1000000

测试传输约1MB数据

iperf -c 59.128.103.56 -f K -i 2 -w 300K –t 36

测试持续36秒

iperf -c 59.128.103.56 -f K -i 2 -w 300K -n 10400000 –d

测试双向的传输

iperf -c 59.128.103.56 -f K -i 2 -w 300K –u

UDP测试

其中 -i 参数的含义是周期性报告的时间间隔(interval),单位为秒;在上面的例子中,表示每隔2秒报告一次带宽等信息。

启动一个iperf服务器进程

首先要介绍的命令用来启动iperf服务器监听进程以便监听客户端连接的。命令如下:

iperf.exe -s -P 2 -i 5 -p 5999 -f k

这个命令会启动iperf,后续参数用来设定监听5999 端口(默认端口是5001), 限定iperf只允许两个连接,每5秒汇报一次连接情况。连接限制参数(-P参数)非常重要,当两个连接建立后,服务器进程就会退出。如果这个参数设定为0,那么iperf 进程将持续监听端口,并且不限制连接数量。在 Windows主机上键入该命令,会显示出如图A所示界面

图 A

简单的iperf命令 实现快速网络检测

启动一个iperf 客户端连接

iperf 的另一半就是客户端,用来连接到服务器监听端口。比如我们要连接到一台叫做 s-network1.amcs.tld 的服务器,端口为5999,连接60 秒并且每5秒显示一次状态,命令行如下:

iperf.exe -c s-network1.amcs.tld -P 1 -i 5 -p 5999 -f B -t 60 -T 1

命令启动后,s-network1 主机被用来进行网络性能检测。与Jperf GUI 界面提供的漂亮图形不同, iperf只会根据测量参数简单的报告网络带宽状况,在本例中是以 比特为单位(-f 参数)进行带宽表示的。图B显示了远程客户端与s-network1主机间的带宽性能。

图 B

简单的iperf命令 实现快速网络检测

为了应对日常便捷应用的需求,我们可以建立一个 .bat批处理文件,届时填入服务器名称即可实现快速检测。以下为实际使用的拷屏:

C:\jperf\jperf\bin>iperf
Usage: iperf [-s|-c host] [options]
Try `iperf –help’ for more information.

C:\jperf\jperf\bin>iperf –help
Usage: iperf [-s|-c host] [options]
iperf [-h|--help] [-v|--version]

Client/Server:
-f, –format    [kmKM]   format to report: Kbits, Mbits, KBytes, MBytes
-i, –interval  #        seconds between periodic bandwidth reports
-l, –len       #[KM]    length of buffer to read or write (default 8 KB)
-m, –print_mss          print TCP maximum segment size (MTU – TCP/IP header)
-o, –output    <filename> output the report or error message to this specified file
-p, –port      #        server port to listen on/connect to
-u, –udp                use UDP rather than TCP
-w, –window    #[KM]    TCP window size (socket buffer size)
-B, –bind      <host>   bind to <host>, an interface or multicast address
-C, –compatibility      for use with older versions does not sent extra msgs
-M, –mss       #        set TCP maximum segment size (MTU – 40 bytes)
-N, –nodelay            set TCP no delay, disabling Nagle’s Algorithm
-V, –IPv6Version        Set the domain to IPv6

Server specific:
-s, –server             run in server mode
-D, –daemon             run the server as a daemon
-R, –remove             remove service in win32

Client specific:
-b, –bandwidth #[KM]    for UDP, bandwidth to send at in bits/sec
(default 1 Mbit/sec, implies -u)
-c, –client    <host>   run in client mode, connecting to <host>
-d, –dualtest           Do a bidirectional test simultaneously
-n, –num       #[KM]    number of bytes to transmit (instead of -t)
-r, –tradeoff           Do a bidirectional test individually
-t, –time      #        time in seconds to transmit for (default 10 secs)
-F, –fileinput <name>   input the data to be transmitted from a file
-I, –stdin              input the data to be transmitted from stdin
-L, –listenport #       port to recieve bidirectional tests back on
-P, –parallel  #        number of parallel client threads to run
-T, –ttl       #        time-to-live, for multicast (default 1)

Miscellaneous:
-h, –help               print this message and quit
-v, –version            print version information and quit

[KM] Indicates options that support a K or M suffix for kilo- or mega-

The TCP window size option can be set by the environment variable
TCP_WINDOW_SIZE. Most other options can be set by an environment variable
IPERF_<long option name>, such as IPERF_BANDWIDTH.

[转]isic使用说明

简单说明一下isic这个软件。刚安装的时候以为就一个isic的命令,其实i只是代表ip报文的意思,软件安装后有tcpsic、esic、 icmpsic、udpsic和isic5种操作命令。所以各种命令操作主要是发送该类型的报文为主,比如isic,主要是各种ip报文,可以选择各种 ip报文字段中的内容的比例,例如IP协议版本、选项字段等。注意所有发送报文的速率跟网卡有关,我们不能控制发送报文的速率,但是可以控制每秒发送报文的个数来控制发送的流量。文档内容将以帮助文件为主,结合一两个实际的命令来解释各个命令参数的作用。

1.    tcpsic

usage: tcpsic [-v] [-D] -s [,port] -d [,port]
[-r seed] [-m ]
[-p ] [-k ] [-x ]

参数含义:

-v:显示版本号,没有多大意义,不需要配置。

-D:Debug模式,会把具体的报文内容都打印出来,一般情况下不使用,在需要确定是否有报文发出的情况下可以使用。

-s:配置源ip和端口,可以不设置端口,设置时ip和端口号中间用逗号“,”连接,ip可以用随机的ip来代替,参数是rand。

-d:配置目的ip和端口,可以不设置端口,设置时ip和端口号中间用逗号“,”连接,ip同样可以设置rand,但是运行后会报错“Failed to send packet: Invalid argument”,所以目的ip一定要设置。

-r:配置发送报文的编号,其实是一个rand这个函数一个参数,如果参数固定,那么构造报文的类型就固定了。就是说你可以固定的总是发送这一个编号的报文,如果测试中确认这个编号的报文会影响到设备,就记住这个seed编号,就可以节省构造报文的时间。这个编号在发送报文之前和完毕后都会打印出来。

-m:平均发送报文大小的最大值。200以上的参数值有效,单位kB。

-p:平均发送报文的个数,注意这个不是总数,总数需要和-x 这个参数一起决定。这里的发送的个数是指发送多少个不一样的包,包的内容不一样。不带该参数表示连续不断的发送。

-k:忽略的报文个数,就是指不发送多少个报文,这里的报文是参数-p后的报文内容。

-x:重复发送同一个报文x次。这里的报文就是-p参数后的报文内容。

注:-p、-k、-x三个参数决定了总计发送了多少个报文,假设总计报文个数为N,那么存在这样一个表达式:N=(p-k)*x。也就是说k一定要小于p,不然就没有报文发出,建议不要配置k参数。

Percentage Opts: [-F frags] [-V ] [-I ]
[-T ] [-u ] [-t ]

百分比的参数配置:

-F: 发送需要分片报文的百分比,可以直接输入数字或百分数,例如50=50%,也可以大于100,不会报错,命令可以执行。

-V: 发送错误IP版本号的报文的百分比,可以直接输入数字或百分数,例如50=50%,也可以大于100,不会报错,命令可以执行。控制不是很精确。

-I:发送含有IP选项字段的报文的百分比,可以直接输入数字或百分数,例如50=50%,也可以大于100,不会报错,命令可以执行。

-T: 发送含有TCP选项字段的报文的百分比,可以直接输入数字或百分数,例如50=50%,也可以大于100,不会报错,命令可以执行。

-u: 发送TCP的flag中urgent标志位置1的报文的百分比,可以直接输入数字或百分数,例如50=50%,也可以大于100,不会报错,命令可以执行。

-t: 发送TCP的checksum中错误的报文的百分比,可以直接输入数字或百分数,例如50=50%,也可以大于100,不会报错,命令可以执行。控制不是很精确。

注:这里的参数和参数值是针对各自的协议报文一个总的统计,在命令输入后就会有一个统计值输出,比如:-T的参数值为50,那么发送的所有TCP报文中有一半含有option字段,而IP报文不在统计之列。

ex: -s 10.10.10.10,23   -d 10.10.10.100 -I 100

will give a 100% chance of IP Options ^^^

向10.10.10.100这个地址持续不断的发送源地址为10.10.10.10,源端口为23,目的端口随机,每个IP数据包文都含有选项字段的报文。

ex: -s 10.10.10.10,23   -d 10.10.10.100 -p 100 -r 103334

向10.10.10.100这个地址发送100个源地址为10.10.10.10,源端口为23,目的端口随机,报文内容的seed编号为103334的报文。

2.    esic

usage: esic -i interface [-s ] [-d ]
[-p or 'rand'>]   [-r ]
[-c <# of pkts to send>]       [-l ]
[-m <# of pkts between printout>]

参数含义:

-i: 指定发送的接口,必须的参数,因为没有配置ip,发送的报文不知道从哪个接口送出,而且配置了接口后就可以使用了。注意:这个时候的目的地址是ff:ff:ff:ff:ff:ff,可以使用-D参数来查看,显然这样的配置导致的结果就是全网的广播风暴。

- Be careful, the source MAC defaults to your interface

and the dest MAC defaults to broadcast

这里就是说明默认的配置,源MAC为PC接口的MAC,目的MAC为广播地址。

-s: 配置源MAC地址,可以配置随机参数值rand。

-d:配置目的MAC地址,可以配置随机参数值rand。

注:它对MAC的判断不是很严格,中间用“:”或“-”连接都是正确的,不连接也可以,但是它只认后两位,例如“aabb”或“aa bb”,它会认为是“bb:00:00:00:00:00”这个MAC地址。

-p: 配置发送的协议类型编号,但是选择该参数后发包的proto是一个你配置的编号,但是它的编号和protocol的协议编号不是对应的。默认发送的是IP协议类型的数据包。

-r:配置发送报文的编号,就是说你可以固定的总是发送这一个编号的报文,如果测试中确认这个编号的报文会影响到设备,就记住这个seed编号,就可以节省构造报文的时间。这个编号在发送前会打印出来。

-c: 配置发送报文的总个数。

-l: 配置发送报文的最大长度,发送的报文length在这个参数值以内。

-m: 配置打印信息的间隔,例如-m 100表示每发送100个报文后打印一次统计信息。

examples:

esic -i eth0 -d 02:de:ad:be:ef:40 -r123 -c10000

从eth0口发出10000个seed编号123内容,目的MAC为02:de:ad:be:ef:40的报文。默认的源MAC为接口MAC地址。

3.    icmpsic

usage: icmpsic [-v] [-D] -s [,port] -d [,port]

[-r seed] [-m ]

[-p ] [-k ] [-x ]

参数含义:

-v:显示版本号,没有多大意义,不需要配置。

-D:Debug模式,会把具体的报文内容都打印出来,一般情况下不使用,在需要确定是否有报文发出的情况下可以使用。

-s:配置源ip,注意ICMP没有端口的概念,所以如果配置了端口就会报错,这里的命令提示是有错误的。ip可以用随机的ip来代替,参数是rand。

-d:配置目的ip,注意ICMP没有端口的概念,所以如果配置了端口就会报错,这里的命令提示是有错误的。ip可以用随机的ip来代替,参数是rand。

-r:配置发送报文的编号,就是说你可以固定的总是发送这一个编号的报文,如果测试中确认这个编号的报文会影响到设备,就记住这个seed编号,就可以节省构造报文的时间。这个编号在发送前会打印出来。

-m:平均发送报文大小的最大值。从试验来看这个参数无效,大小是随机的,没有受这个参数的控制。

-p:平均发送报文的个数,注意这个不是总数,总数需要和-x 这个参数一起决定。这里的发送的个数是指发送多少个不一样的包,包的内容不一样。不带该参数表示连续不断的发送。

-k:忽略的报文个数,就是指不发送多少个报文,这里的报文是参数-p后的报文内容。

-x:重复发送同一个报文x次。这里的报文就是-p参数后的报文。

注:-p、-k、-x三个参数决定了总计发送了多少个报文,假设总计报文个数为N,那么存在这样一个表达式:N=(p-k)*x。也就是说k一定要小于p,不然就没有报文发出,建议不要配置k参数。

Percentage Opts: [-F frags] [-V ] [-I ]
[-i ]

百分比的参数配置:

-F: 发送需要分片报文的百分比,可以直接输入数字或百分数,例如50=50%,也可以大于100,不会报错,命令可以执行。

-V: 发送错误IP版本号的报文的百分比,可以直接输入数字或百分数,例如50=50%,也可以大于100,不会报错,命令可以执行。

-I:发送含有IP选项字段的报文的百分比,可以直接输入数字或百分数,例如50=50%,也可以大于100,不会报错,命令可以执行。

-i: 发送ICMP的checksum中错误的报文的百分比,可以直接输入数字或百分数,例如50=50%,也可以大于100,不会报错,命令可以执行。控制不是很精确。

ex: -s 10.10.10.10,23   -d 10.10.10.100 -I 100

这个实例实际上是错误的,照搬了tcpsic的实例,端口是不能被添加的。剩下的就不说了,我举几个实例说明一下。

icmpsic -s 192.168.96.10 -d 192.168.96.201 -p 10 -F 1000 -I 100 -V 100 -i 100

构造源地址为192.168.96.10(-s)的10个(-p)icmp报文(icmpsic),所有的报文都进行分片(-F 1000),ip包头全部含有选项字段(-I 100),IP的版本号全部错误(-V 100),并且所有的报文checksum都是错误的(-i),将这样的报文发向192.168.96.201(-d)这个ip地址。这样的报文如果穿过了一个转发设备的话,所有的报文应该都会被丢弃。

命令执行的过程:

[root@FC5 ~]# icmpsic -s 192.168.96.10 -d 192.168.96.201 -p 10 -F 1000 -I 100 -V 100 -i 100

Compiled against Libnet 1.1.2.1

Installing Signal Handlers.

Seeding with 2445

No Maximum traffic limiter

Bad IP Version  = 100%          IP Opts Pcnt    = 100%

Frag’d Pcnt     = 1000%         Bad ICMP Cksm   = 100%

Wrote 10 packets in 0.00s @ 2999.40 pkts/s

4.    udpsic

usage: udpsic [-v] [-D] -s [,port] -d [,port]

[-r seed] [-m ]

[-p ] [-k ] [-x ]

参数含义:

-v:显示版本号,没有多大意义,不需要配置。

-D:Debug模式,会把具体的报文内容都打印出来,一般情况下不使用,在需要确定是否有报文发出的情况下可以使用。

-s:配置源ip和端口,可以不设置端口,设置时ip和端口号中间用逗号“,”连接,ip可以用随机的ip来代替,参数是rand。

-d:配置目的ip和端口,可以不设置端口,设置时ip和端口号中间用逗号“,”连接,ip同样可以设置rand,但是运行后会报错“Failed to send packet: Invalid argument”,所以目的ip一定要设置。

-r:配置发送报文的编号,就是说你可以固定的总是发送这一个编号的报文,如果测试中确认这个编号的报文会影响到设备,就记住这个seed编号,就可以节省构造报文的时间。这个编号在发送前会打印出来。

-m:平均发送报文大小的最大值。200以上的参数值有效,单位kB。

-p:平均发送报文的个数,注意这个不是总数,总数需要和-x 这个参数一起决定。这里的发送的个数是指发送多少个不一样的包,包的内容不一样。不带该参数表示连续不断的发送。

-k:忽略的报文个数,就是指不发送多少个报文,这里的报文是参数-p后的报文内容。

-x:重复发送同一个报文x次。这里的报文就是-p参数后的报文内容。

Percentage Opts: [-F frags] [-V ] [-I ]

[-U ]

百分比的参数配置:

-F: 发送需要分片报文的百分比,可以直接输入数字或百分数,例如50=50%,也可以大于100,不会报错,命令可以执行。

-V: 发送错误IP版本号的报文的百分比,可以直接输入数字或百分数,例如50=50%,也可以大于100,不会报错,命令可以执行。控制不是很精确。

-I:发送含有IP选项字段的报文的百分比,可以直接输入数字或百分数,例如50=50%,也可以大于100,不会报错,命令可以执行。

-U: 发送checksum错误的UDP报文的百分比,可以直接输入数字或百分数,例如50=50%,也可以大于100,不会报错,命令可以执行。

配置实例:

udpsic -s 192.168.96.10,10 -d 192.168.96.202,80 -p 100 -U 10 -V 0 -F 0 -I 0

构造源地址为192.168.96.10源端口为10(-s)的,checksun有10%(-U)为错误的,没有分片(-F)和ip选项(-I),正确协议(-V)类型的10个(-p)udp报文(udpsic)发送给目的地址为192.168.96.202目的端口为80(-d)的主机。

这个实例可以检验DUT设备是否对分片、协议类型错误、checksum错误等是否进行检测。

命令执行的过程:

[root@FC5 ~]# udpsic -s 192.168.96.10,10 -d 192.168.96.202,80 -p 100 -U 10 -V 0 -F 0 -I 0

Compiled against Libnet 1.1.2.1

Installing Signal Handlers.

Seeding with 2475

No Maximum traffic limiter

Bad IP Version  = 0%            IP Opts Pcnt    = 0%

Frag’d Pcnt     = 0%            Bad UDP Cksm    = 10%

Wrote 100 packets in 0.01s @ 15835.31 pkts/s

5.    isic

usage: isic [-v] [-D] -s -d
[-p ] [-k ] [-x ]
[-r ] [-m ]

参数含义:

-v:显示版本号,没有多大意义,不需要配置。

-D:Debug模式,会把具体的报文内容都打印出来,一般情况下不使用,在需要确定是否有报文发出的情况下可以使用。

-s:配置源ip,ip可以用随机的ip来代替,参数是rand。

-d:配置目的ip, ip同样可以设置rand。

-r:配置发送报文的编号,就是说你可以固定的总是发送这一个编号的报文,如果测试中确认这个编号的报文会影响到设备,就记住这个seed编号,就可以节省构造报文的时间。这个编号在发送前会打印出来。

-m:平均发送报文大小的最大值。200以上的参数值有效,单位kB。

-p:平均发送报文的个数,注意这个不是总数,总数需要和-x 这个参数一起决定。这里的发送的个数是指发送多少个不一样的包,包的内容不一样。不带该参数表示连续不断的发送。

-k:忽略的报文个数,就是指不发送多少个报文,这里的报文是参数-p后的报文内容。

-x:重复发送同一个报文x次。这里的报文就是-p参数后的报文内容。

Percentage Opts: [-F frags] [-V ]
[-I ]

百分比的参数配置:

-F: 发送需要分片报文的百分比,可以直接输入数字或百分数,例如50=50%,也可以大于100,不会报错,命令可以执行。

-V: 发送错误IP版本号的报文的百分比,可以直接输入数字或百分数,例如50=50%,也可以大于100,不会报错,命令可以执行。控制不是很精确。

-I: 发送IP报文的头部使用随机的长度的报文的百分比。

配置实例:

isic -s 192.168.96.10 -d 192.168.96.202 -p 10 -I 100

-I表示所发送的IP报文都使用随机的Header length,其它的就不多罗嗦了。

使用小结:

isic这个工具主要是测试DUT对非正常报文的处理情况,有的设备检测五元组,有的还检测checksum,有的还检测tcp的序列号,所以使用 isic这个工具可以构造我们所需要的正常或非正常报文,来检测DUT对报文内容的检测深度和处理的速度。而且它自身的统计功能可以很好的为测试服务,提 高了测试的精度。

isic工作原理

刚开始使用发包工具的时候会觉得这个东西很神奇,可以构造出这么多不同的报文,还可以控制一些参数来发送自己想要发送的报文,但是看过源码文件以后,也许就没有这么神秘了。

以isic-0.06来说,先看看解压tar包后的文件内容:

isic使用说明

isic_图1

安装过程就不多说了,看其中一个c文件就可以知道它的报文是怎样构造的了,以isic.c为例,看其中一部分内容。

isic使用说明

isic_图2

可以学习到isic的含义:ISIC – IP Stack Integrity Checker,就是IP协议栈完整性检测的意思。

isic使用说明

isic_图3

可以看到main函数中定义了默认的参数值,例如默认的分片的比例值,默认发送的次数,最大的发包速率等信息,很显然isic是依靠对应的c文件去构造报文的。构造完毕后经由网卡发送出去。

tcl实例详解

 

2

 

2

 

2

 

2

 

2

 

1

 

1

 

1

 

1

 

1

 

1

 

1

 

1

 

1

 

1

redhat上装bind9.3.4

装好后,
因为是带指定目录启动的named:
pr 2 23:06:16 RedHat named[3316]: starting BIND 9.2.4 -u named -t /var/named/chroot
Apr 2 23:06:16 RedHat named[3316]: using 1 CPU
Apr 2 23:06:16 RedHat named: named 启动 succeeded
所以BIND认为实际zone文件所在目录是:
/var/named/chroot/var/named
named.conf中指定的工作目录/var/named下的那些zone文件都是个连接
———————————————————————
必须在options中开启递归,针对某个具体域的forward才能生效,否则不会生效。

[root@RedHat named]# cat /etc/named.conf
//
// named.conf for Red Hat caching-nameserver
//

//logging {
//channel query_log {
//file “query.log” versions 3 size 20m;
//severity info;
//print-time yes;
//print-category yes;
//};
//category queries {
//query_log;
//};
//};


options {
directory “/var/named”;
dump-file “/var/named/data/cache_dump.db”;
statistics-file “/var/named/data/named_stats.txt”;
recursion yes;

/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
};

//
// a caching only nameserver config
//
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};

zone “.” IN {
type hint;
file “named.ca”;
};

zone “localdomain” IN {
type master;
file “localdomain.zone”;
allow-update { none; };
};

zone “localhost” IN {
type master;
file “localhost.zone”;
allow-update { none; };
};

zone “0.0.127.in-addr.arpa” IN {
type master;
file “named.local”;
allow-update { none; };
};

zone “0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa” IN {
type master;
file “named.ip6.local”;
allow-update { none; };
};

zone “255.in-addr.arpa” IN {
type master;
file “named.broadcast”;
allow-update { none; };
};

zone “0.in-addr.arpa” IN {
type master;
file “named.zero”;
allow-update { none; };
};

zone “mybind.com.” {
type master;
file “named.mybind”;
allow-update {
localhost;
};
};


zone “sina.com.” {
type forward;
forward only;
forwarders {
202.106.83.125;
//icbc’s name server
};
};

zone “icbc.com.cn.” {
type forward;
forward only;
forwarders {
202.106.83.125;
};
};

zone “163.com.” {
type forward;
forward first;
forwarders {
202.106.83.125;
};
};

上面的配置,将sina.com,163.com,icbc.com.cn都转发到icbc的某台DNS服务器上。注意forward类型。并且ICBC的DNS是不接受解析别的域名的,因此结果如下
163.com的可以被解析(先转发,然后ICBC的DNS拒绝,转发失败后改用递归查询)
————
Non-authoritative answer:
Name: www.cache.gslb.netease.com
Addresses: 61.135.253.11, 61.135.253.12, 61.135.253.13, 61.135.253.14
61.135.253.15, 61.135.253.16, 61.135.253.17, 61.135.253.18, 61.135.25
.9
61.135.253.10
Aliases: www.163.com

sina.com的不能被解析,因为是forward only 只容许转发,而ICBC又拒绝解析。

————
*** [192.168.1.108] can’t find sina.com: Server failed

icbc.com.cn可以被解析(转发到icbc.com.cn后,icbc的DNS服务器接受解析)
Non-authoritative answer:
Name: www.icbc.com.cn
Address: 202.99.30.209
—————————————————————————

但是全局打开递归对一个企业来说可能并不需要,因为如果作为纯内部使用,打开递归会导致用户可以借该DNS来解析任意域名,因此如果只想针对某些指定域进行递归查询的话可以编辑root.hint文件,将根服务器地址改为指定域所在的DNS,这样可以防止向公众根服务器递归而导致可解析所有域名。 但是这个方法有个缺陷,如果有多个指定域的话,如果都编辑在root.hint里,将导致排在后面的指定域进行递归时候要先用排在前面的其他指定域的DNS,导致经常超时。事实上还有一个问题,就是如果合作伙伴的域再次递归的话,则也将导致内网用户可解析所有域名。
编辑root.hint文件为
. 3600000 IN NS A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET. 3600000 A 202.106.83.125

. 3600000 IN NS B.ROOT-SERVERS.NET.
B.ROOT-SERVERS.NET. 3600000 A 202.106.0.20

第一个IP是指定合作伙伴的,第二个是公网一个ISP的DNS。如果解析非指定合作伙伴的域名时,抓包发现总是第一次递归给202.106.83.125,由于合作伙伴不提供再次递归,所以DNS服务器再去找202.106.0.20:
23:47:33.460272 IP 192.168.0.185.1440 > 192.168.0.150.domain: 49+ A? www.qq.com. (28)
23:47:33.464865 IP 192.168.0.150.32774 > 202.106.83.125.domain: 33868% [1au] A? www.qq.com. (39)
23:47:33.466601 IP 192.168.0.150.32774 > 202.106.83.125.domain: 57694% [1au] NS? . (28)
23:47:33.483152 IP 202.106.83.125.domain > 192.168.0.150.32774: 33868 ServFail 0/0/1 (39)
23:47:33.483905 IP 202.106.83.125.domain > 192.168.0.150.32774: 57694 ServFail 0/0/1 (28)
23:47:33.486618 IP 192.168.0.150.32774 > 202.106.83.125.domain: 61615 A? www.qq.com. (28)
23:47:33.487605 IP 192.168.0.150.32774 > 202.106.83.125.domain: 34356 NS? . (17)
23:47:33.503710 IP 202.106.83.125.domain > 192.168.0.150.32774: 61615 ServFail 0/0/0 (28)
23:47:33.506388 IP 202.106.83.125.domain > 192.168.0.150.32774: 34356 ServFail 0/0/0 (17)
23:47:33.507565 IP 192.168.0.150.32774 > 202.106.0.20.domain: 49946% [1au] A? www.qq.com. (39)
23:47:33.508686 IP 192.168.0.150.32774 > 202.106.0.20.domain: 24973% [1au] NS? . (28)
23:47:33.525263 IP 202.106.0.20.domain > 192.168.0.150.32774: 24973 13/0/1 NS D.ROOT-SERVERS.NET.,[|domain]
23:47:33.530761 IP 202.106.0.20.domain > 192.168.0.150.32774: 49946 1/0/1 A 61.135.167.36 (55)
23:47:33.536598 IP 192.168.0.150.domain > 192.168.0.185.1440: 49 1/13/0 A 61.135.167.36 (255)

同时还发现,在解析过一些域名后(解析这些域名过程中我的DNS服务器从外部的ISP那个DNS上获得了一些根域名服务器的IP)我的DNS服务器把一些根域名服务器缓存了,导致后面解析其他IP可以很快的解析出来,而不像上面那样先递归找合作伙伴的DNS再递归找ISP的DNS,而是直接用了某个根服务器,这不是期望的效果,这或许可以通过关闭DNS服务器缓存功能避免~~~~w
==========================
解决办法:把root.hint里换成假的IP 欺骗BIND,这样各个单独转发域的就可以各自生效了。又不会导致用户可以随意解析IP。
01:07:03.523974 IP 192.168.0.185.2324 > 192.168.0.150.domain: 3+ A? www.icbc.com.cn. (33)
01:07:03.530951 IP 192.168.0.150.32769 > 202.106.83.125.domain: 40500+% [1au] A? www.icbc.com.cn. (44)
01:07:03.541015 IP 202.106.83.125.domain > 192.168.0.150.32769: 40500*- 1/0/1 A 211.95.81.1 (60)
01:07:03.542802 IP 192.168.0.150.domain > 192.168.0.185

.2324: 3 1/0/0 A 211.95.8
1.1 (49)
01:07:59.086585 IP 192.168.0.185.2325 > 192.168.0.150.domain: 4+ A? www.265.com. (29)
01:07:59.099236 IP 192.168.0.150.32769 > 1.1.1.1.domain: 20250% [1au] A? www.265.com. (40)
01:07:59.101134 IP 192.168.0.150.32769 > 1.1.1.1.domain: 37865% [1au] NS? . (28)
01:08:01.103887 IP 192.168.0.150.32769 > 1.1.1.1.domain: 56245% [1au] A? www.265.com. (40)
01:08:01.105854 IP 192.168.0.150.32769 > 1.1.1.1.domain: 37435% [1au] NS? . (28)
01:08:01.107183 IP 192.168.0.150.32769 > 1.1.1.1.domain: 31579% [1au] A6? A.ROOT-SERVERS.NET. (47)
01:08:02.314876 IP 192.168.0.185.2326 > 192.168.0.150.domain: 5+ A? www.265.com. (29)
01:08:03.105171 IP 192.168.0.150.32769 > 1.1.1.1.domain: 20815% [1au] A? www.265.com. (40)
01:08:03.108436 IP 192.168.0.150.32769 > 1.1.1.1.domain: 36636% [1au] NS? . (28)
01:08:03.113258 IP 192.168.0.150.32769 > 1.1.1.1.domain: 58303% [1au] A6? A.ROOT-SERVERS.NET. (47)
01:08:05.114387 IP 192.168.0.150.32769 > 1.1.1.1.domain: 43912% [1au] A6? A.ROOT-SERVERS.NET. (47)
01:08:11.106954 IP 192.168.0.150.32769 > 1.1.1.1.domain: 21956 A? www.265.com. (29)
01:08:11.112948 IP 192.168.0.150.32769 > 1.1.1.1.domain: 5385 NS? . (17)
01:08:13.116058 IP 192.168.0.150.32769 > 1.1.1.1.domain: 31710 A6? A.ROOT-SERVERS.NET. (36)
01:08:21.547324 IP 192.168.0.185.2327 > 192.168.0.150.domain: 6+ A? www.265.com. (29)
01:08:24.770687 IP 192.168.0.185.2328 > 192.168.0.150.domain: 7+ A? www.265.com. (29)
01:08:27.110072 IP 192.168.0.150.32769 > 1.1.1.1.domain: 24280 A? www.265.com. (29)
01:08:27.115294 IP 192.168.0.150.32769 > 1.1.1.1.domain: 22523 NS? . (17)
01:08:29.097781 IP 192.168.0.150.domain > 192.168.0.185.2325: 4 ServFail 0/0/0 (29)
01:08:29.097997 IP 192.168.0.150.domain > 192.168.0.185.2326: 5 ServFail 0/0/0 (29)
01:08:29.098859 IP 192.168.0.150.domain > 192.168.0.185.2327: 6 ServFail 0/0/0 (29)
01:08:29.099620 IP 192.168.0.150.domain > 192.168.0.185.2328: 7 ServFail 0/0/0 (29)
01:08:29.117218 IP 192.168.0.150.32769 > 1.1.1.1.domain: 50711 A6? A.ROOT-SERVERS.NET. (36)
01:08:31.107363 IP 192.168.0.150.32769 > 1.1.1.1.domain: 22530% [1au] AAAA? A.ROOT-SERVERS.NET. (47)
这里还需注意一个细节:
如果指定域的某个记录解析是cname到另一个域的,解析时就还要能解析cname指示的地址,因此这种情形下还需对cname指示的域也做转发,例如网易的www.163.com是cname到netease.com域的,所以named.conf中还得加上netease.com可以转发的配置
01:25:05.677586 IP 192.168.0.185.2413 > 192.168.0.150.domain: 21+ A? www.163.com. (29)
01:25:05.688703 IP 192.168.0.150.32771 > 202.106.0.20.domain: 63878+% [1au] A? www.163.com. (40)
01:25:05.689875 IP 192.168.0.150.32771 > 1.1.1.1.domain: 64707% [1au] NS? . (28)
01:25:05.711864 IP 202.106.0.20.domain > 192.168.0.150.32771: 63878 11/0/1 CNAME[|domain]
01:25:05.717924 IP 192.168.0.150.32771 > 202.106.0.20.domain: 56538+% [1au] A? www.cache.gslb.netease.com. (55)
01:25:05.736635 IP 202.106.0.20.domain > 192.168.0.150.32771: 56538 10/0/1[|domain]
01:25:05.743277 IP 192.168.0.150.domain > 192.168.0.185.2413: 21 11/0/0 CNAME[|domain]

> www.163.com
Server: [192.168.0.150]
Address: 192.168.0.150

Non-authoritative answer:
Name: www.cache.gslb.netease.com
Addresses: 61.135.253.16, 61.135.253.17, 61.135.253.18, 61.135.253.9
61.135.253.10, 61.135.253.11, 61.135.253.12, 61.135.253.13, 61.135.253
.14
61.135.253.15
Aliases: www.163.com

对应named.conf配置
zone “163.com.” {
type forward;
forward first;
forwarders {
202.106.0.20;
//public isp’s dns
};
};

zone “netease.com.” {
type forward;
forward first;
forwarders {
202.106.0.20;
==========================
将root.hint文件改成假IP,还是无法避免垃圾域名递归导致的流量解析(尽管该域名实际无法解析),所以可以考虑把root.hint文件置空,测试:
空root.hint可以把服务起来,此时DNS不会把递归包乱发出去了,直接报服务器失败。同时此时forward zone的类型必须是forward only,如果是forward first将导致无法转发。 下面是测试结果

Named配置

zone “icbc.com.cn.” {
type forward;
forward only;

//if root.hint content is empty,forward type must be only. if is first,then resolve will fail…
forwarders {
202.106.83.125; ICBC域转发给ICBC一台实际公网DNS,类型only
};
};

zone “mycisco.cn.” {
type forward;
forward first;

//if root.hint content is empty,forward type must be only. if is first,then resolve will fail…
forwarders {
202.106.0.20; 转发给网通的一个DNS,类型是first
};
};

测试结果抓包
root@RedHat ~]# tcpdump -ni eth0 port 53
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes


试图解析www.qq.com,这个域在DNS没有定义,应该递归
15:54:50.642968 IP 192.168.1.105.1425 > 192.168.1.107.domain: 51+ A? www.qq.com. (28)
15:54:50.646022 IP 192.168.1.107.domain > 192.168.1.105.1425: 51 ServFail 0/0/0 (28)
15:54:50.658966 IP 192.168.1.105.1426 > 192.168.1.107.domain: 52+ A? www.qq.com. (28)
15:54:50.662228 IP 192.168.1.107.domain > 192.168.1.105.1426: 52 ServFail 0/0/0 (28)


解析www.icbc.com.cn 成功,类型是only
15:55:03.718194 IP 192.168.1.105.1427 > 192.168.1.107.domain: 53+ A? www.icbc.com.cn. (33)
15:55:03.722168 IP 192.168.1.107.32774 > 202.106.83.125.domain: 43103+% [1au] A? www.icbc.com.cn. (44)
15:55:05.724416 IP 192.168.1.107.32774 > 202.106.83.125.domain: 50789+% [1au] A? www.icbc.com.cn. (44)
15:55:06.528538 IP 192.168.1.105.1428 > 192.168.1.107.domain: 54+ A? www.icbc.com.cn. (33)
15:55:07.725933 IP 192.168.1.107.32774 > 202.106.83.125.domain: 26586+% [1au] A? www.icbc.com.cn. (44)
15:55:08.920507 IP 202.106.83.125.domain > 192.168.1.107.32774: 50789*- 1/0/1 A 211.95.81.1 (60)
15:55:08.934064 IP 202.106.83.125.domain > 192.168.1.107.32774: 26586*- 1/0/1 A 211.95.81.1 (60)
15:55:08.938414 IP 192.168.1.107.domain > 192.168.1.105.1427: 53 1/0/0 A 211.95.81.1 (49)
15:55:08.941467 IP 192.168.1.107.domain > 192.168.1.105.1428: 54 1/0/0 A 211.95.81.1 (49)


解析www.mycisco.cn 失败,forward 类型是first
15:56:23.007116 IP 192.168.1.105.1430 > 192.168.1.107.domain: 55+ A? www.mycisco.cn. (32)
15:56:23.012878 IP 192.168.1.107.domain > 192.168.1.105.1430: 55 ServFail 0/0/0 (32)
15:56:23.023036 IP 192.168.1.105.1431 > 192.168.1.107.domain: 56+ A? www.mycisco.cn. (32)
15:56:23.026002 IP 192.168.1.107.domain > 192.168.1.105.1431: 56 ServFail 0/0/0 (32)

17 packets captured
17 packets received by filter
0 packets dropped by kernel



客户端对应结果:
> www.qq.com
Server: [192.168.1.107]
Address: 192.168.1.107

*** [192.168.1.107] can’t find www.qq.com: Server failed
> www.icbc.com.cn
Server: [192.168.1.107]
Address: 192.168.1.107

DNS request timed out.
timeout was 2 seconds.
Non-authoritative answer:
Name: www.icbc.com.cn
Address: 211.95.81.1

> www.mycisco.cn
Server: [192.168.1.107]
Address: 192.168.1.107

*** [192.168.1.107] can’t find www.mycisco.cn: Server failed

Ubuntu配置作为DNS服务器

1,sudo apt-get install bind9
2,sudo gedit /etc/bind/named.conf 添加下列代码:(大家根据自己的实际情况更改参数)保存退出
zone "qixang.com" {
        type master;
        file "/etc/bind/db.qixang.com";
};
zone "0.168.192.in-addr.arpa" {
        type master;
        file "/etc/bind/db.qixang.com.rev";
};
3,新建db.qixang.com文件, sudo gedit /etc/bind/db.qixang.com 添加下列代码:(大家根据自己的实际情况更改参数)保存退出
@    IN   SOA www.qixang.com. root.qixang.com.(
         20070728
         3H
         10M
         1D
         2D)
     IN NS  www.qixang.com.
www  IN A  192.168.0.148
mail IN A  192.168.0.148
4,新建db.qixang.com.rev文件, sudo gedit /etc/bind/db.qixang.com.rev 添加下列代码:(大家根据自己的实际情况更改参数)保存退出
@     IN    SOA  www.qixang.com.  root.qixang.com.(
            20070728
            3H
            10M
            1D
            3D)
      IN   NS    www.qixang.com.
148   IN   PTR   www.qixang.com.
148   IN   PTR   mail.qixang.com.
5,sudo /etc/init.d/bind9 restart   重启DNS服务
6,测试
plmuser@plmuser:/var/www$ hostname
plmuser
plmuser@plmuser:/var/www$ host 192.168.0.148
148.0.168.192.in-addr.arpa domain name pointer www.qixang.com.
148.0.168.192.in-addr.arpa domain name pointer mail.qixang.com.
plmuser@plmuser:/var/www$ host www.qixang.com
www.qixang.com has address 192.168.0.148
plmuser@plmuser:/var/www$