LAN-IP-Scanner
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.