如何 ping 一個 IP 段:批次檢測網段線上主機的四種方法
ping 一個 IP 段就是對網段裡的每個位址各發一次 ICMP 請求,把有回應的列出來。Windows 用 for /L 迴圈,Linux 用 fping 或 nmap -sn,幾秒鐘就能掃完一個 /24,結果可以直接匯出成檔案和 IP 台帳對帳。
如何 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。判斷這類主機是否存活,有四條路:
- 看 ARP。 只要和目標在同一個二層網路,ping 之前系統會先發 ARP 請求,主機只要開機就必須回 ARP。掃完一遍後執行
ip neigh show | grep -v FAILED(Windows 用arp -a),帶有 MAC 位址的條目就是存活的主機。也可以直接用sudo arp-scan --localnet做二層掃描。 - TCP 探測。 主機總要開放業務連接埠。
nmap -sn -PS22,80,443,3389對這些連接埠發 SYN,有 SYN/ACK 或 RST 回應都說明主機線上;單個位址可用nc -zv -w 1 192.168.10.5 22試探。 - 查交換器表項。 登入接入交換器檢視 ARP 表和 MAC 位址表,例如華為、H3C 的
display arp、display mac-address,思科的show ip arp、show mac address-table。表裡有的位址,對應連接埠上就掛著活的裝置。 - 走帶外。 伺服器的 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 逐個探測。