Zunächst mein Setup:
- ein Kabelmodem und eine Fritz!Box für den Internetzugang
- ein PC, der per Netzwerkkabel mit der Fritz Box verbunden ist
- mehrere WLAN-Geräte, auch mit der Fritz Box verbunden
Folgendes möchte ich erreichen: Ich möchte so etwas wie einen Netzwerk-Proxyserver auf einem separaten Rechner einrichten, der den GESAMTEN Datenverkehr zwischen allen Geräten in meinem Netzwerk und dem Internet abfängt und (möglicherweise) weiterleitet. Der Datenverkehr zwischen den Geräten in meinem Netzwerk ist mir egal. Ich möchte nicht auf Nachrichten über ein bestimmtes Protokoll/einen bestimmten Port/eine bestimmte IP-Adresse beschränkt sein. Mein Hauptziel ist es, etwas über Netzwerke/Protokolle usw. zu lernen und mehrere Anwendungen zu implementieren/auf diesem Proxyserver herumzuspielen. Beispiele könnten sein:
- Sammeln Sie Statistiken über alle IPs/Ports, über die eine laufende Kommunikation stattfand (leiten Sie also grundsätzlich den gesamten Datenverkehr weiter und führen Sie einige Zählungen durch).
- Blockieren Sie einen Teil des Datenverkehrs (z. B. verhindern Sie anhand der IP-Adresse, dass Kinder auf Dinge zugreifen, die sie nicht sehen sollten. Verhindern Sie, dass Software datenschutzrelevante Daten über mich sendet.)
- vor neuen Geräten in meinem Heimnetzwerk warnen (z. B. wenn jemand mein WLAN missbraucht)
- Nachrichten vor dem Weiterleiten ändern (z. B. eingehenden Webinhalten Text hinzufügen)
- eigene Nachrichten entweder an einen Server im Internet oder an eines der angeschlossenen Geräte senden (z. B. gesammelte Nutzungsstatistiken zur Anzeige in einer Weboberfläche)
- viel mehr ...
Vorausgesetzt, ich habe eine Unix (/Linux)-Maschine zur Verfügung:
- Netzwerkeinrichtung: Welche Netzwerktopologie wird benötigt? Wo in meinem Netzwerk muss ich den Proxy-Rechner platzieren?
- Einstellungen: Was muss ich am Proxy konfigurieren, um den gesamten ein- und ausgehenden Datenverkehr zu empfangen und weiterzuleiten? Ich möchte KEINE Einstellungen an den Host-Geräten ändern. Es sollte ausreichen, sie mit dem Netzwerk zu verbinden.
- Programmierbarkeit: Was muss ich zusätzlich einrichten, um mit Python Nachrichten/Pakete lesen/ändern/schreiben/senden/blockieren zu können?
- Einschränkungen: Würde eine solche Konfiguration meine Netzwerkgeschwindigkeit ernsthaft beeinträchtigen?
--- BEARBEITEN --- Ich habe einige Fortschritte gemacht und ein Python-Skript erstellt, das eingehende Verbindungen akzeptiert. Außerdem habe ich die WLAN-Verbindung eines anderen Computers so eingestellt, dass die erste als Gateway verwendet wird. Ich empfange jetzt erfolgreich Nachrichten, aber das Problem ist, dass ich keine Ahnung habe, wohin sie eigentlich gesendet werden sollen. Ich würde annehmen, dass ich die Socket-Konfiguration ändern und transparente Proxys verwenden muss, aber ich habe nicht viel darüber gefunden, wie das in Python tatsächlich geht. Außerdem läuft mein Skript derzeit auf einem Mac, daher sind möglicherweise nicht alle Optionen für Sockets verfügbar.
Nachfolgend mein aktueller Snippet:
import socket
def received_from(sock, timeout):
dt = ""
sock.settimeout(timeout)
try:
while True:
dt = sock.recv(4096)
if not dt:
break
dt = + dt
except:
pass
return dt
def hexdump(data, length=16):
filter = ''.join([(len(repr(chr(x))) == 3) and chr(x) or '.' for x in range(256)])
lines = []
digits = 4 if isinstance(data, str) else 2
for c in range(0, len(data), length):
chars = data[c:c+length]
hex = ' '.join(["%0*x" % (digits, (x)) for x in chars])
printable = ''.join(["%s" % (((x) <= 127 and filter[(x)]) or '.') for x in chars])
lines.append("%04x %-*s %s\n" % (c, length*3, hex, printable))
print(''.join(lines))
s = socket.socket()
print("Socket successfully created")
try:
port = 12222
s.bind(('', port))
print("socket bound to port {}".format(port))
s.listen(5)
print("socket listening")
print("proxy sock: {}".format(s.getsockname()))
while True:
try:
c, addr = s.accept()
print("got connection from {}".format(addr))
print("client peer: {}".format(c.getpeername()))
print("client sock: {}".format(c.getsockname()))
data = received_from(c, 3)
hexdump(data)
print()
c.send("Connection received. Thanks and bye!".encode('utf-8'))
c.close()
except Exception as e:
c.close()
raise e
except Exception as e:
s.close()
raise e
Antwort1
Hier sind ein paar Vorschläge:
1) Greifen Sie zunächst auf die Administratorseite Ihres Heim-Gateways (FritzBox) zu. Normalerweise erfolgt die Verbindung über den Browser mit Benutzername und Passwort zu 192.168.1.1. Überprüfen Sie die Einstellungen von WAN, LAN und WLAN und lesen Sie mehr darüber.
2) Installieren Sie Linux und Befehlszeilentools: tcpdump, netstat, nc, telnet
3) Haben Sie eine andere Maschine Windows / Linux mit Benutzeroberfläche, installieren Sie dort Wireshark
4) Versuchen Sie, einige einfachePython-Socket-Level-Programme(Python-Socket-Bibliotheken passen gut auf C-Socket-APIs)
5) Zeichnen Sie den Datenverkehr zwischen Programmen auf verschiedenen Computern mit tcpdump auf und untersuchen Sie Pakete mit Wireshark
6) Versuchen Sie, Ihrem LAN-Heimnetzwerk einen Proxyserver (dedizierte Maschine) hinzuzufügen.
7) Installieren Sie Programme wie Apache-Webserver, CuteFTP, SMPT Relay, MiniDLNA usw.
Sie können meineAbonnierenfür Linux zum Experimentieren mit netzwerkbezogenen Dingen
8) Versuchen Sie, eigene SSL-Zertifikate zu erstellen, um Verbindungen zwischen Computern in Ihrem Netzwerk zu sichern.
Antworten auf Ihre Fragen:
Netzwerkeinrichtung: Der Proxy wird wie jede andere Maschine im Netzwerk platziert. Aber alle Maschinen beziehen sich darauf (verwenden ihn als „Gateway“).
Einstellungen: Allen Maschinen muss per Konfigurationsparameter ein Proxy (Port, Adresse) mitgeteilt werden.
Programmierbarkeit: Nichts. Es funktioniert sofort.
Einschränkungen: Würde eine solche Konfiguration ernsthafte Auswirkungen auf meine Netzwerkgeschwindigkeit haben? Nein.