一、前言
Nping是一款功能强大的开源工具,主要用于网络数据包生成、响应分析以及响应时间测量。它能够生成适用于多种协议的网络数据包,赋予用户对协议头的完全控制权。Nping的用途广泛,不仅可作为简单的ping工具,用于检测网络中的活动主机,还能充当原始数据包生成器,在网络堆栈压力测试、ARP中毒攻击、拒绝服务攻击、路由跟踪等场景中发挥作用。
Nping的回声模式独具特色,借助该模式,用户能够清晰查看数据包在源主机与目标主机之间传输过程中的变化情况。这为深入了解防火墙规则、精准检测数据包损坏等问题提供了有效方法。
Nping配备了极为灵活且强大的命令行界面,使用户得以全面掌控所生成的数据包。其具备的显著特点如下:
- 支持自定义TCP、UDP、ICMP和ARP数据包的生成。
- 允许对多目标主机进行规范设置。
- 支持多目标端口规范操作。
- 具备适用于非root用户的非特权模式。
- 拥有回声模式,可用于高级故障排查与网络发现。
- 支持以太网帧的生成。
- 对IPv6提供支持(当前处于试验阶段)。
- 能够在Linux、Mac OS和MS Windows等多种操作系统上运行。
- 具备路由跟踪功能。
- 可定制程度极高。
- 完全免费且开源。
二、探测模式(PROBE MODES)
为了更深入地了解 nping 的强大功能,我们附上 nping man 文档 中支持的几大探测模式说明:
参数 | 说明 |
---|---|
–tcp-connect | 无特权的 TCP 连接探测 |
–tcp | TCP 探测 |
–udp | UDP 探测 |
–icmp | ICMP 探测 |
–arp | ARP/RARP 探测 |
–tr/–traceroute | 路由跟踪模式(需配合 –tcp/–udp/–icmp 一起使用) |
接下来,我们将围绕以上这些探测模式,详细阐述其主流及高级用法。
1. TCP 连接模式(–tcp-connect)
此模式包含两个基础参数 -p 和 -g,分别用于指定目标端口(dest port
)和源端口(src port
)。
参数 | 说明 |
---|---|
-p/–dest-port | 指定目的端口 |
-g/–source-port | 指定源端口 |
1)指定目的端口探测(-p/–dest-port)
使用如下命令可对指定目的端口进行探测:
nping --tcp-connect -p 80 192.168.1.1
执行该命令后,结果如图所示:
这是一次有连接的探测,从屏幕输出可以看到,成功完成了对 80 端口的 TCP 建联操作。若不指定探测次数,默认仅发起 5 次探测,若要指定探测次数,可使用 -c 参数。
-p 参数的灵活性较高,既可以指定单个端口,也能指定多个端口。例如,指定特定的几个端口:
nping --tcp-connect -p 22,80,443 192.168.1.1
还可以指定端口范围:
nping --tcp-connect -p 22 - 443 192.168.1.1
2)指定源端口探测(-g/–source-port)
下面的命令使用 65535 高端口对目标主机的 22 端口发起探测,并通过 -c 指定探测次数为 1 次:
nping --tcp-connect -g 65535 -p 22 192.168.1.1 -c 1
执行结果如下:
从结果中能够看到,客户端和服务端正常完成了握手过程(65535 -> 22)。若目标端口为非开放端口,收到的显示则如下:
这表明客户端发起 SYN 申请握手,但被对端以 RST,ACK
回绝。
2. TCP 探测模式(–tcp)
参数 | 说明 |
---|---|
-p/–dest-port | 指定目的端口 |
-g/–source-port | 指定源端口 |
–seq | 指定序列号 |
–flags | 指定 TCP 标识 |
–ack | 指定 ack 数 |
–win | 指定窗口大小 |
–badsum | 使用随机无效 checksum |
TCP 探测模式与 TCP - connect 探测模式的最大区别在于,前者无需完成完整的建联过程,因此效率相对更高。接下来,我们将针对几个常用参数逐一展开说明。
1)指定源/目的端口(-p/-g)
nping --tcp -p 80 -c 1 192.168.1.1
nping --tcp -g 65535 -p 80 -c 1 192.168.1.1
在 --tcp
模式下,显示的参数相较于 --tcp - connect
模式更为详细,报文字段信息更加丰富:
与 --tcp - connect
模式明显不同的是,--tcp
模式无需完成完整的建联过程。当收到 SYN,ACK
后,便判断该端口处于开放状态,随后发送 RST 中断连接,这与 nmap 的 -sS
半开扫描探测逻辑一致。这种方式能够省去不必要的交互过程,既节省了网络流量,又提高了探测效率。
2)指定 TCP 标志位(–flags)
通过指定标识,我们可以发起任意标识的 TCP 探测。例如,发起一个标志位为 SYN 的请求包:
nping --tcp -g 65535 -p 80 -c 1 --flags syn 192.168.1.1
nping --tcp -g 65535 -p 80 -c 1 --flags s 192.168.1.1
执行结果如图:
这里,写成 syn 或者缩写 s 均可,而且不区分大小写。此外,还可以将多个标志配合使用,例如 SA 表示 SYN,ACK
,PA 表示 PSH,ACK
。当然,也可以使用十六进制表示,范围为 0x00–0xFF
。例如,指定 0x012
发送 SYN,ACK
请求:
不出所料,该请求被目的主机以 RST 拒绝连接,因为在目的端看来,这是一个不完整的非法握手请求。
3)指定窗口大小(–win)
以下命令将客户端的 Window size
指定为 1600 字节:
nping --tcp -g 65535 -p 80 -c 1 --win 1600 192.168.1.1
执行结果如下:
窗口大小表示本端向对端说明当前本端缓冲区还能够处理的最大字节数,期望对端发出的数据包大小不要超过该值。从单个包大小的维度来看,这与 MTU 密切相关,每次发包的最大大小由两端 MTU 中较小的一方决定,若超过该值则需要进行分片发送。
3. UDP探测模式(–udp)
参数 | 说明 |
---|---|
-g/–source-port | 指定源端口 |
-p/–dest-port | 指定目的端口 |
1)指定目的端口探测(-p/–dest-port)
使用如下命令进行指定目的端口的探测:
nping --udp -p 53 -c 1 192.168.1.197
执行上述命令后,得到的结果如图所示:
对端回复了Port unreachabel
(端口不可达),这表明该端口处于关闭状态,或者被防火墙拦截。
2)指定源端口及目的端口(-g/–source-port)
相关结果展示如下:
3)配合payload选项使用(–data-string)
利用以下命令,可在发起探测时设置udp paylaod
:
nping --udp -g 65535 -p 8080 -c 1 --data-string test 192.168.1.197
执行结果如图:
需要注意的是,设置udp paylaod
的前提是目的主机能够识别payload
并作出回应。此处通过socat
在目的主机上进行了udp监听及回显功能设置,效果展示如下:
4. ICMP探测模式(–icmp)
参数 | 说明 |
---|---|
–icmp-type | 设置icmp type |
–icmp-code | 设置icmp code |
–icmp-id | 设置标识id |
–icmp-seq | 设置序列号 |
–icmp-redirect-addr | 设置重定向地址 |
–icmp-param-pointer | 设置参数问题指针 |
–icmp-advert-entry | 添加路由实体 |
–icmp-orig-time | 设置初始时间戳 |
–icmp-recv-time | 设置接收时间戳 |
–icmp-trans-time | 设置传输时间戳 |
ICMP支持自定义的参数较多,下面将详细讲解常用且实用的参数。
1)指定icmp type发起探测(–icmp-type)
nping允许用户发起高度自定义的icmp type
和icmp code
请求。在主动式探测场景中,常用的类型并不多;而在被动服务式场景下,这种高度自定义功能则较为有用。
发起icmp request的命令如下:
nping --icmp --icmp-type 8 -c 1 192.168.1.1
执行结果如图:
这是一个正常的icmp请求,同时nping会统计rtt时延。若不指定--icmp-type
,默认值为8。
若发起icmp reply,命令如下:
nping --icmp --icmp-type 0 -c 1 192.168.1.1
执行结果如图:
这是一个不符合协议交互逻辑的请求。在目的主机看来,自己并未发送icmp request却收到了icmp reply,因此对端通常会忽略该请求。不过,这个包确实可以单独发送。
2)指定icmp code发起探测(–icmp-code)
每个icmp type
都对应一组icmp code
,用于细化状态。
例如,目的不可达的icmp type
为3,当icmp code
为3时,会模拟端口不可达请求(Port unreachabel
),命令如下:
nping --icmp --icmp-type 3 --icmp-code 3 -c 1 192.168.1.1
执行结果如图:
关于每个icmp type
对应的icmp code
含义,可参考IANA官方对ICMP协议的type和code的分配说明。
3)指定icmp id探测(–icmp-id)
该参数用于指定icmp identifier,可在大流量场景下,帮助对端主机精准过滤出来自源端发起的特定包的探测。其设置范围为0<=N<2^16
,即N∈[0 - 65536)
。例如,指定icmp id
的命令如下:
nping --icmp --icmp-code 0 --icmp-id 1024 -c 1 -vv 192.168.1.1 # -vv参数可以详细展示输出
执行结果如图:
需要注意的是,当发起icmp不可达报文时,icmp头部不会包含id信息,如下所示:
4)指定icmp seq探测(–icmp-seq)
该参数与id功能类似,用于指定seq序列号,命令如下:
nping --icmp --icmp-seq 1 -c 1 -v 192.168.1.1
执行结果如图:
通过icmp.seq
可以精准过滤指定的序列号。显然,--icmp-id
和--icmp-seq
也可同时使用,命令如下:
nping --icmp --icmp-id 1024 --icmp-seq 1 -c 1 -v 192.168.1.1
执行结果如图:
5. ARP/RARP探测模式(–arp)
参数 | 说明 |
---|---|
–arp-type | ARP探测类型,可选择的值有:arp、arp-reply、rarp、rarp-reply |
–arp-sender-mac | 指定发送者的MAC地址 |
–arp-sender-ip | 指定发送者的IP地址 |
–arp-target-mac | 指定目标主机的MAC地址 |
–arp-target-ip | 指定目标主机的IP地址 |
1)指定探测类型(–arp-type)
在进行ARP探测时,可以通过--arp-type
参数指定探测类型,支持的类型包括ARP、RARP以及它们对应的回复报文。
例如,若要通过向对端主机发送ARP报文来获取对应的MAC地址,可使用以下命令:
nping --arp --arp-type arp -c 1 192.168.1.1
执行该命令后的结果如图所示:
同理,若要主动向对端发送自己的MAC地址,可发起ARP回复报文,命令如下:
nping --arp --arp-type arp-reply -c 1 192.168.1.1
执行结果展示如下:
2)指定发送者的MAC地址(–arp-sender-mac)
借助--arp-sender-mac
参数,能够指定要发送给对端主机的MAC地址。利用这一特性,可以刷新对端的ARP地址表,从而达到ARP欺骗的目的。示例命令如下:
nping --arp --arp-type arp-reply --arp-sender-mac 00:00:00:00:00:01 -c 1 192.168.1.1
执行该命令后的结果如图:
3)指定发送者的IP地址(–arp-sender-ip)
此参数可用于伪造ARP头部中的send ip address
字段,使对端主机误以为ARP地址请求是从该源地址发出的,进而会向此源地址发送回复。示例命令如下:
nping --arp --arp-type arp --arp-sender-ip 192.168.1.197 -c 1 192.168.1.1
执行结果如图所示:
将--arp-sender-ip
与--arp-sender-mac
搭配使用,能够实现伪造IP和MAC地址的功能。通过向广播域发送ARP请求,并将请求的回应指定到设置的伪造地址,示例命令如下:
nping --arp --arp-type arp --arp-sender-ip 192.168.1.197 --arp-sender-mac 00:0c:29:50:c6:dc -c 1 192.168.1.84
执行结果如下:
ARP请求头的展示如下:
4)指定目的主机MAC地址及IP地址(–arp-target-mac/–arp-target-ip)/ARP泛洪
结合前面介绍的几个参数,可以指定ARP头部中所有可伪造的IP和MAC字段。例如,将IP地址192.168.1.84
与一个错误的MAC地址进行捆绑,并向网关主机发送ARP reply
报文,以刷新和填充其ARP表,示例命令如下:
nping --arp --arp-type arp-reply --arp-target-mac 00:0C:29:BE:5A:26 --arp-target-ip 192.168.1.1 --arp-sender-ip 192.168.1.84 --arp-sender-mac 00:00:00:00:00:01 -c 1 192.168.1.1
执行结果如图:
当捆绑的伪造IP - MAC
地址对数量足够庞大时,会使网关的ARP条目耗尽,导致合法用户无法维持正确的ARP地址表,进而造成通信中断。这种行为通常被称为ARP泛洪攻击
。
6. 探测模式的路由跟踪(–tr/–traceroute)
此路由跟踪模式适用于TCP
、UDP
和ICMP
探测模式,但不适用于TCP全连接和ARP模式。
在实际网络环境中,当需要确认链路是否存在丢包情况,而对端主机禁止了ping
操作,仅开放了特定协议时,该模式可以与TCP
、UDP
或ICMP
探测模式配合使用,从而精准控制路由跟踪所使用的协议。--tr
参数会对沿途经过的所有路由节点进行探测。不过,有些路由节点可能只进行数据包转发而不进行响应(即拒绝回显),在客户端看来,这种情况等同于超时无响应。
下面是对tcp/53
端口进行路由跟踪的示例命令:
nping --tcp -p 53 --traceroute -c 12 --flags syn -v 119.29.29.29
执行结果如图所示:
由于内网使用OpenWrt进行了劫持转发,--tr
参数可能只会显示一跳路由信息。这里我们使用另一台机器进行测试。
- 命令中的
-c 12
表示整个命令总共发起12个探测包,可理解为只对沿途经过的12个节点进行探测,默认情况下每个节点仅探测一次。 - 最终显示丢包5个(丢包率为41.67%),这里的丢包并非真正意义上的数据包丢失。因为此次探测的是对端的
53/dns
服务端口,且未发起dns query
请求,所以在对端看来没有响应的必要。对于探测机而言,只要对端不响应,就会将其视为丢包。
需要注意的是,前面提到中间节点可能存在不响应的情况,这是因为出于安全考虑,部分节点会设置相关策略禁止回显。而Nping在计算丢包率时,会将这部分不响应的数据也纳入统计范围。因此,在实际应用中,不必过于依赖最终的丢包率,将其作为特定协议的路径跟踪工具是一个不错的选择。
对于ICMP
和UDP
协议,路由跟踪的使用方法与之类似,示例命令如下:
nping --udp -p 53 --traceroute -c 12 -v 119.29.29.29
nping --icmp --traceroute -c 9 -v 114.114.114.114
执行结果分别如下:
三、探测选项详解(OPTIONS)
1. IPv4 OPTIONS
接下来将详细讲解IPv4参数选项中的常用参数:
选项 | 说明 |
---|---|
-S/–source-ip | 设置源地址 |
–dest-ip | 设置目的地址 |
–id | 设置identification字段 |
–df | 不允许分片 |
–ttl | 设置生存周期,范围为0 - 255 |
–mtu | 设置MTU大小 |
1)指定源主机(-S/–source-ip)
从参数名称就能直观了解其作用,该参数用于指定源地址。借助此参数,既可以指定其他网卡的IP地址,也能够指定任意IP地址进行伪造操作。例如,我们可以指定网关IP向目的主机192.168.1.197
的80端口发送SYN
探测包,命令如下:
nping --tcp -S 192.168.1.1 --flags syn -p 80 -c 1 192.168.1.197
执行上述命令后,结果如图所示:
此参数适用于所有具备IP层的探测模式。
2)指定目的主机(–dest-ip)
该参数用于指定目的主机。实际上,无论是否添加此参数,默认都会携带该信息。以下是一些使用示例:
nping --icmp --icmp-type 8 -c 1 --dest-ip 192.168.1.1 192.168.1.197 # 向1.1和1.197发起icmp探测
nping --icmp --icmp-type 8 -c 1 --dest-ip 192.168.1.0/24 # 向整个C端网络发起icmp探测
执行结果展示如下:
3)指定identification(–id)
identification
字段在数据包分析中非常实用。前面提到,在ICMP协议中,可以通过--icmp-id
和--icmp-seq
来标识报文,以便后续精准过滤出我们发送的特定数据包。同理,在其他探测模式中也有--id
字段,这里的--id
指的是IP层的identification
,不过ARP协议没有该字段。
若要指定TCP探测的id
字段,可以使用以下命令:
nping --tcp -p 22 --id 1024 192.168.1.1 -v -c 1 # 指定id为1024
执行结果如图:
对于UDP探测,示例命令如下:
nping --udp -p 8080 --id 1024 --data-string test 192.168.1.197 -c 1 -v
执行结果如下:
我们可以通过ip.id
筛选出我们发送的特定报文,之后跟踪udp.stream
便能看到一条完整的数据流,如图所示:
4)设置不分片标志位(–df)
--df
参数代表Don't Fragment
,即不允许分片。当报文大小超过客户端和服务器端协商的最小MTU时,默认情况下会进行分片传输。而使用此参数则可以指定不允许进行分片操作,所发送的报文就是完整的报文,即便对端无法处理而丢弃该报文,也不会进行分片。由于该标志位位于IP层,因此所有在IP层或之上的协议都可以设置此字段,显然支持TCP、UDP、ICMP这三大探测模式。
以下是设置TCP探测不分片的示例命令:
nping --tcp -p 80 --df 192.168.1.1 -c 1
执行结果如图:
从图中可以看到,IP层的flag
标志位的DF
字段被设置为1,表示不允许分片。
其他探测模式的使用方法类似,示例命令如下:
nping --udp -p 53 --df 192.168.1.1 -c 1
nping --icmp --icmp-type 8 --df 192.168.1.1 -c 1
5)设置生存周期(–ttl)
--ttl
参数用于指定time to live
,即报文的生存周期。报文每经过一个路由节点,ttl
值就会减1。如果不设置ttl
,则会读取系统的默认ttl
值,不同的操作系统默认ttl
值可能会有所不同。
由于ttl
位于IP层头部,因此ICMP、TCP、UDP协议均支持该参数的设置。以下是指定ttl
为1的示例命令:
nping --icmp --ttl 1 -c 1 -v 192.168.1.1
nping --udp -p 53 --ttl 1 -c 1 -v 192.168.1.1
nping --tcp -p 80 --ttl 1 -c 1 -v 192.168.1.1
执行结果如图:
因为源端和对端是直接连接的,中间不需要经过路由节点,所以即使将ttl
设置为1,数据也能够正常传输。
6)设置MTU大小(–mtu)
--mtu
参数用于指定发送方的最大传输单元(Maximum Transmission Unit
)。如果报文大小超出了设定的值,则需要进行分片发送。以下是相关示例命令:
nping --tcp -p 80 --mtu 16 --data-length 1000 -v 192.168.1.197 -c 1 # --data-length指定payload大小,随机填充
nping --icmp --mtu 16 --data-length 1000 -v 192.168.1.197 -c 1
nping --udp --mtu 16 -v 192.168.1.197 -c 1
执行结果如图所示:
2. 回显模式(ECHO CLIENT/SERVER)
选项 | 说明 |
---|---|
–ec/–echo-client | 客户端模式 |
–es/–echo-server | 服务端模式 |
–ep/–echo-port | 使用自定义端口来监听或连接 |
–nc/–no-crypto | 关闭加密和验证 |
–once | 一次连接后停止服务器 |
1)client和server端(–ec/–echo-client、–es/–echo-server)
这两个参数需配合使用,分别代表客户端和服务端,与iperf3的c/s测速模式类似。不过,nping的这一功能主要用于探测,尤其适用于持续性测试点到点之间的延时。
server端配置:
nping --echo-server "public" -e ens192 -vvv # "public" 为任意字符串,需与 client 端对应
执行上述命令后,结果展示如下:
client端配置:
nping --echo-client "public" 192.168.1.197 --tcp -p 80
执行结果如图所示:
2)指定监听端口(–ep/–echo-port)
该参数可选择性添加,用于指定echo server的监听端口。若不添加,默认使用9929端口。
server端配置:
nping --echo-server "public" -e ens192 -v3 --ep 10 --nc # --nc 表示不做加密和验证,添加此参数后,client 端也需对应添加
执行结果如下:
client端配置:
nping --echo-client "public" 192.168.1.197 --tcp -p 80 --ep 10 --nc -c 2
执行结果展示如下:
3)一次性监听(–once)
此参数用于server端,当client端完成一次完整探测后,server端将自动关闭监听。
server端配置:
nping --echo-server "public" -e ens192 -v3 --nc --once
执行结果如图:
client端配置:
nping --echo-client "public" 192.168.1.197 --udp -p 8080 --nc -c 2 --once
执行结果如下:
3. 延时和速率(Timing&Performance)
选项 | 说明 |
---|---|
–delay | 指定探测延时(单位:ms、s、m、h) |
–rate | 每秒发送包量 |
1)指定探测延时/间隔(–delay)
--delay
参数可用于指定每次探测包之间的延时间隔。当对端对单位时间内的访问频率有限制时,可利用此参数绕过检测。
以下是不同协议的使用示例:
TCP SYN探测:每2秒发送一次SYN探测包,可使用以下命令:
nping --tcp -p 80,443 --flags syn -v --delay 2s -c 2 www.qq.com
执行结果如图:
UDP探测:每10秒发起一次udp探测,命令如下:
nping --udp -p 53 -v -c 2 --delay 10s --data-length 16 192.168.1.197
执行结果展示如下:
ICMP探测:每10秒发起一次icmp探测,可使用以下命令:
nping --icmp --icmp-type 8 -c 2 --delay 10s 192.168.1.1
执行结果如图所示:
此参数适用于所有探测模式。
2)指定每秒发包量(–rate)
默认情况下,nping在单位时间(1秒)内仅发送一次包。通过 --rate
参数,可以指定任意的发包量。
以下是不同协议的使用示例:
ICMP探测:承接上面的icmp探测,指定每秒发包量为5个,发包间隔为0.01秒,可使用以下命令:
nping --icmp --icmp-type 8 --rate 5 --delay 0.01s 192.168.1.1
执行结果如下:
在这个例子中,
--rate
指定了单位时间内发送5个包,--delay
将发包间隔设定为0.01秒,这样可以快速获取返回结果。TCP SYN探测:指定每秒发送10个TCP SYN探测包,命令如下:
nping --tcp -p 80 -v --rate 10 192.168.1.197
执行结果如图:
此参数同样适用于所有探测模式。
4. 其他参数
选项 | 说明 |
---|---|
-c | 到达发包次数后停止 |
-e/–interface | 指定网卡 |
-H/–hide-sent | 不显示发送的包 |
-N/–no-capture | 不抓响应包 |
-v/-vlevel | 显示详细输出,一共1 - 4个等级 |
-d/-dlevel | 显示debug信息,一共3个等级 |
–debug | 显示输出信息及debug信息为最高级 |
以上参数的说明已较为详细,部分参数也已在前面的示例中进行了演示。因此,这里不再逐一举例说明。若需了解详细用法,可参考man文档。
四、总结
上述内容详细介绍了nping的各类探测使用指南。nping功能强大,在很多方面并不亚于nmap。它具备一些nmap所没有的高级功能,并且二者的定位有所不同。nmap侧重于端口扫描,而nping更适用于网络延时分析、路径跟踪等场景。在安全领域,nping是不可或缺的工具之一。在渗透测试前期,信息收集工作至关重要,nping能够发挥重要作用,因此也成为攻击者常用的工具。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。
文章由技术书栈整理,本文链接:https://study.disign.me/article/202511/3.linux-command-nping.md
发布时间: 2025-03-10