使用 Python 與 Scapy 打造網路掃描器

tags: python, networking, security, tutorial


tags: python, networking, security, tutorial


使用 Python 與 Scapy 打造網路掃描器

想像一下,你坐在桌前,想知道究竟有哪些裝置正潛伏在你的區域網路中。那台新買的智慧電視真的有連線嗎?有沒有未經授權的人加入你的 Wi-Fi?與其猜測,不如寫一段腳本,直接從終端機顯示每台裝置的 IP 與 MAC 位址。只要使用 Python 與功能強大的 Scapy 函式庫,打造網路掃描器不僅可行,而且出乎意料地簡單,今天就能讓它運作。

為什麼選擇 Scapy?

Scapy 是一套專為封包操作而設計的 Python 函式庫。它能讓你以低階方式建立、傳送並分析網路封包,非常適合網路掃描、入侵偵測與協定分析等任務 [1][2]。與那些隱藏細節的高階工具不同,Scapy 給你完整的控制權——這對於學習網路實際運作方式來說再適合不過。

環境設定

撰寫程式碼前,你需要先安裝 Scapy。它並非 Python 預設內建,因此需透過 pip 安裝。

安裝 Scapy

在 Linux 或 macOS 上:

pip install scapy

Enter fullscreen mode Exit fullscreen mode

在 Windows 上,你還需安裝 Npcap 並在安裝過程中啟用 WinPcap API 相容模式 [3]。之後執行:

pip install scapy

Enter fullscreen mode Exit fullscreen mode

若想擁有乾淨且獨立的環境,建議使用虛擬環境:

mkdir scanner
cd scanner
python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate
pip install scapy

Enter fullscreen mode Exit fullscreen mode

這種方式可確保你的掃描器專案不會干擾其他 Python 套件 [7]。

核心概念:ARP 掃描

要在區域網路中發現裝置,最有效的方法是透過 ARP(位址解析協定)掃描。ARP 用來將 IP 位址對應到 MAC 位址。當你將 ARP 請求廣播至整個網路時,每台收到請求的裝置都會回覆其 IP 與 MAC 位址,給你一份即時清單 [1][2]。

其運作步驟如下:

  1. 建立 ARP 請求封包。
  2. 設定目標網路範圍。
  3. 將封包廣播給所有裝置。
  4. 捕捉並解析回應。
  5. 列印每台裝置的 IP 與 MAC 位址。

你的第一個網路掃描器:可運作程式碼

讓我們建立一個完整的掃描器。這個腳本將掃描你的區域網路(例如 192.168.1.0/24)並列出所有活躍裝置。

from scapy.all import ARP, Ether, srp

# Define the network range to scan
target_ip = "192.168.1.0/24"

# Create an ARP request packet
arp = ARP(pdst=target_ip)

# Create an Ethernet frame with broadcast destination
ether = Ether(dst="ff:ff:ff:ff:ff:ff")

# Combine them into a packet
packet = ether / arp

# Send and receive packets at layer 2
result = srp(packet, timeout=3)[0]

# Store discovered clients
clients = []

for sent, received in result:
    clients.append({'ip': received.psrc, 'mac': received.hwsrc})

# Print results
print("Available devices in the network:")
print("IP" + " "*18+"MAC")
for client in clients:
    print(client['ip'] + " "*18 + client['mac'])

Enter fullscreen mode Exit fullscreen mode

將此程式碼儲存為 scanner.py 並執行:

python scanner.py

Enter fullscreen mode Exit fullscreen mode

你將看到目前連線至你網路的所有裝置清單 [2]。

注意:此腳本需要網路存取權限。在 Linux 上,請使用 sudo 執行。在 Windows 上,請確認已正確安裝 Npcap [3]。

實用化:為你的網路進行客製化

上述範例使用硬式編碼的 IP 範圍。為了讓它在今天就能派上用場,請調整為你實際的網路:

找出你的網路範圍

在 Linux/macOS 上:

ip route | grep default

Enter fullscreen mode Exit fullscreen mode

在 Windows 上:

ipconfig

Enter fullscreen mode Exit fullscreen mode

找出你的 IPv4 位址與子網路(例如 192.168.1.100/24)。使用前三個八位元 + /24 作為目標。

例如,若你的 IP 是 10.0.0.5,請設定:

target_ip = "10.0.0.0/24"

Enter fullscreen mode Exit fullscreen mode

加入錯誤處理

將掃描邏輯包裝成函式,並妥善處理逾時:

def scan_network(target):
    try:
        arp = ARP(pdst=target)
        ether = Ether(dst="ff:ff:ff:ff:ff:ff")
        packet = ether / arp
        result = srp(packet, timeout=3)[0]
        clients = []
        for sent, received in result:
            clients.append({'ip': received.psrc, 'mac': received.hwsrc})
        return clients
    except Exception as e:
        print(f"Error: {e}")
        return []

Enter fullscreen mode Exit fullscreen mode

現在你可以在程式碼的任何地方呼叫 scan_network("192.168.1.0/24")

超越基本掃描:接下來呢?

一旦你擁有這個可運作的掃描器,就能擴展其功能:

  • Ping 掃描:使用 Scapy 的 ICMP 功能對 IP 範圍執行 ping 掃描 [4]。
  • 匯出為 CSV:將結果儲存至檔案以供記錄或報告。
  • 圖形化介面:整合 Tkinter 或 PyQt 建立視覺化儀表板。
  • 即時監控:定期執行掃描器以偵測新加入網路的裝置。

Scapy 也支援 TCP、UDP 與自訂協定封包建立——這使其成為進階網路安全工具的基礎 [11]。

疑難排解提示

  • 只看到自己?請確認你使用的是橋接式網路卡(尤其在虛擬機器中),才能存取其他裝置 [6]。
  • 沒有回應?請檢查防火牆設定,或試著增加 srp() 中的 timeout
  • Windows 問題?請確認 Npcap 已安裝在 WinPcap 相容模式 [3]。

立即開始掃描

你現在擁有一個功能完整的網路掃描器,能顯示區域網路上的每一台裝置——無需猜測,也不需要第三方工具。只要 Python、Scapy 與幾行程式碼即可。

今晚就試著在你的家用網路執行。看看有哪些裝置正在連線。找出未知的裝置。如果你發現有趣(或可疑)的東西,歡迎在下方留言分享你的發現。

你的行動呼籲:Fork 這個腳本、為你的網路客製化,並推送到 GitHub。加上 #python#scapy#networksecurity 標籤。讓我們一起建立一個深入了解自己網路的開發者社群。

網路就在你的探索之下。開始掃描吧。


如果你覺得這篇文章有幫助,請考慮 請我喝杯咖啡 ☕ —— 這能讓更多文章持續推出!

也歡迎看看我的 AI 工具集: AI 次元世界 —— 開發者免費 AI 工具。