網路與 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