分类
经验

批量Ping多个IP地址

什么是Ping

Ping是一种计算机网络工具,用来测试数据包能否透过IP协议到达特定主机。Ping的运作原理是向目标主机传出一个ICMP的请求回显数据包,并等待接收回显回应数据包。程序会按时间和成功响应的次数估算丢失数据包率(丢包率)和数据包往返时间(网络时延)。

Ping操作界面(Windows)
Ping操作界面(Windows)

在1983年12月,Mike Muuss编写了首个这样的程序,用于在IP网络出现问题时方便探查其根源。因为这个程序的运作原理与潜水艇的主动声纳相似,他便用声纳的声音来为程序取名。
网络管理员之间也常将Ping用作动词,如“Ping一下路由器的IP,看通不通?”。


哪些场景下使用Ping

场景一:设备直连
当互相发起Ping的两台设备是采用直连连接时,不论是否经过二层交换机,都是直接通过二层链路进行通信。
因此,直连的设备只需要确保两者的IP地址在同一个子网内即可,无需配置网关地址,也能够Ping通。

场景一:设备(经交换机)直连
场景一:设备(经交换机)直连

上图实验场景中,包含两个小的实验,区别在于中间有无二层交换机。下面先看下4台终端PC的IP地址配置:

上面4台终端PC分配按照拓扑图配置了私网IP地址和子网掩码,以确保与对端设备在同一个子网内。可以看到,4台PC都没有配置网关地址和DNS地址。下面看一下测试结果:

上图是分别从PC1对PC2发起Ping、PC3对PC4发起Ping,都是可以Ping通的。

以PC1对PC2发起Ping的回显信息为例,图中
From 192.168.12.2: bytes=32 seq=5 ttl=128 time=15 ms
表示这是从PC2(192.168.12.2)返回的第5个(seq=5)回显应答Echo Reply,生存时间值(ttl)为128(ttl=128,实际意义是0跳,即128-128=0),网络时延为15毫秒(time=15 ms)。

扩展阅读:
TTL的主要作用是避免IP包在网络中的无限循环和收发,节省了网络资源,并能使IP包的发送者能收到告警消息。TTL是IP数据包在计算机网络中可以转发的最大跳数。TTL字段由IP数据包的发送者设置,在IP数据包从源到目的的整个转发路径上,每经过一个路由器,路由器都会修改这个TTL字段值。具体的做法是把该TTL的值减1,然后再将IP包转发出去。如果在IP包到达目的IP之前TTL减少为0,路由器将会丢弃收到的TTL=0的IP包,并向IP包的发送者发送ICMP Time Exceeded消息。TTL值是可以手动定义的,常见操作系统的默认TTL值如下:
UNIX及类UNIX操作系统:255
Windows NT4/2000/XP/8/10:128
Linux系列操作系统:64   
Windows 95/98/98SE/ME:32

场景二:经路由转发
当互相发起Ping的两台设备中间存在路由(三层)转发时,只要确保两者之间有能够到达对端的正确路由路径,两台设备就可以Ping通。
当网络中存在路由(三层)转发时,终端设备务必配置网关IP地址,DNS地址可以不配置。

场景二:经路由转发
场景二:经路由转发

上图实验场景中,包含两个小的实验,区别在于中间有无公网IP地址(R2与R3之间采用公网IP地址互联)。下面先看下4台终端PC的IP地址配置:

上面4台终端PC分配按照拓扑图配置了私网IP地址、子网掩码和网关地址,没有配置DNS地址。下面看一下测试结果:

上图是分别从PC1对PC2发起Ping、PC3对PC4发起Ping,都是可以Ping通的。


Ping工具的常用参数

在不同设备上使用Ping命令的可选参数是不一样的,例如PC机(不同操作系统)、路由器(不同厂家)等的可选参数是不同的。

Windows操作系统
下面以Microsoft Windows 10 64位操作系统为例,介绍Windows系列操作系统中Ping的可选参数和用法。打开Cmd命令窗口,输入ping /?即可查看Ping相关的可选参数及用法介绍。

Windows操作系统中Ping的帮助信息
Windows操作系统中Ping的帮助信息
参数参数说明
-tPing 指定的主机,直到停止。
若要查看统计信息并继续操作,请键入 Ctrl+Break;
若要停止,请键入 Ctrl+C。
-a将地址解析为主机名。
-n count要发送的回显请求数。
-l size发送缓冲区大小。
-f在数据包中设置“不分段”标记(仅适用于 IPv4)。
-i TTL生存时间。
-v TOS服务类型(仅适用于 IPv4。该设置已被弃用,
对 IP 标头中的服务类型字段没有任何
影响)。
-r count记录计数跃点的路由(仅适用于 IPv4)。
-s count计数跃点的时间戳(仅适用于 IPv4)。
-j host-list与主机列表一起使用的松散源路由(仅适用于 IPv4)。
-k host-list与主机列表一起使用的严格源路由(仅适用于 IPv4)。
-w timeout等待每次回复的超时时间(毫秒)。
-R同样使用路由标头测试反向路由(仅适用于 IPv6)。
根据 RFC 5095,已弃用此路由标头。
如果使用此标头,某些系统可能丢弃
回显请求。
-S srcaddr要使用的源地址。
-c compartment路由隔离舱标识符。
-pPing Hyper-V 网络虚拟化提供程序地址。
-4强制使用 IPv4。
-6强制使用 IPv6。

下面介绍Windows操作系统中Ping的几种常见附带参数。
使用参数-n count:ping 8.8.8.8 -n 2,只Ping 2次就自动结束。
同理,ping 8.8.8.8 -n 987,表示连续Ping 987次后自动结束。

附带参数-n 2,只Ping 2次,自动结束(默认是发送4次)

使用参数-l size:ping 8.8.8.8 -l 64,发送64字节的数据包。这个参数可以测试对端的接收窗口大小,例如8.8.8.8的窗口大小为≤1472字节。

附带参数-l 64,发送64字节的数据包(默认是发送32字节)

使用参数-i TTL能够确到达目标的最大跳数。

Linux操作系统
下面以Redhat CentOS 8 64位操作系统为例,介绍Linux系列操作系统中Ping的可选参数和用法。打开Terminal终端窗口(或使用SSH连接Linux HOST):
输入hostnamectl即可查看系统内核;
输入ping –help即可查看Ping的附带选项(简要帮助);
输入man ping即可查看关于Ping的详细使用手册。

参数参数说明
-b允许Ping网关地址。
-c count发送count次ECHO_REQUEST(回传请求)数据包。当有deadline选项(最后期限,-w选项),在超时之前,Ping等待ECHO_REPLY(回传响应)直到count次。
-d在正在使用的socket(套接字)上设置SO_DEBUG选项。本质上,Linux内核不使用此套接字选项。
-f大量Ping,极限Ping。每个ECHO_REQUEST(回传请求)打印一个点,每有一个ECHO_REPLY(回传响应)打印一个退格符(Backspace)。这样可以快速显示丢弃的数据包数量。如果没有给出间隔,它会将间隔设置为0,并按照它们返回或每秒百次的速度输出数据包,以多者为准。只有超级用户才可以0间隔使用此选项。
-i interval发送每个数据包之间等待的间隔(单位秒)。默认设置是等待一秒,极限模式下不等待。只有超级用户可以设置间隔值小于0.2秒。
-I interface address将源地址设置为指定的接口地址。参数可以是数字IP地址或设备名称。在Ping IPv6 linklocal地址时,此选项是必需的。
-l preload如果指定了preload,则Ping发送许多不等待回复的数据包。只有超级用户可以选择超过3的预加载。
-n仅限数字输出。不会尝试查找主机地址的符号名称。
-p pattern你可以指定最多16个“pad”字节来填充你发送的数据包。这对于诊断网络中的数据以来问题是有用的。例如-p ff将导致充满整个被发送包。
-q静默输出。除启动和完成时的摘要行外,不显示任何内容。
-r绕过正常的路由表并直接发送到连接接口上的主机。如果主机不在直接连接的网络上,则返回错误。如果还是用了-I选项,则此选项可用于通过没有路由的接口Ping本地主机。
-R记录线路。包含ECHO_REQUEST数据包中的RECORD_ROUTE选项,并在返回的数据包上显示路由缓冲区。请注意,IP报头只能容纳9个这样的路由。许多主机忽略或放弃此选项。
-s packetsize指定要发送的数据字节数。默认56,当与8字节的ICMP头数据组合时,转换为64个ICMP数据字节。
-t ttl设置IP生存时间值(TTL)。
-v详细输出。
-w deadline指定一个以秒为单位的退出时间,不管Ping退出之前发送或接收了多少数据包。在这种情况下,Ping将一直发送数据包,直到deadline过期或count探针结束或一些来自网络的错误通知。

下面介绍Linux操作系统中Ping的几种常见附带参数。
使用参数-c count:ping -c 3 8.8.8.8,只Ping 3次就自动结束。
同理,ping -c 99 8.8.8.8,表示连续Ping 99次后自动结束。

使用参数-i interval,将以指定的时间间隔对目标发起Ping,默认间隔是1秒。如下就是以2秒为间隔,对目标发起5次Ping。

使用参数-f对目标发起快速极限Ping,过程不同步回显,只显示最终结果,如果没有附带-c参数,则需要手动终止(Ctrl+C)才会结束。如下就是对www.baidu.com发起55次极限快速Ping,最短30.381毫秒,平均30.435毫秒,最长30.565毫秒,偏离值0.141毫秒(mdev表示这些ICMP包的RTT偏离平均值的程度,这个值越小说明你的网络越稳定),丢包率为0%

使用参数-q,Ping的过程不回显,只显示最终结果。如下就是对8.8.8.8发起9次Ping,并附带参数-q,最终显示最短35.913毫秒,平均36.126毫秒,最长36.383毫秒,偏离值0.168毫秒。为什么要一直附带这个-c参数呢?由于Linux系统中直接使用命令ping x.x.x.x将一直不停的Ping下去,直到手动终止(Ctrl+C)才会结束,所以习惯附带-c参数。

UNIX操作系统
苹果公司的macOS属于UNIX系列操作系统,在macOS上使用Ping命令与在Linux中使用Ping大致类似,这里就不展开赘述了。


前面铺垫了那么多,主要介绍了Ping的原理,以及在不同操作系统中使用Ping的方法和技巧,下面才是今天的主题:批量Ping。

批量Ping多个连续的IP地址

如果你是公司的管理员,现在你想知道192.168.56.0/24这个网段有多少主机在线(被分配),有两种方法:第一,登录DHCP服务器(例如核心交换机)查看实时的IP地址分配情况;第二,使用批量Ping快速确认多少IP在线。而第一种方法需要你能登录核心设备的后台。

使用命令for /L %d in (1,1,255) do ping 192.168.56.%d
对192.168.56.0/24这个网段,从1开始连续逐个Ping测试。其中%d表示变量,(1,1,255)中第一个1表示起始值,第二个1表示递增量,255表示结束的最后一个值。

使用命令for /L %d in (1,1,255) do ping 192.168.56.%d显示如上

下面将起始值修改成22、递增量修改成10,使用命令for /L %d in (22,10,255) do ping 192.168.56.%d试一下。

使用命令for /L %d in (22,10,255) do ping 192.168.56.%d显示如上

添加参数>>textname.txt,使用命令for /L %d in (5,3,255) do ping 192.168.56.%d >>textname.txt将结果输出到名为textname的TXT文件中,输出的文件默认存储在C:\Windows\System32\textname.txt 。

使用命令for /L %d in (5,3,255) do ping 192.168.56.%d >>textname.txt显示如上
textname.txt文件中显示的内容如上

再优化一下,将textname.txt文件输出到指定位置(如桌面上),使用命令for /L %d in (33,5,255) do ping 192.168.56.%d >>C:\Users\tongliyang\Desktop\textname.txt,这将会把textname文件输出到桌面上。

使用命令for /L %d in (33,5,255) do ping 192.168.56.%d >>C:\Users\username\Desktop\textname.txt,把textname文件输出到桌面上。

继续优化:将Ping通的IP结果保存到yes.txt,将不能Ping通的IP保存到no.txt,使用命令for /L %d in (1,1,255) do (ping 192.168.56.%d -n 1 && echo 192.168.56.1.%d >>C:\Users\tongliyang\Desktop\yes.txt || echo 192.168.56.%d >>C:\Users\tongliyang\Desktop\no.txt)

使用命令for /L %d in (1,1,255) do (ping 192.168.56.%d -n 1 && echo 192.168.56.1.%d >>C:\Users\tongliyang\Desktop\yes.txt || echo 192.168.56.%d >>C:\Users\tongliyang\Desktop\no.txt)显示如上
yes.txt和no.txt两个文件中分别显示的内容

批量Ping多个无规律的IP地址

上面演示的是Ping多个连续的IP地址段,那么如果是一组没有规律的地址呢?例如下面这个list.txt中这些IP地址/网址,肯定也是可以实现的。

list.txt文件中显示的内容

使用命令for /F %d in (C:\Users\tongliyang\Desktop\list.txt) do (ping %d -n 1 && echo %d >> C:\Users\tongliyang\Desktop\pass.txt || echo %d >> C:\Users\tongliyang\Desktop\nopass.txt)

使用命令for /F %d in (C:\Users\tongliyang\Desktop\list.txt) do (ping %d -n 1 && echo %d >> C:\Users\tongliyang\Desktop\pass.txt || echo %d >> C:\Users\tongliyang\Desktop\nopass.txt)显示如上
pass.txt和nopass.txt两个文件中显示的内容如上

哪些原因会导致Ping不通

在互联网中,理论上接入Internet的两台机器都可以通信。但是由于安全策略的原因、防火墙的限制,将导致一些流量被过滤。下面介绍几种Ping不通的现象,以及相应的原因分析。

错误的目标IP地址/网址:
对www.qdfdfdf345454.com发起Ping,回显Ping 请求找不到主机 www.qdfdfdf345454.com。请检查该名称,然后重试。

使用nslooup命令查找解析,提示UnKnown 找不到 www.qdfdfdf345454.com: Non-existent domain

nslooup命令提示UnKnown 找不到 www.qdfdfdf345454.com: Non-existent domain

访问违禁目标网站被拒绝:
以在中国大陆访问特靠谱最爱的Twitter为例,DNS将对www.twitter.com的访问指向104.244.42.193,你的请求流量被GFW防火墙Drop。

Ping Twitter被拒绝

再次提醒各位网民:合法使用互联网,互联网不是法外之地!

目标IP/网站设置了禁Ping:
这种场景是由于目标IP/网站在服务器之前使用了防火墙/CDN过滤技术,将来自于ICMP的请求一律回显拒绝消息。
例如有着韩国百度之称的“Naver”,就是能访问网页,但是Ping不通。

naver.com能够正常访问,但是Ping不通

扩展阅读:
如何设置防火墙禁Ping,以下图拓扑为例,介绍一下设置禁Ping的步骤,其中PC和路由器只配置了IP地址,关键配置做在核心交换机(华为S5700)上。

测试禁Ping的实验拓扑图

交换机上的配置如下:
acl number 3100
rule deny icmp
quit
traffic classifier 1 operator and
if-match acl 3100
quit
traffic behavior deny
permit
quit
traffic policy icmp
classifier 1 behavior deny
quit
interface GigabitEthernet 0/0/1
traffic-policy icmp inbound
quit

开、关禁Ping的效果对比

更多关于Ping的扩展阅读

能Ping通但不能访问(1)

能Ping通但不能访问(2)

“批量Ping多个IP地址”上的一条回复

最后,再补充一个Troubleshooting的逻辑:当你发现断网时,可以从内到外逐层Ping测试,先Ping你自己的最外层网络设备,再Ping运营商光猫,最后Ping公网地址。这是最快速度、准确定位局点的标准流程。

发表评论

电子邮件地址不会被公开。 必填项已用*标注