ماسح IP الشبكة المحلية
ماسح عنوان IP للشبكة المحلية (LAN)
هذا البرنامج النصي بلغة بايثون يمسح شبكة محلية بحثًا عن عناوين IP نشطة. يستخدم الأمر ping
للتحقق مما إذا كان المضيف متاحًا، ويستخدم تعدد الخيوط لتسريع عملية المسح. يحدد إشارة منع التشغيل المتزامن (Semaphore) عدد الخيوط المتزامنة لتجنب إرهاق النظام. يأخذ البرنامج النصي عنوان الشبكة (مثل “192.168.1.0/24”) كمدخل ويطبع ما إذا كان كل عنوان IP في الشبكة يعمل أم لا.
يساعد هذا البرنامج النصي على تحديد الأجهزة على الشبكة، مثل جهاز توجيه شبكي من TP-LINK يعمل في وضع جسر سلكي، من خلال البحث عن عناوين IP النشطة.
import subprocess
import ipaddress
import threading
import os
import socket
import argparse
MAX_THREADS = 50 # الحد الأقصى لعدد الخيوط المستخدمة
def is_host_up(host, port=None):
"""
يتحقق مما إذا كان المضيف يعمل باستخدام ping أو telnet.
إذا تم تحديد port، فإنه يستخدم telnet للتحقق مما إذا كان المنفذ مفتوحًا.
وإلا، فإنه يستخدم ping.
يعيد True إذا كان المضيف يعمل، و False خلاف ذلك.
"""
if port:
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1)
result = sock.connect_ex((host, port))
if result == 0:
return True
else:
return False
except socket.error as e:
return False
finally:
sock.close()
else:
try:
# -c 1: إرسال حزمة واحدة فقط
# -W 1: الانتظار لمدة ثانية واحدة للحصول على استجابة
subprocess.check_output(["ping", "-c", "1", "-W", "1", host], timeout=1)
return True
except subprocess.CalledProcessError:
return False
except subprocess.TimeoutExpired:
return False
def scan_ip(ip_str, up_ips, port=None):
"""
يمسح عنوان IP واحدًا ويطبع حالته.
"""
if is_host_up(ip_str, port):
print(f"{ip_str} is up")
up_ips.append(ip_str)
else:
print(f"{ip_str} is down")
def scan_network(network, port=None):
"""
يمسح شبكة بحثًا عن المضيفين النشطين باستخدام الخيوط، مع تحديد عدد الخيوط المتزامنة.
"""
print(f"Scanning network: {network}")
threads = []
semaphore = threading.Semaphore(MAX_THREADS) # تحديد عدد الخيوط المتزامنة
up_ips = []
def scan_ip_with_semaphore(ip_str):
semaphore.acquire()
try:
scan_ip(ip_str, up_ips, port)
finally:
semaphore.release()
for ip in ipaddress.IPv4Network(network):
ip_str = str(ip)
thread = threading.Thread(target=scan_ip_with_semaphore, args=(ip_str,))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
return up_ips
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Scan a network for live hosts.")
parser.add_argument("network", nargs='?', default="192.168.1.0/24", help="The network to scan (e.g., 192.168.1.0/24)")
parser.add_argument("-p", "--port", type=int, help="The port to check (optional)")
args = parser.parse_args()
network_to_scan = args.network
port_to_scan = args.port
up_ips = scan_network(network_to_scan, port_to_scan)
print("\nLive IPs:")
for ip in up_ips:
print(ip)
تجاوز عناوين IP المحلية
يحدد البرنامج النصي عناوين IP النشطة. للتأكد من الاتصال الصحيح بالشبكة، تأكد من تكوين إعدادات الوكيل لتجاوز عناوين IP المحلية هذه.
192.168.0.0/16,10.0.0.0/8,172.16.0.0/12,127.0.0.1,localhost,*.local,timestamp.apple.com,sequoia.apple.com,seed-sequoia.siri.apple.com, 192.168.1.0/16
أقنعة الشبكة الفرعية
آلتي الثانية عادةً على 192.168.1.16.
لذلك يعمل باستخدام الأمر أدناه.
python scripts/ip_scan.py 192.168.1.0/27 -p 22
لأن 32 - 27 = 5، 2^5 = 32، لذلك سيحاول من 192.168.1.0
إلى 192.168.1.31
.
ولكنه لا يعمل عند استخدام 192.168.1.0/28
، لأن 2^4 = 16، لذلك سيحاول من 192.168.1.0
إلى 192.168.1.15
، وهو لا يغطي 192.168.1.16
.