Sockets sind auf der Ebene der Transportschicht definiert, d.h. sie sind im TCP bzw. UDP-Protokoll beschrieben.
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) dienen zur Kommunikation zwischen Prozessen (auch Rechnerübergreifend).
Ein Socket wird durch ein Triple adressiert (Protokoll ist entweder TCP oder UDP):
Da zwei Rechner kommunizieren ergibt dies ein 5-Tupel , da das Protokoll identisch sein muss:
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:
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
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.
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>
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.
ss
¶Mit dem Werkzeug ss
lassen 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.
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/.
Nebenbemerkung: Neben den Netzwerk-Sockets gibt es unter Linux auch noch Unix-Sockets
zur Interprozesskommunikation, siehe man unix
.
/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:
cat </dev/tcp/time.nist.gov/13
59551 21-12-03 11:18:59 00 0 0 0.0 UTC(NIST) *
Ein HTTP-request:
# 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.
# 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
}
scan christianherta.de 20 24
scan christianherta.de 75 85
christianherta.de christianherta.de 80 81
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:
# 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.
Lesen Sie die kurze Beschreibung zu NFS und NIS: https://www.linux-praxis.de/nfs-und-nis
Im Ubuntu-Wiki gibt es eine Seite mit einer Auflistung verschiedener Netzwerk-Monitoring Werkzeugen mit denen man Netzwerkaktivitäten protokollieren und analysieren kann.
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 (insbesondere von wireshark) aus Sicherheitsgründen problematisch ist, siehe z.B. https://blog.packet-foo.com/2018/09/attacking-wireshark/.
Peter Balog, TCP/IP Client Server Architektur: https://embsys.technikum-wien.at/staff/balog/documents/course-material/tcpip_client-server-architecture.pdf
Umfangreiches Standardlehrbuch zu Computernetzwerken: