An dieser Stelle sollte nochmals betont werden, dass die FreePBX- bzw. Asterisk-Telefonanlage – wie jedes andere Gerät im lokalen Netzwerk – ein netzwerkfähiger Computer ist und sich auch entsprechend verhält. Wie im Schema dargestellt, erfolgt der Internetzugang aller Geräte, einschließlich der FreePBX-Anlage, über den DSL-Router respektive eine Firewall. Auch die Telefonanlage nutzt diesen Weg, um sich beispielsweise am SIP-Trunk des Telefonieanbieters zu registrieren.
In vielen Fällen ist es erforderlich, die integrierten Telefoniefunktionen herkömmlicher DSL-Router (so bei der FRITZ!Box) zu deaktivieren, da diese sonst SIP-Verbindungen stören und die Registrierung am SIP-Trunk fehlschlagen kann.
Eine wesentlich robustere und kontrollierbarere Lösung stellt der Einsatz eines OpenWRT-Routers mit korrekt eingerichtetem SIP-NATing (Session Initiation Protocol – Network Address Translation) dar. Dadurch wird sichergestellt, dass die SIP- und RTP-Protokolle, die Asterisk benötigt, sauber durch die NAT-Firewall geleitet werden.
Zusätzlich profitiert man von den erweiterten Funktionen einer OpenWRT-Firewall im Vergleich zu typischen Consumer-Routern – etwa durch gezielte Portfreigaben, SIP-Handling über iptables/conntrack, und nicht zuletzt durch den Einsatz von Sicherheitsmechanismen wie Fail2ban, um SIP-Registrierungsversuche gegen Brute-Force-Angriffe abzusichern.
Die SIP-Settings befinden sich unter “Einstellungen → Asterisk SIP Settings” (http://IP-Adresse/admin/config.php?display=sipsettings). Hier sind wichtige Einstellungen unter den Reitern “Allgemeine SIP-Einstellungen" und ”SIP Settings [chan_pjsip]" vorzunehmen.
Der Parameter "Allow SIP Guests" erlaubt es nicht-authentifizierten SIP-Clients, sich mit dem Asterisk-Server zu verbinden. Wenn sie auf „Yes“ steht, kann jeder beliebige SIP-Client versuchen, Anfragen an den Server zu senden – selbst ohne Registrierung oder Authentifizierung. Deshalb ist dieser Parameter grundsätzlich auf “Nein” zu setzen.
Damit die Asterisk-Telefonanlage extern erreichbar ist, müssen unter “Externe Adresse” die externe IP-Adresse eingetragen werden. Zusätzlich wird unter “Local Networks” das lokale Netzwerk eingetragen. Das lässt sich bequem mittel der beiden Buttons umsetzen.
Solange sich die FreePBX/Asterisk-Telefonanlage hinter einer dynamischen IP-Adresse befindet, muss das im Prinzip nach jedem Wechsel der IP-Adresse manuell umgesetzt werden. Alternativ könnte man sich zum Beispiel bei DynDNS Service einen Hostnamen besorgen. Das ist sicherheitstechnisch, denn
Deshalb wird diese Herangehensweise hier nicht weiterverfolgt, sondern eine andere elegante Lösung.
Zwar nutzen einigen SIP-Providern nicht den Contact- oder Via-Header (wo die externe IP eingetragen wird), sondern antworten direkt auf die IP-Adresse, von der das SIP-Paket kam.
• Dadurch funktioniert es auch, wenn Asterisk im SIP-Header eine alte IP angibt.
• Das klappt besonders gut, wenn Asterisk hinter einer statischen NAT steht und keine asymmetrische NAT im Einsatz ist.
Aber hier biete ich meine Lösung an, die automatisch die externe IP-Adresse auf der FreePBX/Asterisk-Telefonanlage regelmässig zu updaten. Wir wissen bereits, dass die Einstellungen von FreePBX in einer MySQL-DB landen und von dort durch fwconsole reload
in die eigentlichen Asterisk-Konfigurationsdateien übertragen werden und der Asterisk-Service neugeladen wird. Das nutzen wir jetzt mit einem Script, das prüft, ob eine neue IP-Adresse vorliegt und wenn ja, sowohl die Datenbank als auch die Asterisk-Konfiguration aktualisiert. Ein Cronjob sorgt dafür, dass das täglich erfolgt.
~# vi /usr/local/bin/sip_external_ip_update.sh
#!/bin/bash
# -----------------------------------------------------------------------------
# Script: sip_external_ip_update.sh
# Description:
# Updates the "externip" field in the Asterisk (FreePBX) database with the
# current public IP address, if it has changed. Automatically reloads
# FreePBX configuration via fwconsole if updated.
#
# Intended for use with dynamic IP (e.g. behind NAT or DSL).
# Designed for safe execution via root's crontab.
#
# Author: Andreas Günther
# License: GNU General Public License v3.0 (GPLv3)
# License URL: www.gnu.org/licenses/gpl-3.0.txt
# Encoding: UTF-8
# -----------------------------------------------------------------------------
# ----------------------------
# Configuration
# ----------------------------
DB_NAME="asterisk"
DB_USER="dbuser"
PW="topsecret"
KV_KEY="externip"
IP_SERVICE="https://api.ipify.org"
# ----------------------------
# Logging Setup
# ----------------------------
exec 2> >(logger -t update_sip_external_ip -p user.err)
logger -t update_sip_external_ip “[DEBUG] Script started.”
# ----------------------------
# Get public IP
# ----------------------------
current_ip=$(curl -s "$IP_SERVICE")
logger -t update_sip_external_ip “[DEBUG] Fetched public IP: $current_ip”
if ! [[ $current_ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
logger -t update_sip_external_ip "[ERROR] Invalid public IP: $current_ip"
exit 1
fi
# ----------------------------
# Read IP from DB
# ----------------------------
db_ip=$(mysql -u "$DB_USER" -p"$PW" -N -B -e "SELECT val FROM kvstore_Sipsettings WHERE \`key\` = '$KV_KEY';" "$DB_NAME")
logger -t update_sip_external_ip “[DEBUG] Current DB IP: $db_ip”
if [[ "$current_ip" == "$db_ip" ]]; then
logger -t update_sip_external_ip "[INFO] IP unchanged: $current_ip – no action necessary."
exit 0
fi
# ----------------------------
# Update IP in the DB
# ----------------------------
mysql -u "$DB_USER" -p"$PW" -e "UPDATE kvstore_Sipsettings SET val='$current_ip' WHERE \`key\` = '$KV_KEY';" "$DB_NAME"
if [[ $? -ne 0 ]]; then
logger -t update_sip_external_ip "[ERROR] Error updating IP in database."
exit 2
fi
logger -t update_sip_external_ip “[INFO] IP updated: $db_ip → $current_ip”
# --------------------------------------
# fwconsole reload via su (safe context)
# --------------------------------------
logger -t update_sip_external_ip “[DEBUG] Running fwconsole reload via su - asterisk”
if output=$(su - asterisk -c "/usr/sbin/fwconsole reload" 2>&1); then
logger -t update_sip_external_ip "[INFO] fwconsole reload executed successfully."
else
logger -t update_sip_external_ip -p user.err "[ERROR] fwconsole reload failed: $output"
exit 3
fi
logger -t update_sip_external_ip "[sip_external_ip_update.shDEBUG] Script completed successfully."
exit 0
Das Script muss natürlich ausführbar gemacht werden.
~# chmod a+x /usr/local/bin/sip_external_ip_update.sh
Dann kann es beispielsweise via Cronjob täglich ausgeführt werden, als Beispiel
~# crontab -e
….
@daily * * * /usr/local/bin/sip_external_ip_update.sh
….
Damit wird die externe IP-Adresse zuverlässig in die FreePBX/Asterisk-Telefonanlage eingepflegt, ganz ohne DynDNS-Dienste oder ständiges manuelles Nachfassen. Warum kommen FreePBX-Entwickler nicht auch auf eine solche einfache Idee?
Die Einstellungen unter den "RTP Settings" sollten wie angeboten übernommen werden. Vor allem die "RTP Port Ranges" mit “10000-20000” sind wichtig, da wir sie so in der Firewall freigeben müssen.
Entscheidend für das Funktionieren der Verbindung sind die Codecs (Coder-Decoder). Sie bestimmen, wie Audiodaten bei einem VoIP-Gespräch komprimiert, übertragen und wieder dekodiert werden. Sie beeinflussen die Sprachqualität, die Bandbreitennutzung und die Kompatibilität mit Endgeräten und Anbietern. Bei VoIP über Telekom-Leitungen (z. B. SIP-Trunk oder extrahierte SIP-Zugangsdaten aus Routern) gibt es klare Vorgaben:
g722
(HD-Voice, bevorzugt)alaw
(G.711a – Fallback, ISDN-Qualität)Nicht zu benutzen sind dagegen:
ulaw
(G.711u – wird im europäischen Netz meist nicht unterstützt)gsm
, g726
, g729
(veraltet oder inkompatibel bei Telekom-Trunk)Bei aktivierten, aber nicht unterstützten Codecs kann es zu Verbindungsabbrüchen, SIP-Fehlern (488 Not Acceptable), Einweg-Audio oder gar keiner Gesprächsannahme kommen.
Man kann in der FreePBX-GUI durch Markieren und Ziehen mit der Maustaste, die Codecs in die richtige Reihenfolge bringen. Die ist wichtig, der zweite Wert immer Fallback sein wird. Im Prinzip sollte man sich beim Provider über die unterstützen Codecs informieren.
Bei der Konfiguration von SIP-Trunks in FreePBX/Asterisk ist die Auswahl der Codecs entscheidend. Anbieter wie die Deutsche Telekom erwarten in der Regel g722
(HD-Voice) an erster Stelle und alaw
als Fallback. Die Verwendung weiterer Codecs wie ulaw
, gsm
, g726
oder g729
kann zu Inkompatibilitäten führen und sollte bei diesen Providern vermieden werden. Die tatsächliche Codec-Auswahl sollte immer auf den Anforderungen des jeweiligen VoIP-Anbieters basieren.
Der Parameter “Show Advanced Settings” wird auf “Ja” gesetzt, damit erweiterte oder versteckte Konfigurationsmöglichkeiten angezeigt werden, die im normalen Modus ausgeblendet sind, um die Benutzeroberfläche übersichtlich zu halten.
Hier wird in der "Zertifikatverwaltung" der Wert “default” ausgewählt und als “SSL Method” der Wert “tlsv1_3” eingestellt. Das ist bei der Telekom wichtig, da diese nur mit dieser SSL-Methode überhaupt eine Registrierung zulässt.
Zum Schluss muss in “udp - 0.0.0.0 - All” der Wert auf “Ja” gesetzt werden und abgespeichert und neugeladen werden, um noch die letzten Einstellungen vorzunehmen. Bei “Port to Listen On” findet man zwei Portangaben einmal für UDP und einmal für TCP. UPD hört auf “5060” wohin gegen TCP auf Port “5061” zusetzen ist. Das ist bei der Telekom insoweit wichtig, denn wenn DSL verschlüsselt wird, verlangt die Telekom eben diesen Port "5061".
Damit wären die SIP-Settings soweit konfiguriert. Zur Konfiguration der Trunks geht es hier weiter.