Zum Hauptinhalt springen
Fonkontor

Technik

Unter der Haube

Für IT-Dienstleister und Administratoren: woraus Fonkontor besteht, welche Ports es braucht und wie es abgesichert ist.

Aufbau

Ein Docker-Compose-Stack mit getrennten Diensten. Änderungen an Nebenstellen wirken ohne Neuladen, weil PJSIP Endpunkte bei Bedarf aus der Datenbank liest. Den Wahlplan erzeugt das Backend je Mandant und lädt ihn über ARI nach.

DienstTechnikAufgabe
asteriskAsterisk 20 LTS (PJSIP)Registrar, Anrufsteuerung, Medien, Anrufbeantworter, Warteschlangen. Liest Endpunkte, Leitungen, Postfächer und Warteschlangen live aus PostgreSQL (Realtime), schreibt Anrufdaten dorthin.
backendNode.js 22, Express 5, TypeScriptREST-API, schreibt in die PJSIP-Realtime-Tabellen, erzeugt den Wahlplan je Mandant, steuert Asterisk über ARI, Live-Ereignisse per WebSocket.
webReact 19, Vite, Tailwind CSS 4, nginxVerwaltungsoberfläche, Einrichtungsassistent, Provisionierung der Telefone, WebRTC-Telefon.
dbPostgreSQL 17Anwendungsdaten und Realtime-Konfiguration; Migrationen laufen beim Start automatisch.
sbcKamailio 6.0, rtpengine 12.5Grenzschutz für Telefone und Apps im Internet: TLS/SRTP, WSS mit DTLS-SRTP/ICE, eigene Sperren. Asterisk ist nie direkt im Internet.
standort-gwWireGuard (Kernel-Modul)Je Filiale eigene Schnittstelle und eigener UDP-Port, Rückweg per Policy-Routing – überlappende Filialnetze sind möglich.
tts (optional)Piper 1.8, Stimme de_DE-mls-mediumText-zu-Sprache für Ansagen, nur CPU, rund 250 MB RAM. Ab 2 GB Arbeitsspeicher automatisch aktiv.
  • Mandantenfähig: je Mandant eigener Wahlplan-Kontext, SIP-Benutzer <nummer>-<mandant>, Anrufe zwischen Mandanten sind bewusst nicht möglich.
  • Rollen: Betreiber (mandantenübergreifend), Mandanten-Admin, Benutzer.
  • Abbilder für amd64; arm64 folgt mit dem öffentlichen Kanal. Kubernetes-Manifeste gibt es für den eigenen Betrieb, Produktform für Dritte ist Compose.

Ports

PortDienstZweckVon außen
80 / 443 (sonst 8090 / 8443)webOberfläche, Provisionierung, WebRTCnein
5060 udp/tcpasteriskSIP im LANnein
5061 tcpasteriskSIP über TLS im LANnein
10000–10049 udpasteriskMedien im LAN und zum Anbieternein
5063 tcpsbcSIP über TLS für Telefone im Internetja (am Router z. B. 5061 → 5063)
8444 tcpsbcSIP über WebSocket (WSS) für Apps und Browserja (am Router z. B. 8443 → 8444)
20000–20099 udpsbcMedien (rtpengine)ja
5062 udp/tcpsbcSIP unverschlüsselt (nur für Sonderfälle)nein, nicht empfohlen
51821–51850 udpstandort-gwWireGuard, ein Port je Filialeja, je Filiale

Die Host-Ports des SBC sind über SBC_SIP_PORT, SBC_TLS_PORT undSBC_WSS_PORT in der .env änderbar; Name und Ports nach außen stellt die Oberfläche ein. Im Router SIP-ALG ausschalten.

Sicherheit

  • Kein Standard-Konto: Erstes Betreiber-Konto nur mit dem Einrichtungsschlüssel des Installers, 10 Fehlversuche je Adresse sperren 15 Minuten.
  • Alle Geheimnisse zufällig erzeugt, .env mit Rechten 0600.
  • Passwörter mit scrypt, Sitzungen als HTTP-only-Cookies.
  • 2FA mit TOTP, Wiederherstellungscodes und Passkeys (WebAuthn), Pflicht je Rolle einstellbar.
  • OIDC mit beliebigem Anbieter (Code-Flow mit PKCE, ID-Token gegen JWKS geprüft), Gruppen → Rolle und Mandant.
  • TOTP-Schlüssel und Client-Secrets AES-GCM-verschlüsselt in der Datenbank.

Telefonie-Schutz

  • SIP-Schutz: Sperre nach Fehlanmeldungen, „SIP nur aus diesen Netzen“.
  • SBC sperrt Anfragefluten (pike), Scanner-Kennungen und wiederholt abgelehnte Anmeldungen; Abgleich mit dem SIP-Schutz jede Minute.
  • Berechtigungsklassen je Nebenstelle (intern, national, international, alles); Mehrwertdienste und Satellit nur mit „alles“.
  • Notruf 110/112 ohne Berechtigungsprüfung über jede Leitung, jeder Notruf protokolliert.
  • TLS und SRTP für Telefone außer Haus, Provisionierung dort nur über HTTPS mit Geheimnis im Pfad.

Sicherheitsupdates und Schwachstellen melden

Telefone und Provisionierung

MAC-basierte Auslieferung aus Vorlagen je Hersteller (Yealink <mac>.cfg, Snom und Grandstream XML). Unbekannte MAC-Adressen bekommen 404; jeder Abruf aktualisiert „zuletzt provisioniert“ und die Gerätekennung. Tasten: Yealink linekey, Snomfkey. Firmware-Verteilung je Hersteller und Mandant; Firmware wird nicht mitgeliefert, sondern vom Kunden hochgeladen. Hot Desking über SIP-NOTIFYcheck-sync.

Im LAN läuft die Provisionierung über HTTP – üblich, aber nur fürs eigene Netz gedacht. Geräte außer Haus erhalten automatisch eine HTTPS-Adresse mit Geheimnis im Pfad und werden auf TLS/SRTP umgestellt.

Installer

curl -fsSL https://fonkontor.de/install.sh | sudo sh
sudo sh install.sh [Optionen]
OptionWirkung
--ziel DIRInstallationsverzeichnis (Vorgabe /opt/fonkontor)
--bild-quelle PFADAbbild-Präfix, etwa eine eigene Registry
--bild-version TAGAbbild-Version
--abbilder DATEI.tarOffline-Installation aus docker save
--ohne-pullAbbilder nicht laden (schon vorhanden)
--ohne-mdnskeinen pbx.local anmelden
--erzwingenauch auf nicht unterstützten Systemen fortfahren

Ein zweiter Lauf ist der Update-Weg: Geheimnisse bleiben, compose.yml wird ersetzt (die alte bleibt als compose.yml.alt), danach pull undup -d. Eigene Anpassungen gehören in compose.override.yml.

Schnittstellen

  • REST-API des Backends für Mandanten, Nebenstellen, Geräte und Einstellungen.
  • Webhooks bei Anrufereignissen, Namensauflösung eingehender Rufnummern gegen eigene Quellen.
  • Klick-zum-Wählen und Präsenzliste (/api/praesenz, mit Live-Hinweis per WebSocket).
  • Telefonbuch für die Telefone, Anrufliste aus cdr in PostgreSQL.
  • Externer Prüfknoten für die Erreichbarkeit von außen, Netzwerkdiagnose in der Oberfläche.

Fragen zur Integration? Technische Anfrage stellen.