Port-Forwarding mit systemd

25.12.2023
06.06.2019

Manchmal braucht man auf einem System mal schnell ein Port-Forwarding. Zuerst fallen einem dann die üblichen Verdächtigen in Form von iptables, NetCat und inetd ein. Ist man allerdings auf einem System unterwegs, welches systemd als Service-Manager einsetzt, benötigt man keine weiteren Tools.

Nachsendeauftrag

Systemd kann über die Socket-Activation selbst auf einem bestimmten Port lauschen und startet, sobald eine Verbindung eingeht, selbstständig einen Service. Dieser muss dann die bereits bestehende Verbindung von systemd übernehmen (wie das geht ist in der entsprechenden man-Page beschrieben) und sich um alles weitere kümmern.

Nehmen wir also an, wir wollen auf einem System eine eingehende Verbindung auf Port 8080 auf den Webserver webvm auf Port 80 weiterleiten. Hierfür brauchen wir zwei Konfigurationsdateien:

  • Die socket-Unit, um systemd auf eine eingehende Verbindung auf Port 8080 lauschen zu lassen.
  • Die service-Unit, welche das Programm systemd-socket-proxyd startet.

Also zuerst zur Datei webvm.socket. Diese muss in /etc/systemd/system angelegt werden:

[Socket]
ListenStream=8080

[Install]
WantedBy=sockets.target

Das war’s auch schon. Jetzt fehlt noch die service-Unit, welche die Weiterleitung übernimmt. Das Programm systemd-socket-proxyd nimmt als Parameter den Zielhost und – abgetrennt durch einen Doppelpunkt – den Zielport entgegen. Die service-Unit muss den gleichen Namen haben und im gleichen Pfad liegen wie die socket-Unit, nur die Erweiterung lautet jetzt .service:

[Unit]
Description="Forwardig to webvm:80"

[Service]
ExecStart=/usr/lib/systemd/systemd-socket-proxyd webvm:80

Mehr ist für ein einfaches Port-Forwarding nicht nötig. Die man-Page zu systemd-socket-proxyd enthält noch weitere Beispiele. Das Programm kann zum Beispiel auch auf lokale Unix-Sockets weiterleiten.

Energie!

Sind beide Unit-Dateien vorhanden, kann die socket-Unit über systemctl start webvm.socket gestartet werden. Der Service startet erst, wenn die erste Verbindung auf dem Socket eingeht. Soll das Forwarding bei jedem Systemstart aktiv sein, muss die Unit noch über systemctl enable webvm.socket aktiviert werden.