Einführung
Python bietet leistungsstarke Möglichkeiten zur Arbeit mit Netzwerkschnittstellen und ermöglicht es Entwicklern, Netzwerk-Informationen programmatisch abzurufen und Netzwerkeinstellungen zu konfigurieren. Diese praktische Fähigkeit ist wertvoll für Netzwerkadministratoren, Systemingenieure und Entwickler, die an netzwerkbezogenen Anwendungen arbeiten.
In diesem Lab lernen Sie, wie Sie Python verwenden, um Netzwerkschnittstellen auf einem Linux-System zu inspizieren und zu verwalten. Sie beginnen mit der grundlegenden Identifizierung von Schnittstellen, gehen dann zur Abfrage detaillierter Netzwerkinformationen über und beenden das Lab mit der Überwachung des Netzwerkverkehrs. Am Ende dieses Labs verfügen Sie über praktische Erfahrung mit Pythons Netzwerkbibliotheken und können diese Fähigkeiten auf reale Netzwerkaufgaben anwenden.
Installieren der benötigten Python-Pakete
Bevor wir mit Netzwerkschnittstellen in Python arbeiten können, müssen wir die erforderlichen Pakete installieren. Die beiden wichtigsten Pakete, die wir verwenden werden, sind:
netifaces: Eine plattformübergreifende Bibliothek zum Abrufen von Netzwerkschnittstelleninformationenpsutil: Eine Bibliothek zum Abrufen von Systeminformationen, einschließlich Netzwerkstatistiken
Beginnen wir mit der Installation dieser Pakete mit pip.
Installieren der Pakete
Öffnen Sie ein Terminal und führen Sie den folgenden Befehl aus, um die erforderlichen Pakete zu installieren:
pip install netifaces psutil
Sie sollten eine Ausgabe sehen, die anzeigt, dass die Pakete heruntergeladen und installiert werden. Warten Sie, bis die Installation abgeschlossen ist, bevor Sie fortfahren.
Überprüfen der Installation
Überprüfen wir, ob die Pakete korrekt installiert wurden, indem wir ein einfaches Python-Skript erstellen. Erstellen Sie im VSCode-Editor eine neue Datei namens check_packages.py:
- Klicken Sie in der linken Seitenleiste auf das Symbol "Explorer" (oder drücken Sie Strg+E)
- Klicken Sie auf die Schaltfläche "Neue Datei"
- Benennen Sie die Datei
check_packages.py - Fügen Sie der Datei den folgenden Code hinzu:
try:
import netifaces
import psutil
print("Both packages installed successfully!")
print(f"netifaces version: {netifaces.__version__}")
print(f"psutil version: {psutil.__version__}")
except ImportError as e:
print(f"Error importing packages: {e}")
Speichern Sie die Datei, indem Sie Strg+S drücken oder im Menü "Datei > Speichern" auswählen.
Führen Sie nun das Skript aus, indem Sie ein Terminal öffnen (falls noch nicht geöffnet) und ausführen:
python3 check_packages.py
Sie sollten eine ähnliche Ausgabe sehen wie:
Both packages installed successfully!
netifaces version: 0.11.0
psutil version: 5.9.0
Die genauen Versionsnummern können abweichen, aber solange Sie die Meldung "installed successfully" sehen, können Sie mit dem nächsten Schritt fortfahren.
Auflisten von Netzwerkschnittstellen
Nachdem wir die notwendigen Pakete installiert haben, wollen wir uns nun mit den Netzwerkschnittstellen beschäftigen. Der erste Schritt ist die Identifizierung aller verfügbaren Netzwerkschnittstellen auf Ihrem System.
Erstellen eines Skripts zum Auflisten von Netzwerkschnittstellen
Erstellen Sie im VSCode-Editor eine neue Datei namens list_interfaces.py:
- Klicken Sie auf das Symbol "Explorer" in der linken Seitenleiste, falls es noch nicht geöffnet ist
- Klicken Sie auf die Schaltfläche "Neue Datei"
- Benennen Sie die Datei
list_interfaces.py - Fügen Sie den folgenden Code hinzu:
import netifaces
def list_network_interfaces():
"""List all network interfaces available on the system."""
interfaces = netifaces.interfaces()
print("Available network interfaces:")
for index, interface in enumerate(interfaces, 1):
print(f"{index}. {interface}")
if __name__ == "__main__":
list_network_interfaces()
Speichern Sie die Datei, indem Sie Strg+S drücken.
Ausführen des Skripts
Führen wir nun das Skript aus, um die Liste der Netzwerkschnittstellen auf Ihrem System anzuzeigen:
python3 list_interfaces.py
Sie sollten eine ähnliche Ausgabe sehen wie:
Available network interfaces:
1. lo
2. eth0
3. docker0
Die genaue Liste hängt von Ihrer Systemkonfiguration ab. Lassen Sie uns verstehen, was diese Schnittstellen typischerweise darstellen:
lo: Die Loopback-Schnittstelle (localhost)eth0: Die primäre Ethernet-Schnittstellewlan0: Die primäre drahtlose Schnittstelle (falls verfügbar)docker0: Die Docker-Bridge-Netzwerkschnittstelle (falls Docker installiert ist)
Verstehen der Netzwerkschnittstellennamen
Netzwerkschnittstellennamen können je nach Betriebssystem und Konfiguration variieren:
- Auf traditionellen Linux-Systemen werden Schnittstellen
eth0,eth1usw. für Ethernet benannt - Auf neueren Systemen, die vorhersagbare Netzwerkschnittstellennamen verwenden, sehen Sie möglicherweise Namen wie
enp0s3oderens33 - Virtuelle Schnittstellen können Namen wie
veth...oderbr0für Bridges haben
Ändern wir unser Skript, um mehr Details zu jeder Schnittstelle bereitzustellen. Aktualisieren Sie die Datei list_interfaces.py mit dem folgenden Code:
import netifaces
def list_network_interfaces():
"""List all network interfaces available on the system with details."""
interfaces = netifaces.interfaces()
print("Available network interfaces:")
for index, interface in enumerate(interfaces, 1):
print(f"{index}. {interface}")
## Try to get addresses for this interface
try:
if netifaces.AF_INET in netifaces.ifaddresses(interface):
ip_info = netifaces.ifaddresses(interface)[netifaces.AF_INET][0]
print(f" IPv4 Address: {ip_info.get('addr', 'None')}")
except ValueError:
print(" No IPv4 address assigned")
if __name__ == "__main__":
list_network_interfaces()
Speichern Sie die Datei und führen Sie sie erneut aus:
python3 list_interfaces.py
Nun sollten Sie eine detailliertere Ausgabe sehen, die die IPv4-Adresse für jede Schnittstelle enthält:
Available network interfaces:
1. lo
IPv4 Address: 127.0.0.1
2. eth0
IPv4 Address: 172.17.0.2
3. docker0
IPv4 Address: 172.17.0.1
Dies gibt uns ein besseres Verständnis der auf dem System verfügbaren Netzwerkschnittstellen und ihrer aktuellen IP-Adressen.
Abrufen detaillierter Netzwerkschnittstelleninformationen
Nachdem wir die verfügbaren Netzwerkschnittstellen auflisten können, erstellen wir nun ein umfassenderes Skript, um detaillierte Informationen über eine bestimmte Netzwerkschnittstelle abzurufen.
Erstellen eines Skripts für Netzwerkschnittstellendetails
Erstellen Sie im VSCode-Editor eine neue Datei namens interface_details.py:
- Klicken Sie im Explorer-Bereich auf die Schaltfläche "Neue Datei"
- Benennen Sie die Datei
interface_details.py - Fügen Sie den folgenden Code hinzu:
import netifaces
import sys
def get_interface_details(interface_name):
"""
Retrieve detailed information about a specific network interface.
Args:
interface_name (str): The name of the network interface
Returns:
None: Prints interface details to console
"""
## Check if the interface exists
interfaces = netifaces.interfaces()
if interface_name not in interfaces:
print(f"Error: Interface '{interface_name}' does not exist.")
print(f"Available interfaces: {', '.join(interfaces)}")
return
print(f"\nDetails for interface '{interface_name}':")
print("-" * 50)
## Get addresses for all protocol families
try:
addresses = netifaces.ifaddresses(interface_name)
## IPv4 addresses (AF_INET)
if netifaces.AF_INET in addresses:
ipv4_info = addresses[netifaces.AF_INET][0]
print("IPv4 Information:")
print(f" Address: {ipv4_info.get('addr', 'Not available')}")
print(f" Netmask: {ipv4_info.get('netmask', 'Not available')}")
print(f" Broadcast: {ipv4_info.get('broadcast', 'Not available')}")
else:
print("IPv4 Information: Not available")
## IPv6 addresses (AF_INET6)
if netifaces.AF_INET6 in addresses:
ipv6_info = addresses[netifaces.AF_INET6][0]
print("\nIPv6 Information:")
print(f" Address: {ipv6_info.get('addr', 'Not available')}")
print(f" Netmask: {ipv6_info.get('netmask', 'Not available')}")
print(f" Scope: {ipv6_info.get('scope', 'Not available')}")
else:
print("\nIPv6 Information: Not available")
## MAC address (AF_LINK)
if netifaces.AF_LINK in addresses:
link_info = addresses[netifaces.AF_LINK][0]
print("\nMAC Address Information:")
print(f" Address: {link_info.get('addr', 'Not available')}")
print(f" Broadcast: {link_info.get('broadcast', 'Not available')}")
else:
print("\nMAC Address Information: Not available")
## Gateway information
gateways = netifaces.gateways()
print("\nGateway Information:")
if 'default' in gateways and netifaces.AF_INET in gateways['default']:
gw_addr, gw_interface = gateways['default'][netifaces.AF_INET]
if gw_interface == interface_name:
print(f" Default Gateway: {gw_addr}")
else:
print(" No default gateway for this interface")
else:
print(" No default gateway information available")
except Exception as e:
print(f"Error retrieving interface details: {e}")
if __name__ == "__main__":
## If an interface name is provided as a command-line argument, use it
## Otherwise, use the first interface from the list (excluding 'lo')
if len(sys.argv) > 1:
interface_name = sys.argv[1]
else:
interfaces = [i for i in netifaces.interfaces() if i != 'lo']
if interfaces:
interface_name = interfaces[0]
print(f"No interface specified, using {interface_name}")
else:
print("No network interfaces available")
sys.exit(1)
get_interface_details(interface_name)
Speichern Sie die Datei, indem Sie Strg+S drücken.
Ausführen des Skripts
Führen wir nun das Skript aus, um detaillierte Informationen über eine bestimmte Netzwerkschnittstelle anzuzeigen:
python3 interface_details.py eth0
Ersetzen Sie eth0 bei Bedarf durch eine der Schnittstellen, die Sie im vorherigen Schritt gesehen haben.
Sie sollten eine ähnliche Ausgabe sehen wie:
Details for interface 'eth0':
--------------------------------------------------
IPv4 Information:
Address: 172.17.0.2
Netmask: 255.255.0.0
Broadcast: 172.17.255.255
IPv6 Information: Not available
MAC Address Information:
Address: 02:42:ac:11:00:02
Broadcast: ff:ff:ff:ff:ff:ff
Gateway Information:
Default Gateway: 172.17.0.1
Sie können das Skript auch ausführen, ohne einen Schnittstellennamen anzugeben, und es wählt automatisch die erste Nicht-Loopback-Schnittstelle aus:
python3 interface_details.py
Dieses Skript bietet eine umfassende Ansicht der Konfiguration der Netzwerkschnittstelle, einschließlich:
- IPv4-Adresse, Netzmaske und Broadcast-Adresse
- IPv6-Adresse (falls verfügbar)
- MAC-Adresse
- Informationen zum Standard-Gateway
Das Verständnis dieser detaillierten Informationen ist für die Netzwerkfehlerbehebung und -konfiguration unerlässlich.
Untersuchen der netifaces-Modulkonstanten
Das Modul netifaces verwendet Konstanten, um verschiedene Adressfamilien darzustellen. Erstellen wir ein kurzes Skript, um diese Konstanten zu verstehen. Erstellen Sie eine neue Datei namens netifaces_constants.py:
import netifaces
## Print all address family constants
print("Address Family Constants in netifaces module:")
print(f"AF_INET (IPv4): {netifaces.AF_INET}")
print(f"AF_INET6 (IPv6): {netifaces.AF_INET6}")
print(f"AF_LINK (MAC/Hardware): {netifaces.AF_LINK}")
## Additional constants that might be available
for name in dir(netifaces):
if name.startswith('AF_'):
print(f"{name}: {getattr(netifaces, name)}")
Speichern und führen Sie dieses Skript aus:
python3 netifaces_constants.py
Sie sollten eine Ausgabe wie folgt sehen:
Address Family Constants in netifaces module:
AF_INET (IPv4): 2
AF_INET6 (IPv6): 10
AF_LINK (MAC/Hardware): 17
AF_APPLETALK: 5
AF_INET: 2
AF_INET6: 10
AF_IPX: 4
AF_LINK: 17
AF_UNIX: 1
Diese Konstanten werden im Modul netifaces verwendet, um verschiedene Arten von Netzwerkadressen zu identifizieren. Das Verständnis dieser Konstanten ist hilfreich, wenn Sie mit den Funktionen des Moduls arbeiten.
Überwachen des Netzwerk-Interface-Traffics
Nachdem wir verstanden haben, wie man Netzwerkschnittstelleninformationen abruft, gehen wir einen Schritt weiter und erstellen ein Skript zur Echtzeitüberwachung des Netzwerk-Traffics. Dies ermöglicht es uns zu sehen, wie viele Daten über eine bestimmte Schnittstelle gesendet und empfangen werden.
Erstellen eines Skripts zur Netzwerk-Traffic-Überwachung
Erstellen Sie im VSCode-Editor eine neue Datei namens monitor_traffic.py:
- Klicken Sie im Explorer-Bereich auf die Schaltfläche "Neue Datei"
- Benennen Sie die Datei
monitor_traffic.py - Fügen Sie den folgenden Code hinzu:
import psutil
import time
import sys
import netifaces
def bytes_to_readable(bytes_count):
"""Convert bytes to a human-readable format (KB, MB, GB)"""
units = ['B', 'KB', 'MB', 'GB', 'TB']
unit_index = 0
converted_value = float(bytes_count)
while converted_value >= 1024 and unit_index < len(units) - 1:
converted_value /= 1024
unit_index += 1
return f"{converted_value:.2f} {units[unit_index]}"
def monitor_network_traffic(interface_name, interval=1, iterations=10):
"""
Monitor network traffic on a specific interface for a given number of iterations.
Args:
interface_name (str): Name of the network interface to monitor
interval (int): Time interval between measurements in seconds
iterations (int): Number of measurements to take
"""
## Verify interface exists
if interface_name not in netifaces.interfaces():
print(f"Error: Interface '{interface_name}' does not exist.")
print(f"Available interfaces: {', '.join(netifaces.interfaces())}")
return
print(f"Monitoring network traffic on {interface_name} (Ctrl+C to stop)")
print("-" * 80)
print(f"{'Time':<12} {'Bytes Sent':<15} {'Bytes Received':<15} {'Packets Sent':<15} {'Packets Received':<15}")
print("-" * 80)
try:
## Get initial stats
net_io_counters = psutil.net_io_counters(pernic=True)
if interface_name not in net_io_counters:
print(f"Error: Cannot get stats for interface '{interface_name}'")
return
prev_stats = net_io_counters[interface_name]
prev_bytes_sent = prev_stats.bytes_sent
prev_bytes_recv = prev_stats.bytes_recv
prev_packets_sent = prev_stats.packets_sent
prev_packets_recv = prev_stats.packets_recv
## Monitor for the specified number of iterations
for i in range(iterations):
## Wait for the specified interval
time.sleep(interval)
## Get new stats
net_io_counters = psutil.net_io_counters(pernic=True)
new_stats = net_io_counters[interface_name]
## Calculate differences
bytes_sent_diff = new_stats.bytes_sent - prev_bytes_sent
bytes_recv_diff = new_stats.bytes_recv - prev_bytes_recv
packets_sent_diff = new_stats.packets_sent - prev_packets_sent
packets_recv_diff = new_stats.packets_recv - prev_packets_recv
## Update previous values
prev_bytes_sent = new_stats.bytes_sent
prev_bytes_recv = new_stats.bytes_recv
prev_packets_sent = new_stats.packets_sent
prev_packets_recv = new_stats.packets_recv
## Print the current stats
current_time = time.strftime("%H:%M:%S")
print(f"{current_time:<12} {bytes_to_readable(bytes_sent_diff):<15} "
f"{bytes_to_readable(bytes_recv_diff):<15} {packets_sent_diff:<15} "
f"{packets_recv_diff:<15}")
except KeyboardInterrupt:
print("\nMonitoring stopped by user")
except Exception as e:
print(f"Error during monitoring: {e}")
print("\nTraffic summary for this session:")
print(f"Total monitored time: {iterations * interval} seconds")
if __name__ == "__main__":
## Get the interface name from command line arguments or use a default
if len(sys.argv) > 1:
interface_name = sys.argv[1]
else:
## Try to find a non-loopback interface
interfaces = [i for i in netifaces.interfaces() if i != 'lo']
if interfaces:
interface_name = interfaces[0]
print(f"No interface specified, using {interface_name}")
else:
print("No network interfaces available")
sys.exit(1)
## Get number of iterations from command line (default: 10)
iterations = 10
if len(sys.argv) > 2:
try:
iterations = int(sys.argv[2])
except ValueError:
print(f"Invalid iterations value: {sys.argv[2]}. Using default: 10")
## Monitor the network traffic
monitor_network_traffic(interface_name, iterations=iterations)
Speichern Sie die Datei, indem Sie Strg+S drücken.
Ausführen des Traffic-Überwachungsskripts
Führen wir nun das Skript aus, um den Netzwerk-Traffic auf einer bestimmten Schnittstelle zu überwachen:
python3 monitor_traffic.py eth0
Ersetzen Sie eth0 bei Bedarf durch den entsprechenden Schnittstellennamen von Ihrem System.
Das Skript zeigt eine Tabelle an, die die Menge der über die Netzwerkschnittstelle gesendeten und empfangenen Daten anzeigt und sich einmal pro Sekunde für 10 Iterationen aktualisiert:
Monitoring network traffic on eth0 (Ctrl+C to stop)
--------------------------------------------------------------------------------
Time Bytes Sent Bytes Received Packets Sent Packets Received
--------------------------------------------------------------------------------
14:25:30 0.00 B 156.00 B 0 2
14:25:31 0.00 B 0.00 B 0 0
14:25:32 0.00 B 0.00 B 0 0
14:25:33 456.00 B 1.24 KB 3 5
14:25:34 0.00 B 0.00 B 0 0
14:25:35 0.00 B 0.00 B 0 0
14:25:36 66.00 B 102.00 B 1 1
14:25:37 0.00 B 0.00 B 0 0
14:25:38 0.00 B 0.00 B 0 0
14:25:39 0.00 B 0.00 B 0 0
Traffic summary for this session:
Total monitored time: 10 seconds
Sie können die Anzahl der Iterationen auch als zweites Befehlszeilenargument angeben:
python3 monitor_traffic.py eth0 5
Dadurch würde der Traffic für 5 Iterationen anstelle der Standardeinstellung von 10 überwacht.
Generieren von Netzwerk-Traffic
Um das Überwachungsskript in Aktion mit tatsächlichem Traffic zu sehen, können wir ein zweites Terminal öffnen und etwas Netzwerk-Traffic generieren. Erstellen wir ein einfaches Skript, um dies zu tun:
Erstellen Sie eine neue Datei namens generate_traffic.py:
import requests
import time
import sys
def generate_traffic(iterations=5, delay=1):
"""Generate some network traffic by making HTTP requests"""
print(f"Generating network traffic over {iterations} iterations...")
for i in range(iterations):
try:
## Make a GET request to a public API
response = requests.get("https://httpbin.org/get")
print(f"Request {i+1}/{iterations}: Status {response.status_code}, "
f"Size {len(response.content)} bytes")
## Wait before the next request
if i < iterations - 1:
time.sleep(delay)
except Exception as e:
print(f"Error making request: {e}")
print("Traffic generation complete")
if __name__ == "__main__":
## Get number of iterations from command line (default: 5)
iterations = 5
if len(sys.argv) > 1:
try:
iterations = int(sys.argv[1])
except ValueError:
print(f"Invalid iterations value: {sys.argv[1]}. Using default: 5")
generate_traffic(iterations)
Sie müssen zuerst die requests-Bibliothek installieren:
pip install requests
Führen Sie nun das Überwachungsskript in einem Terminal aus:
python3 monitor_traffic.py eth0 15
Und in einem separaten Terminal führen Sie das Traffic-Generierungsskript aus:
python3 generate_traffic.py
Sie sollten jetzt die Netzwerkaktivität sehen, die vom Überwachungsskript erfasst wird, während das Traffic-Generierungsskript HTTP-Anfragen stellt.
Diese Übung zeigt, wie Sie Python verwenden können, um die Aktivität der Netzwerkschnittstelle in Echtzeit zu überwachen, was nützlich ist, um Netzwerkprobleme zu diagnostizieren, die Bandbreitennutzung zu überwachen und Netzwerk-Traffic-Muster zu verstehen.
Zusammenfassung
In diesem Lab haben Sie praktische Erfahrungen mit den Netzwerk-Interface-Management-Fähigkeiten von Python gesammelt. Folgendes haben Sie erreicht:
Einrichten der Umgebung: Sie haben die notwendigen Python-Pakete (
netifacesundpsutil) für die Arbeit mit Netzwerkschnittstellen installiert und konfiguriert.Auflisten von Netzwerkschnittstellen: Sie haben ein Skript erstellt, um alle verfügbaren Netzwerkschnittstellen auf Ihrem System zu identifizieren und grundlegende Informationen darüber anzuzeigen.
Abrufen detaillierter Schnittstelleninformationen: Sie haben ein umfassendes Skript geschrieben, um detaillierte Konfigurationsinformationen von Netzwerkschnittstellen zu extrahieren, einschließlich IP-Adressen, MAC-Adressen und Gateway-Informationen.
Überwachen des Netzwerk-Traffics: Sie haben ein Echtzeit-Netzwerk-Traffic-Überwachungstool implementiert, das die über eine bestimmte Schnittstelle gesendeten und empfangenen Daten verfolgt.
Diese Fähigkeiten bilden die Grundlage für fortgeschrittenere Netzwerkverwaltungsaufgaben in Python, wie z. B.:
- Automatisieren von Netzwerk-Konfigurationsänderungen
- Erstellen von Netzwerküberwachungs-Dashboards
- Erstellen von Netzwerkdiagnosetools
- Entwickeln von Netzwerksicherheitsanwendungen
Indem Sie verstehen, wie Sie programmgesteuert mit Netzwerkschnittstellen interagieren, haben Sie jetzt die Möglichkeit, benutzerdefinierte Netzwerktools zu erstellen, die auf Ihre spezifischen Anforderungen zugeschnitten sind. Dieses Wissen ist besonders wertvoll für Systemadministratoren, Netzwerktechniker und Entwickler, die an vernetzten Anwendungen arbeiten.



