LAN-IP-Scanner

Home PDF Audio

LAN IP Scanner

Dieses Python-Skript scannt ein lokales Netzwerk nach aktiven IP-Adressen. Es verwendet den Befehl ping, um zu überprüfen, ob ein Host erreichbar ist, und setzt Multithreading ein, um den Scan-Vorgang zu beschleunigen. Ein Semaphore begrenzt die Anzahl gleichzeitiger Threads, um eine Überlastung des Systems zu vermeiden. Das Skript nimmt eine Netzwerkadresse (z. B. “192.168.1.0/24”) als Eingabe entgegen und gibt aus, ob jede IP-Adresse im Netzwerk aktiv oder inaktiv ist.

Dieses Skript hilft, Geräte im Netzwerk zu identifizieren, wie z. B. einen TP-LINK Mesh-Router, der im verdrahteten Bridge-Modus arbeitet, indem es nach aktiven IP-Adressen sucht.

import subprocess
import ipaddress
import threading
import os
import socket
import argparse

MAX_THREADS = 50  # Maximale Anzahl zu verwendender Threads

def is_host_up(host, port=None):
    """
    Überprüft, ob ein Host mit ping oder telnet aktiv ist.
    Wenn ein Port angegeben ist, wird telnet verwendet, um zu überprüfen, ob der Port geöffnet ist.
    Andernfalls wird ping verwendet.
    Gibt True zurück, wenn der Host aktiv ist, andernfalls 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: Nur 1 Paket senden
            # -W 1: 1 Sekunde auf eine Antwort warten
            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):
    """
    Scannt eine einzelne IP-Adresse und gibt ihren Status aus.
    """
    if is_host_up(ip_str, port):
        print(f"{ip_str} ist aktiv")
        up_ips.append(ip_str)
    else:
        print(f"{ip_str} ist inaktiv")

def scan_network(network, port=None):
    """
    Scannt ein Netzwerk nach aktiven Hosts unter Verwendung von Threads und begrenzt die Anzahl gleichzeitiger Threads.
    """
    print(f"Scanne Netzwerk: {network}")
    threads = []
    semaphore = threading.Semaphore(MAX_THREADS)  # Begrenzung der Anzahl gleichzeitiger 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="Scanne ein Netzwerk nach aktiven Hosts.")
    parser.add_argument("network", nargs='?', default="192.168.1.0/24", help="Das zu scannende Netzwerk (z. B. 192.168.1.0/24)")
    parser.add_argument("-p", "--port", type=int, help="Der zu überprüfende Port (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("\nAktive IPs:")
    for ip in up_ips:
        print(ip)


Umgehung lokaler IPs

Das Skript identifiziert aktive IP-Adressen. Um eine korrekte Netzwerkkommunikation sicherzustellen, überprüfen Sie, ob die Proxy-Einstellungen so konfiguriert sind, dass diese lokalen IPs umgangen werden.

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

Subnetzmasken

Meine zweite Maschine befindet sich normalerweise unter 192.168.1.16.

Daher funktioniert es mit dem folgenden Befehl.

python scripts/ip_scan.py 192.168.1.0/27 -p 22

weil 32 - 27 = 5, 2^5 = 32, also werden 192.168.1.0 bis 192.168.1.31 getestet.

Es funktioniert jedoch nicht mit 192.168.1.0/28, da 2^4 = 16, also werden 192.168.1.0 bis 192.168.1.15 getestet, was 192.168.1.16 nicht abdeckt.


Back 2025.02.22 Donate