关注:CodingTechWork
NPing 介绍
什么是 NPing?
NPing 是 Nmap 网络扫描工具套件中的一员,它是一个开源的网络包生成工具 ,允许用户发送自定义的 TCP、UDP、ICMP 和 ARP 数据包。与传统的 ping 命令相比,NPing 提供了更强大的灵活性和控制能力。
核心特性
| 特性 | 说明 |
|---|---|
| 多协议支持 | TCP、UDP、ICMP、ARP |
| 自定义标志位 | TCP SYN、ACK、FIN、RST、PSH、URG |
| 精确速率控制 | 支持每秒发包数(rate)限制 |
| 数据负载注入 | 可携带自定义字符串或十六进制数据 |
| 跨平台支持 | Linux、Windows、macOS、FreeBSD |
| 命令行友好 | 适合脚本化和自动化测试 |
与传统工具对比
| 功能 | ping | hping3 | NPing |
|---|---|---|---|
| ICMP 支持 | 是 | 是 | 是 |
| TCP 支持 | 否 | 是 | 是 |
| UDP 支持 | 否 | 是 | 是 |
| ARP 支持 | 否 | 是 | 是 |
| 速率控制 | 有限 | 是 | 是 |
| 易用性 | 优秀 | 一般 | 良好 |
| 文档完善度 | 优秀 | 一般 | 良好 |
适用场景
- 网络安全测试:防火墙规则验证、IDS/IPS 绕过测试
- 网络性能评估:带宽测试、延迟测量、丢包率检测
- 协议开发调试:自定义协议包验证
- 压力测试:模拟 DDoS 攻击、高负载场景
- 网络故障排查:连接性问题定位
安装与基础使用
安装 NPing
Linux (Debian/Ubuntu)
bash
# 安装 Nmap 套件(包含 NPing)
sudo apt update
sudo apt install nmap
# 验证安装
nping --version
Linux (CentOS/RHEL/Fedora)
bash
sudo yum install nmap
# 或
sudo dnf install nmap
macOS
bash
# 使用 Homebrew
brew install nmap
Windows
- 访问 Nmap 官网下载页面
- 下载 Windows 安装包
- 安装时确保勾选 NPing 组件
- 添加到系统 PATH 环境变量
基础命令结构
bash
nping [选项] [目标]
工作原理与网络原理图
NPing 工作原理
NPing 的核心工作原理可以概括为以下几个层次:
原始套接字(Raw Socket)技术
NPing 绕过操作系统协议栈的部分处理,直接通过原始套接字(Raw Socket)构造和发送数据包。这使其能够:
- 自定义 IP 头部的所有字段(TTL、TOS、分片标志等)
- 自定义传输层头部(TCP/UDP/ICMP 的完整头部)
- 发送非标准状态的数据包(如 TCP SYN+ACK 组合)
- 绕过内核的协议栈校验和计算
包构造流程
NPing 生成一个数据包的过程如下:
- 用户指定协议类型(
--tcp/--udp/--icmp/--arp) - 根据协议构建头部:填充端口号、标志位、序列号等
- 添加数据负载:用户指定的字符串或随机数据
- 计算校验和:NPing 自动计算正确的校验和
- 封装链路层头部:添加源/目标 MAC 地址
- 注入网络:通过原始套接字将包发送到网卡
接收处理机制
NPing 同时启动一个监听线程:
- 捕获返回的数据包
- 匹配请求包的 ID 和序列号
- 计算往返时间(RTT)
- 统计丢包率和延迟数据
网络原理图
NPing 包生成与发送流程

TCP SYN 探测的网络交互过程

NPing 完整工作架构图

TCP 数据包结构(SYN 标志位示例)

命令详解
全局参数
| 参数 | 说明 | 示例 |
|---|---|---|
-c, --count |
发送包数量 | -c 100 |
-i, --delay |
包间隔时间(秒/毫秒) | -i 1s 或 -i 500ms |
--rate |
发包速率(包/秒) | --rate 100 |
-e, --interface |
指定网络接口 | -e eth0 |
-H, --hide-sent |
隐藏发送的包信息 | -H |
-N, --no-capture |
不显示接收的回复 | -N |
--ttl |
设置 IP 生存时间 | --ttl 32 |
--tos |
设置服务类型 | --tos 0x10 |
协议模式参数
TCP 模式
bash
nping --tcp [选项] 目标
| 参数 | 说明 |
|---|---|
-p, --dest-port |
目标端口 |
-g, --source-port |
源端口 |
--flags |
TCP 标志位 (SYN, ACK, FIN, RST, PSH, URG) |
--seq |
序列号 |
--ack |
确认号 |
--win |
窗口大小 |
UDP 模式
bash
nping --udp [选项] 目标
| 参数 | 说明 |
|---|---|
-p, --dest-port |
目标端口 |
-g, --source-port |
源端口 |
ICMP 模式
bash
nping --icmp [选项] 目标
| 参数 | 说明 |
|---|---|
--icmp-type |
ICMP 类型 (0=echo reply, 8=echo request) |
--icmp-code |
ICMP 代码 |
ARP 模式
bash
nping --arp [选项] 目标
数据负载参数
| 参数 | 说明 | 示例 |
|---|---|---|
--data |
十六进制数据 | --data 48656C6C6F |
--data-string |
字符串数据 | --data-string "Hello World" |
--data-length |
随机数据长度 | --data-length 100 |
场景应用实战
场景 1:TCP 端口连通性测试
需求:测试 Web 服务器 80 端口是否开放
bash
# 发送 TCP SYN 包
sudo nping --tcp -p 80 -c 3 192.168.1.100
# 同时抓包分析
sudo tcpdump -i eth0 host 192.168.1.100 and tcp port 80 -w tcp_syn.pcap
预期结果:
- 收到 SYN/ACK:端口开放
- 收到 RST:端口关闭
- 无响应:防火墙阻挡
场景 2:UDP 服务可用性测试
需求:测试 DNS 服务器是否响应查询
bash
# 发送自定义 UDP 包到 DNS 端口
sudo nping --udp -p 53 -c 5 --data-string "test" 8.8.8.8
# 配合 tcpdump 抓包
sudo tcpdump -i eth0 udp port 53 -w dns_test.pcap
场景 3:防火墙规则验证
需求:验证防火墙是否拦截 ICMP 包
bash
# 测试 ICMP 是否被允许
sudo nping --icmp -c 10 192.168.1.1
# 如果被拦截,尝试 TCP 端口
sudo nping --tcp -p 22 -c 10 192.168.1.1
场景 4:网络性能基准测试
需求:测量到网关的延迟和丢包率
bash
# 发送 1000 个包,间隔 10ms
sudo nping --icmp -c 1000 -i 10ms 192.168.1.1
# 输出统计信息
# Max rtt: 5.2ms | Min rtt: 0.8ms | Avg rtt: 1.5ms
# Sent: 1000 | Received: 998 | Lost: 2 (0.20% loss)
场景 5:压力测试与流量模拟
需求:模拟 DDoS 攻击,测试设备抗压能力
bash
# 以每秒 1000 包的速率发送 10000 个 SYN 包
sudo nping --tcp -p 80 --rate 1000 -c 10000 192.168.1.100
# 同时抓包监控
sudo tcpdump -i eth0 -s 0 -w stress_test.pcap
场景 6:ARP 欺骗检测
需求:发送 ARP 请求检测网络设备
bash
# 扫描整个局域网
sudo nping --arp 192.168.1.0/24
# 查看响应,识别设备 MAC 地址
场景 7:自定义 TCP 标志位测试
需求:测试服务器的 TCP 状态机处理
bash
# 发送 FIN 包(扫描关闭的连接)
sudo nping --tcp --flags fin -p 80 -c 5 192.168.1.100
# 发送 ACK 包(测试无状态防火墙)
sudo nping --tcp --flags ack -p 80 -c 5 192.168.1.100
# 发送 SYN+ACK 包(欺骗测试)
sudo nping --tcp --flags syn,ack -p 80 -c 5 192.168.1.100
场景 8:完整的流量模拟+抓包脚本
需求:自动化测试脚本,同时记录流量
bash
#!/bin/bash
# test_network.sh - 网络测试自动化脚本
TARGET="192.168.1.100"
PCAP_FILE="test_$(date +%Y%m%d_%H%M%S).pcap"
# 启动抓包(后台)
echo "[*] Starting packet capture..."
sudo timeout 30 tcpdump -i eth0 -s 0 -w $PCAP_FILE &
TCPDUMP_PID=$!
# 等待抓包初始化
sleep 2
# 执行多种测试
echo "[*] Testing ICMP..."
sudo nping --icmp -c 10 -i 100ms $TARGET
echo "[*] Testing TCP port 80..."
sudo nping --tcp -p 80 -c 5 $TARGET
echo "[*] Testing UDP port 53..."
sudo nping --udp -p 53 -c 5 --data-string "test" $TARGET
# 停止抓包
echo "[*] Stopping packet capture..."
sudo kill $TCPDUMP_PID
echo "[✓] Test completed! PCAP saved: $PCAP_FILE"
# 分析抓包结果
echo "[*] Packet statistics:"
tcpdump -r $PCAP_FILE -q | wc -l
结合 Wireshark 分析
bash
# 1. 生成流量并保存 pcap
sudo nping --tcp -p 80 -c 1000 --rate 100 192.168.1.100 &
sudo tcpdump -i eth0 -w capture.pcap -G 10 -W 1
# 2. 用 Wireshark 打开分析
wireshark capture.pcap
# 3. 应用过滤器查看特定流量
# tcp.flags.syn == 1
# ip.src == 192.168.1.100
常见问题与排错
权限问题
问题 :Operation not permitted 或 Permission denied
原因:构造原始包需要 root 权限
解决:
bash
# 使用 sudo
sudo nping --tcp -p 80 192.168.1.100
接口选择错误
问题 :No valid interface found
解决:
bash
# 查看可用接口
ip link show
# 或
ifconfig -a
# 指定正确的接口
sudo nping --tcp -e eth0 -p 80 192.168.1.100
目标不可达
问题 :Destination Host Unreachable
可能原因:
- 路由问题
- 防火墙阻挡
- 目标设备离线
排查步骤:
bash
# 1. 检查基本连通性
ping -c 3 目标IP
# 2. 检查路由表
ip route show
# 3. 检查防火墙规则
sudo iptables -L -n
性能问题
问题:高速发包时丢包严重
解决:
bash
# 1. 增加系统缓冲区
sudo sysctl -w net.core.rmem_max=26214400
sudo sysctl -w net.core.wmem_max=26214400
# 2. 使用更高效的网卡驱动
# 3. 减少不必要的输出
sudo nping --tcp -p 80 -c 10000 -H -N 192.168.1.100
与 Wireshark 配合问题
问题:Wireshark 看不到 NPing 发出的包
解决:
bash
# 1. 确认抓包接口正确
sudo tcpdump -D
# 2. 使用 promiscuous 模式
sudo tcpdump -i eth0 -I -w capture.pcap
# 3. 检查是否被系统防火墙拦截
sudo iptables -L -n -v
实践总结
| 场景 | 推荐命令模板 |
|---|---|
| 快速连通性测试 | sudo nping --icmp -c 5 |
| TCP 端口扫描 | sudo nping --tcp -p -c 3 |
| 性能基准测试 | sudo nping --icmp -c 1000 -i 10ms |
| 压力测试 | sudo nping --tcp -p 80 --rate 1000 -c 10000 |
| 完整测试套件 | 使用脚本组合抓包和多种协议测试 |