تقدم هذه المقالة شرحًا خطوة بخطوة لبناء نص برمجي بلغة بايثون لتحديد الأجهزة المتصلة بشبكة واي فاي. باستخدام مسح بروتوكول تحليل العناوين (ARP) وأدوات البحث عن موردي عناوين MAC، يُؤتمت هذا الحل اكتشاف الأجهزة ويُحسّن من وضوح الشبكة. نستعرض أدناه النظرية والخطوات، بالإضافة إلى طرق التحسين، لبناء أداة مراقبة شبكة فعّالة.
الأسس التقنية لاكتشاف أجهزة الشبكة
بروتوكول ARP ومسح الشبكة
يقوم بروتوكول تحليل العناوين (ARP) بتحليل عناوين IP إلى عناوين MAC ضمن شبكة محلية. عند انضمام جهاز إلى شبكة Wi-Fi، يُرسل طلبات ARP لإنشاء اتصال مع الأجهزة الأخرى. من خلال تحليل حركة مرور ARP أو إرسال طلبات ARP بنشاط، يُمكننا تجميع قائمة بالأجهزة المتصلة.
تُبسّط مكتبة Scapy في بايثون عملية إنشاء حزم ARP وتحليل الاستجابات. على سبيل المثال، تُولّد Scapy.ARP(pdst=ip_range) طلبات ARP لنطاق IP مُحدّد، بينما تُرسل ()Scapy.srp الحزم وتستقبلها على طبقة رابط البيانات الثانية.
أتمتة اكتشاف الواجهة والشبكة الفرعية
تحديد واجهة الشبكة ونطاق IP يدويًا قد يكون عرضة للخطأ. بدلاً من ذلك، تسترجع مكتبة netifaces عنوان IP وقناع الشبكة الفرعية للبوابة الافتراضية برمجيًا. تحدد دالة ()netifaces.gateways الواجهة النشطة، بينما تستخرج دالة ()netifaces.ifaddresses تكوين IP الخاص بها.
import netifaces
def get_default_gateway():
gateways = netifaces.gateways()
default = gateways.get('default', {})
return default.get(netifaces.AF_INET, (None, None))[^1]
يقوم مقتطف التعليمات البرمجية هذا بجلب الواجهة الافتراضية وعنوان IP الخاص بها، مما يتيح التكيف الديناميكي مع بيئات الشبكة المختلفة.
التنفيذ خطوة بخطوة
الخطوة 1: تثبيت التبعيات
تثبيت المكتبات المطلوبة باستخدام pip:
pip install scapy netifaces mac-vendor-lookup
- scapy: إنشاء وإرسال حزم ARP.
- netifaces: أتمتة اكتشاف الواجهة وعنوان IP
- mac-vendor-lookup: حل عناوين MAC إلى أسماء البائعين.
الخطوة 2: إجراء فحص ARP
ترسل دالة ()arp_scan طلبات ARP إلى جميع عناوين IP في الشبكة الفرعية وتحلل الاستجابات:
from scapy.all import ARP, Ether, srp
def arp_scan(ip_range, interface):
arp_request = ARP(pdst=ip_range)
broadcast = Ether(dst="ff:ff:ff:ff:ff:ff")
packet = broadcast/arp_request
answered, _ = srp(packet, iface=interface, timeout=2, verbose=False)
devices = []
for sent, received in answered:
devices.append({'ip': received.psrc, 'mac': received.hwsrc})
return devices
تعيد هذه الدالة قائمة من القواميس التي تحتوي على عناوين IP وMAC.
الخطوة 3: حل مشكلة بائعي MAC
تستعلم مكتبة mac-vendor-lookup عن نسخة محلية من قاعدة بيانات IEEE OUI لتحديد الشركات المصنعة للأجهزة:
from mac_vendor_lookup import MacLookup
def get_vendor(mac):
try:
return MacLookup().lookup(mac)
except:
return "Unknown"
للحصول على الدقة، قم بتحديث قائمة البائعين بشكل دوري باستخدام ()MacLookup().update_vendors.
دمج المكونات في نص برمجي كامل
حساب نطاق IP الديناميكي
تحويل عنوان IP الخاص بالبوابة وقناع الشبكة الفرعية إلى صيغة CIDR (على سبيل المثال، 192.168.1.0/24):
import ipaddress
def calculate_subnet(gateway_ip, netmask):
network = ipaddress.IPv4Network(f"{gateway_ip}/{netmask}", strict=False)
return str(network)
السكريبت الكامل
دمج جميع المكونات في نص واحد:
import netifaces
import ipaddress
from scapy.all import ARP, Ether, srp
from mac_vendor_lookup import MacLookup
def get_network_info():
gateways = netifaces.gateways()
default_gateway = gateways['default'][netifaces.AF_INET]
interface = default_gateway[^1]
gateway_ip = default_gateway[^0]
addresses = netifaces.ifaddresses(interface)[netifaces.AF_INET][^0]
netmask = addresses['netmask']
subnet = ipaddress.IPv4Network(f"{gateway_ip}/{netmask}", strict=False)
return interface, str(subnet)
def main():
interface, subnet = get_network_info()
print(f"Scanning {subnet} on interface {interface}...")
devices = arp_scan(subnet, interface)
print("\nConnected Devices:")
print("IP Address\t\tMAC Address\t\tVendor")
for device in devices:
vendor = get_vendor(device['mac'])
print(f"{device['ip']}\t\t{device['mac']}\t\t{vendor}")
if __name__ == "__main__":
main()
التحسين والميزات المتقدمة
المسح غير المتزامن
لتحسين الأداء على الشبكات الكبيرة، قم بتنفيذ المسح غير المتزامن باستخدام AsyncSniffer من scapy:
from scapy.all import AsyncSniffer
async def async_arp_scan(ip_range, interface):
sniffer = AsyncSniffer()
sniffer.start()
# Send ARP requests and analyze responses asynchronously
عمليات المسح المجدولة
استخدم مكتبة الجدول الزمني لتشغيل عمليات الفحص بشكل دوري:
import schedule
import time
schedule.every(5).minutes.do(main)
while True:
schedule.run_pending()
time.sleep(1)
يوفر هذا البرنامج النصي أداة أساسية لمراقبة الشبكة. بالنسبة لبيئات المؤسسات، يُنصح بالتكامل مع بروتوكول إدارة الشبكات البسيط (SNMP) للحصول على رؤى أعمق أو إضافة تنبيهات للأجهزة غير المصرح بها. تأكد دائمًا من الامتثال لسياسات الشبكة المحلية، حيث قد يؤدي فحص بروتوكول تحليل العناوين (ARP) إلى ظهور تنبيهات أمنية. قد تشمل التحسينات المستقبلية لوحات معلومات واجهة المستخدم الرسومية (GUI) أو التكامل مع أنظمة كشف التسلل.
من خلال الجمع بين معالجة الحزم منخفضة المستوى وقواعد بيانات البائعين، يتيح Python تحليل الشبكة المرن والقوي المصمم لتلبية الاحتياجات التشغيلية المحددة.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.