Vorbereitung
Netcat
Wir werden eine echte NAT-Implementierung untersuchen, um zu verstehen, wie eine solche intern arbeitet. Dazu müseen wir kontrolliert Zustand in der NAT-Tabelle erzeugen und dazu brauchen wir ein Werkzeug, das es uns erlaubt TCP-Verbindungen und UDP Pakete zu erzeugen, bei denen wir die genutzten Ports einstellen können, denn NAT nutzt diese zum Multiplexen/Demultiplexen. Darüber hinaus brauchen wir natürlich auch einen Server, der diese Pakete und Verbindungsversuche annimmt. Für diese Aufgabe eignet sich Netcat hervorragend. Die man page von Netcat hat folgendes zu seinem Anwednungsbereich zu sagen:
The nc (or netcat) utility is used for just about anything under the sun involving TCP, UDP, or UNIX-domain sockets. It can open TCP connections, send UDP packets, listen on arbitrary TCP and UDP ports, do port scanning, and deal with both IPv4 and IPv6. Unlike telnet(1), nc scripts nicely, and separates error messages onto standard error instead of sending them to standard output, as telnet(1) does with some.
Für unsere Zwecke also das ideale Werkzeug. Schauen wir uns die für dieses Praktikum wichtigsten Kommandozeilenschalter an.
TCP-Client
Das Netcat-Tool heißt auf der Kommandozeile nc
. Als Client werden wir nur einige der verfügbaren Schalten benutzen. Der generelle Aufruf als TCP-Client sieht so aus:
nc [-p source_port] [-q seconds] [destination] [port]
Dabei ist:
[-p source_port]
- Der Quellport, der genutzt werden soll[-q seconds]
- Anzahl an Sekunden, die gewartet werden soll, bevornc
sich beendet (negativer Wert bedeutet nicht beenden!)[destination]
- Die IP-Adresse oder der Hostname, zum dem der Client sich verbinden soll[port]
- Die Zielportnummer
Beispiel:
echo “hello” | nc -p 3456 -q -1 10.0.0.1 1234
Im Beispiel wird der String “hello” über eine TCP-Verbinding an 10.0.0.1 Port 1234, Quell-Port 3456 gesendet. Die TCP-Verbindung bleibt danach offen (-q -1
).
TCP-Server
Einen Server mit Natcat aufzusetzen ist ebenso einfach. Der generelle Aufruf sieht dabei wie folgt aus:
nc -l -k [port]
Dabei ist:
-l
- Dasl
steht fürlisten
. Dieses Flag sagt Netcat, dass ein Server und kein Client erzeugt werden soll-k
- Diese Option instruiertnc
, dass der Server sich nicht nach der ersten Verbindung beendigen soll[port]
- Der lokale Port, auf dem der Server Verbindungen annehmen soll
Beispiel:
nc -k -l 1234
Hier wir ein TCP-Server gestartet, der beliebige Verbindungsanfragen auf Port 1234 annimmt.
UDP-Client
Bei UDP ist das Ganze noch ein wenig simpler. Ein Client wird einfach wie folgt gestartet:
nc [-u] [destination] [port]
-u
- UDP anstelle von TCP benutzen[destination]
- Die IP-Adresse oder der Hostname, zum dem UDP Pakete geschickt werden sollen[port]
- Die Zielportnummer
Beispiel:
echo “hello” | nc -u 10.0.0.1 1234
Hier wird ein UDP Datagram mit dem String “hello” als Inhalt an einen UDP-Server auf dem Host 10.0.0.1, Port 1234 geschickt.
UDP-Server
Der UDP-Server unterscheidet sich nur duch den -u
Schalter, um UDP anstelle von TCP zu nutzen. D.h. ein UDP-Server sieht wie folgt aus:
nc -l -u -k [port]
Dabei ist:
-u
- UDP anstelle von TCP benutzen-l
- Dasl
steht fürlisten
. Dieses Flag sagt Netcat, dass ein Server und kein Client erzeugt werden soll-k
- Diese Option instruiertnc
, dass der Server sich nicht nach dem ersten Paket beendigen soll[port]
- Der lokale Port, auf dem der Server Pakete annehmen soll
Beispiel:
nc -k -u -l 1234
Hier wird ein UDP-Server gestartet, der Pakete auf Port 1234 annimmt und beliebige Pakete annimmt ohne sich zu beenden.
NAT-Tabelle anzeigen
Zu guter Letzt brauchen wir noch ein Werkzeug, dass die NAT-Tabelle anzeigen kann und dieses Werzeug heisst conntrack
. Hier brauchen wir nur einen Schalter, und zwar -L
, mit dem die Tabelle angezeigt wird. conntrack
kann wesentlich mehr, aber für unsere Zwecke reicht das einfache Anzeigen der Tabelleneinträge.
Damit sind Sie für das Praktikum gerüstet.
Viel Erfolg!