Netzwerke_3

Computernetze: Internet - Einführung

mit Linux-Kommandozeilenwerkzeugen

Teil 3 Socket-basierte Kommunikation (TCP/UDP)

Socket-basierte Kommunikation

Sockets sind auf der Ebene der Transportschicht definiert, d.h. sie sind im TCP bzw. UDP-Protokoll beschrieben.

Ports

Da auf jedem Rechner mehrere Prozesse laufen können, müssen zu den Prozessen korrespondierende Netzwerkverbindungen zusätzlich zur IP-Adresse adressiert werden können. Jede TCP- und UDP-Verbindung der Transportschicht wird daher zusätzlich mit einer Portnummer versehen. Ein Port ist eine 16 Bitzahl, somit stehen 65.536 unterschiedliche Ports zur Verfügung.

Sockets

Sockets) dienen zur Kommunikation zwischen Prozessen (auch Rechnerübergreifend).

Ein Socket wird durch ein Triple adressiert (Protokoll ist entweder TCP oder UDP):

  • (Protokoll, lokale Adresse, lokaler Port).

Da zwei Rechner kommunizieren ergibt dies ein 5-Tupel , da das Protokoll identisch sein muss:

  • (Protokoll, lokale Adresse, lokaler Port, romote Adresse, remote Port)

Für gewisse Standard-Dienste der Anwendungsschicht sind TCP und UDP Portnummern (0-1023) reserviert, d.h. diese Nummern können nicht frei gewählt werden, z.B.: HTTP (TCP-80), SSH (TCP-22), HTTPS(TCP-443) (mehr siehe hier). Unter Linux kann nur der root-User (su) Dienste auf diesen Ports (0-1023) starten.

Diese Zuordnung ist in Linux in der Datei /etc/services konfiguriert:

In [9]:
cat /etc/services | grep http | grep tcp
http		80/tcp		www		# WorldWideWeb HTTP
https		443/tcp				# http protocol over TLS/SSL
http-alt	8080/tcp	webcache	# WWW caching service

netcat nc

Mit nc (netcat) lässt sich eine socketbasierte TCP oder UDP Kommunikation zum Datenaustausch realisieren. Auf Grund seiner Vielseitigkeit wird es auch als "Schweizer Taschenmesser für TCP/IP" bezeichnet. netcat kann sowohl im Client- als auch Server-Mode agieren.

In [8]:
whatis nc
nc (1)               - arbitrary TCP and UDP connections and listens

Beispiel: TCP-Connection zum Server christianherta.de auf Port 80 (Standardport für HTTP-Server). Die Nachricht, die gesendet wird, ist ein HTTP-Header (siehe Felder) eines GET-Request. Mit einem GET-Request wird eine Resource (wie eine Webseite) angefordert. Zurückgesendet wird eine HTTP-Response mit Header und Content.

In [9]:
echo "GET /index.html HTTP/1.1 
Accept: text/html 
Accept Language: en-US,en;q=0.9,de;q=0.8
Accept-Charset: utf-8
Accept-Language: de-DE
Host: christianherta.de
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
" | nc christianherta.de 80
HTTP/1.1 302 Found
Content-Type: text/html; charset=iso-8859-1
Content-Length: 218
Connection: keep-alive
Keep-Alive: timeout=15
Date: Fri, 03 Dec 2021 11:18:11 GMT
Server: Apache
Location: http://christianherta.de/index.php

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://christianherta.de/index.php">here</a>.</p>
</body></html>

Aufgabe

Benutzen Sie das Programm netcat nc, um eine socketbasierte Server- und Client-Kommunikation aufbauen. Informieren Sie sich hierzu über die Funktionalität von nc (Recherche). Lesen Sie auch die man-Page (man nc), insbesondere Punkt CLIENT/SERVER MODEL und gehen Sie vor, wie dort beschrieben. Öffnen Sie hierzu zwei Terminal(emulatoren) für nc.

Hinweis: Beide Server und Client lesen und schreiben via stdin bzw. stdout.

Socket-Monitoring mit ss

Mit dem Werkzeug sslassen sich die Sockets untersuchen. ss entspricht dem alten net-tools-Package netstat:

ss  is used to dump socket statistics. It allows showing information similar to netstat.  It can display more TCP and state informations than other tools.

ss -a

-a, --all
          Display both listening and non-listening (for TCP this means established connections) sockets.

Aufgabe

Nutzen Sie ss, um den Port des Client zu finden der obigen Server-Client Verbindung (vorherige Aufgabe) per netcat. Nutzen Sie das Werkzeug ss in einer weiteren Konsole. Hiermit können Sie sehen, ob die entsprechenden Prozesse sich mit den Port verbunden haben etc. Filtern Sie die lange Ausgabe von ss. Sie sollten wissen wie das geht. Informieren Sie sich zudem weiter über ss, z.B. hier https://www.linux.com/topic/networking/introduction-ss-command/.

Unix-Sockets

Nebenbemerkung: Neben den Netzwerk-Sockets gibt es unter Linux auch noch Unix-Sockets zur Interprozesskommunikation, siehe man unix.

Bashs /dev/tcp/host/port Funktionalität

Wenn ein Kommando auf /dev/tcp/host/port ausgeführt wird, öffnet die Bash eine entsprechende TCP/IP Verbindung, siehe https://tldp.org/LDP/abs/html/devref1.html.

>From the bash reference: /dev/tcp/host/port If host is a valid hostname or Internet address, and port is an integer port number or service name, Bash attempts to open a TCP connection to the corresponding socket.

Beispiel Anfrage auf Port 13 (Daytime) von time.nist.gov um die Uhrzeit zu erfragen:

In [3]:
cat </dev/tcp/time.nist.gov/13
59551 21-12-03 11:18:59 00 0 0   0.0 UTC(NIST) * 

Ein HTTP-request:

In [4]:
# see https://www.linuxjournal.com/content/more-using-bashs-built-devtcp-file-tcpip
TCP_HOST=christianherta.de       
TCP_PORT=80 # Port 80 ist Standardport für http Webseitenauslieferung
exec 5<>/dev/tcp/${TCP_HOST}/${TCP_PORT} # fd 5 für /dev/tcp...

# Schreiben in den Filedeskriptor sendet die Daten per TCP/IP 
echo -e "GET /index.html HTTP/1.1 \nhost: christianherta.de\n" >&5

# Ausgabe der empfangenen Daten mittels Lesen aus dem Filedeskriptor 
cat <&5
HTTP/1.1 302 Found
Content-Type: text/html; charset=iso-8859-1
Content-Length: 218
Connection: keep-alive
Keep-Alive: timeout=15
Date: Fri, 03 Dec 2021 11:18:59 GMT
Server: Apache
Location: http://christianherta.de/index.php

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://christianherta.de/index.php">here</a>.</p>
</body></html>

Hier wird exec verwendet:

exec — execute commands and open, close, or copy file descriptors

exec 5<>/dev/TCP/..: Öffnet Dateideskriptor 5 zum Lesen und Schreiben auf dem entsprechenden TCP/IP Socket. Hier wird exec kein Kommando übergeben, d.h. die Dateiweiterleitungen über den Filedeskriptor können in der laufenden Shell verwendet werden.

If command is not specified, any redirections take effect in the current shell, and the return status is 0.

Nebenbemerkung: exec ersetzt bei Übergabe eines Kommandos den laufenden Prozess mit den neuen Kommando-Prozess.

Anwendungsbeispiel: Port Scanner

In [5]:
# Port Scanner : which ports are open on a host
# see Book "Cybersecurity Ops with bash"
#
function scan(){
  host=$1
  from=$2
  to=$3
  printf '%s' "$host" 
  for ((port=from;port<to;port++)) # in arithmetischer Umgebung kein $
  do 
    # don't response trick from https://catonmat.net/tcp-port-scanner-in-bash
    timeout 1s bash -c "echo >/dev/null 2>&1 < /dev/tcp/${host}/${port}" 
    if (($?==0)) ; then 
      printf ' %d' "${port}"
    fi
  done
  echo
}
In [6]:
scan christianherta.de 20 24
scan christianherta.de 75 85
christianherta.de
christianherta.de 80 81

Weitere Netzwerk-Tools

  • telnet: Auf entferneten Rechnern einloggen - Die Kommunikation ist aber unverschlüsselt. Daher ist unbedingt ssh (wird noch behandelt) vorzuziehen.
  • ftp: Filetransfer zwischen Rechnern - Die Kommunikation ist aber unverschlüsselt. Daher ist unbedingt sftp (wird noch behandelt) vorzuziehen.

telnet kann man aber auch für TCP-IP Socket Kommunikation verwenden:

In [7]:
# HTTP-Request mit telnet
# https://stackoverflow.com/questions/7013137/automating-telnet-session-using-bash-scripts/7021653#7021653
{ echo -e "GET /index.html HTTP/1.1 \nhost: christianherta.de\n"; sleep 1; } | telnet christianherta.de 80
Trying 217.160.0.91...
Connected to christianherta.de.
Escape character is '^]'.
HTTP/1.1 302 Found
Content-Type: text/html; charset=iso-8859-1
Content-Length: 218
Connection: keep-alive
Keep-Alive: timeout=15
Date: Fri, 03 Dec 2021 11:19:26 GMT
Server: Apache
Location: http://christianherta.de/index.php

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://christianherta.de/index.php">here</a>.</p>
</body></html>
Connection closed by foreign host.

Aufgabe (optional): NFS und NIS

Lesen Sie die kurze Beschreibung zu NFS und NIS: https://www.linux-praxis.de/nfs-und-nis

Weitere Netzwerk- und Securitytools

Hinweis: Unter SecTools.Org: Top 125 Network Security Tools finden Sie eine Liste mit 125 weiteren Netzwerk- und Security-Werkzeugen. Erwähnenswert sind hier Sniffer-Programme, tcpdump bzw. wireshark, mit denen sich Netzwerkverkehr überwachen lässt. Beachten Sie aber, dass Sie aus juristischen Gründen keine fremden Daten mitlesen dürfen. Beachten Sie zudem, dass das Starten mit root-Rechten aus sicherheitsgründen problematisch ist, siehe z.B. https://blog.packet-foo.com/2018/09/attacking-wireshark/.

Umfangreiches Standardlehrbuch zu Computernetzwerken:

  • Andrew S. Tanenbaum / Prof. David J. Wetherall: Computernetzwerke, 5., aktualisierte Auflage, Pearson Studium 2012