使用 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]。
其運作步驟如下:
- 建立 ARP 請求封包。
- 設定目標網路範圍。
- 將封包廣播給所有裝置。
- 捕捉並解析回應。
- 列印每台裝置的 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 工具。
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.