网络与 IP

如何 ping 一个 IP 段:批量检测网段在线主机的四种方法

ping 一个 IP 段就是对网段里的每个地址各发一次 ICMP 请求,把有回应的列出来。Windows 用 for /L 循环,Linux 用 fping 或 nmap -sn,几秒钟就能扫完一个 /24,结果可以直接导出成文件和 IP 台账对账。

作者 顶联产品团队发布于 4 分钟阅读

如何 ping 一个 IP 段?做法是让工具替你对网段里的每个地址各发一次 ICMP Echo 请求,收到回应的记为在线。Windows 上用 for /L 循环调用 ping;Linux 上用 fping -a -g 或 nmap -sn 一条命令扫完;没有额外工具时,一行 bash 也能并发 ping 完一个 /24。下面按这四种方法给出可以直接运行的命令,再讲主机禁 ping 时怎么发现、结果怎么导出,以及机房怎么用扫描结果做 IP 存活审计。

文中以 192.168.10.0/24 为例,换成你的网段即可。

方法一:Windows 用 for 循环 ping 整个网段

在命令提示符(cmd)里直接执行:

for /L %i in (1,1,254) do @ping -n 1 -w 300 192.168.10.%i | find "TTL="

参数含义:for /L %i in (1,1,254) 让 %i 从 1 到 254 每次加 1;-n 1 只发一个包;-w 300 等待回应 300 毫秒;find "TTL=" 只保留有回应的那一行,因为只有真正收到回复的输出里才带 TTL=。输出类似:

来自 192.168.10.1 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.10.5 的回复: 字节=32 时间=1ms TTL=128

写进批处理文件时,%i 要写成 %%i。要保存结果,在命令末尾加 >> alive.txt。

这种方法是串行的,每个不在线的地址都要等满 300 毫秒,一个 /24 按最坏情况要一分多钟,胜在任何 Windows 机器都能用。

PowerShell 版本更容易处理结果:

1..254 | ForEach-Object {
  $ip = "192.168.10.$_"
  if (Test-Connection -ComputerName $ip -Count 1 -Quiet) {
    [PSCustomObject]@{ IP = $ip; Status = 'up' }
  }
} | Export-Csv alive.csv -NoTypeInformation

PowerShell 7 的 Test-Connection 支持 -TimeoutSeconds 1,ForEach-Object 支持 -Parallel,可以把耗时压到几秒。

方法二:Linux 用 fping 一条命令扫完

fping 专为批量 ping 设计,把整个网段的探测包并发发出去,不用等上一个超时:

# 安装
sudo apt install fping              # Debian / Ubuntu
sudo dnf install epel-release       # Rocky / AlmaLinux:fping 在 EPEL 仓库
sudo dnf install fping

# 列出网段内在线的主机
fping -a -q -g 192.168.10.0/24 2>/dev/null

# 也可以写起止地址
fping -a -q -g 192.168.10.1 192.168.10.254 2>/dev/null

# 缩短超时、减少重试,扫描更快,结果存文件
fping -a -q -r 1 -t 300 -g 192.168.10.0/24 2>/dev/null > alive.txt

# 反过来列出不在线的地址
fping -u -q -g 192.168.10.0/24 2>/dev/null

# 从文件读目标(每行一个 IP)
fping -a -q -f targets.txt 2>/dev/null

-a 只显示在线(alive)的,-u 只显示不可达(unreachable)的,-q 不打印每个目标的统计,-g 按 CIDR 或起止地址生成目标列表,-r 1 只重试一次,-t 300 超时 300 毫秒。用 CIDR 写法时,fping 会自动跳过网络地址和广播地址。2>/dev/null 把不可达的错误信息丢掉,只留下干净的地址列表。一个 /24 通常几秒钟扫完。

方法三:nmap -sn 扫描网段在线主机

nmap -sn 是“只做主机发现、不扫端口”的模式。它比单纯 ping 更强:以 root 运行时,对同一二层网络的目标默认用 ARP 请求探测,对远程网段默认同时发 ICMP Echo、ICMP 时间戳、TCP SYN 到 443、TCP ACK 到 80 四种探测包,任何一种有回应就算在线。所以很多禁了 ping 的主机,nmap 也能发现。

sudo apt install nmap        # 或 sudo dnf install nmap

# 基本用法
sudo nmap -sn 192.168.10.0/24

# 不做 DNS 反查,只输出在线 IP
sudo nmap -sn -n 192.168.10.0/24 -oG - | awk '/Up$/{print $2}'

# 对远程网段增加 TCP SYN 探测端口,发现禁 ping 的服务器
sudo nmap -sn -n -PE -PS22,80,443,3389 203.0.113.0/24

# 同一二层内只用 ARP 探测,速度和准确度都高
sudo nmap -sn -n -PR 192.168.10.0/24

# 从文件读多个网段,排除网关,结果存成 grepable 格式
sudo nmap -sn -n -iL ranges.txt --exclude 192.168.10.1 -oG scan.txt

-n 跳过反向 DNS,能省不少时间;-oG - 输出易于 grep 的格式,配合 awk 就能拿到纯 IP 列表;-PE 是 ICMP Echo,-PS 后面跟 TCP SYN 探测的端口,-PR 是 ARP 探测。非 root 用户运行时,nmap 退化为对 80 和 443 端口的 TCP 连接探测,结果会少一些。

方法四:不装工具,一行 bash 并发 ping

临时登录一台没有 fping 和 nmap 的 Linux 机器,用系统自带的 ping 加后台并发即可:

net=192.168.10
for i in $(seq 1 254); do
  ( ping -c 1 -W 1 $net.$i >/dev/null 2>&1 && echo "$net.$i" ) &
done
wait

-c 1 发一个包,-W 1 等 1 秒(Linux iputils 的 -W 单位是秒)。每个 ping 放到后台 & 并发执行,wait 等所有子进程结束,整段 /24 一两秒就完成。输出顺序是乱的,需要排序时接 | sort -t . -k 4 -n。去掉行尾的 & 就变成串行版本,一个 /24 最多要等四分多钟。

四种方法怎么选

方法 适用环境 /24 耗时 能否发现禁 ping 主机 结果格式
Windows for /L 任何 Windows 一分钟左右(串行) 否 文本行,需自行处理
fping Linux,需安装 几秒 否 纯 IP 列表
nmap -sn Linux / Windows,需安装 几秒 是(ARP、TCP 探测) 文本、grepable、XML
bash 并发 ping 任何 Linux 一两秒 否 纯 IP 列表

日常查一下哪些地址在用,fping 够用;做审计、要发现禁 ping 的主机,用 nmap。

主机禁 ping 怎么办

ping 不通不等于主机不在线。Windows 防火墙的默认规则往往不放行 ICMP Echo 请求,很多 Linux 服务器也在防火墙里丢弃了 ICMP。判断这类主机是否存活,有四条路:

  1. 看 ARP。 只要和目标在同一个二层网络,ping 之前系统会先发 ARP 请求,主机只要开机就必须回 ARP。扫完一遍后执行 ip neigh show | grep -v FAILED(Windows 用 arp -a),带有 MAC 地址的条目就是存活的主机。也可以直接用 sudo arp-scan --localnet 做二层扫描。
  2. TCP 探测。 主机总要开放业务端口。nmap -sn -PS22,80,443,3389 对这些端口发 SYN,有 SYN/ACK 或 RST 回应都说明主机在线;单个地址可用 nc -zv -w 1 192.168.10.5 22 试探。
  3. 查交换机表项。 登录接入交换机查看 ARP 表和 MAC 地址表,例如华为、H3C 的 display arp、display mac-address,思科的 show ip arp、show mac address-table。表里有的地址,对应端口上就挂着活的设备。
  4. 走带外。 服务器的 BMC 管理口通常在另一个网段,业务口禁 ping 时,从 IPMI 侧查电源状态同样能确认机器是否开着。

跨网段扫描时还要注意网关对 ICMP 的限速:不少路由器每秒只回有限数量的 ICMP 包,扫描太快会有一批主机被误判为不在线。对结果有疑问时,把速率降下来再扫一遍,两次都没回应的才算离线。

扫描结果怎么导出

  • 纯文本:fping 和 bash 脚本的输出本身就是每行一个 IP,重定向到文件即可,文件名带上日期,如 alive-$(date +%F).txt;
  • grepable:nmap -oG scan.txt,每行形如 Host: 192.168.10.5 () Status: Up,适合用 awk、grep 二次处理;
  • XML:nmap -oX scan.xml,交给脚本或其他系统解析;-oA scan 一次生成普通、grepable、XML 三种格式;
  • CSV:在纯 IP 列表上加一列状态,awk '{print $1",up"}' alive.txt > alive.csv,方便导入表格或台账系统;
  • Windows:cmd 用 >> alive.txt;PowerShell 要先把每个结果组装成对象(上文脚本里的 [PSCustomObject]),再接 Export-Csv alive.csv -NoTypeInformation,直接把字符串管给 Export-Csv 只会得到一列 Length。

机房里怎么用:IP 存活审计

对 IDC 来说,批量 ping 一个 IP 段真正的价值不是“看看谁在线”,而是把扫描结果和 IP 台账对账,找出三类问题:

扫描结果 台账记录 说明 处理
在线 已分配 正常 无
不在线 已分配 服务器已下架或长期关机,地址没回收;或客户禁 ping 用 ARP、TCP 或 BMC 复核,确认后回收地址
在线 空闲或未登记 有人私自占用地址,或台账漏登 查交换机端口定位设备,核对后补登记或断网处理

对账用 comm 一条命令就能完成,前提是两个文件都先排序:

sort -u ipam_export.txt > recorded.txt     # 从台账导出的已分配地址
sort -u alive.txt > online.txt             # 扫描得到的在线地址
comm -23 recorded.txt online.txt > recorded_offline.txt   # 台账有、扫描没有
comm -13 recorded.txt online.txt > online_unrecorded.txt  # 扫描有、台账没有

审计频率按业务量定,常见做法是每月对公网段做一次、每季度对管理网做一次,并把每次的结果文件留档,前后对比就能看出地址回收是否及时。

台账本身准确,对账才有意义。用 IP 地址管理登记每个地址的归属,配合交换机侧的 ARP 绑定和源地址校验,未登记的地址即使有人配上也发不出流量,“扫描有、台账没有”这一类问题会越来越少;真出现时,也能通过交换机的端口与 MAC 绑定记录直接定位到是哪个机柜的哪台机器。

常见问题

ping 一个 /16 的网段要多久?

/16 有 65,534 个可用地址。fping 和 nmap 并发发包,通常几分钟内可以扫完;串行的 for 循环要按每个地址一次超时来累加,不适合大网段。

扫描自己机房的公网段会被当成攻击吗?

对自己拥有的地址段做存活扫描是正常运维操作,但探测包会经过上游和客户的防火墙,可能触发告警。控制速率、避开业务高峰,并提前告知安全团队。

IPv6 网段怎么批量 ping?

IPv6 一个 /64 有 2 的 64 次方个地址,不能逐个扫。同一链路内可以 ping 组播地址 ff02::1 让所有主机应答(Linux:ping -6 -I eth0 ff02::1),再看 ip -6 neigh 得到的邻居表;跨网段时以台账里登记的地址列表为目标,用 fping -6 或 nmap -6 -sn 逐个探测。

想看看在你的机房里怎么用?

从一次产品演示开始,梳理你的业务链路。

查看价格
服务热线 400-112-2951

让我们聊聊你的 IDC 业务

扫码添加企业微信,预约产品演示或申请试用。

Toplink 企业微信二维码

长按保存或使用企业微信 / 微信扫描

也可致电
400-112-2951
Telegram
@TopLink88