ماسح IP الشبكة المحلية

Home PDF Audio

ماسح عنوان 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.


Back 2025.02.22 Donate