Asterisk auf einem Server ins Heimnetz mittels WireGuard
Asterisk ist eine beliebte Open-Source-Software für die Erstellung von Telefonanlagen. Es ermöglicht die Verarbeitung von Anrufen über IP-Netzwerke und das Festnetz. Es bietet eine Vielzahl von Telekommunikationsfunktionen wie Anrufweiterleitung, Voicemail und Konferenzschaltungen.
Wer Asterisk selber zuhause betreibt hat ein paar Nachteile:
- Sicherheitsrisiko bei Schwachstellen von Asterisk
- Probleme bei automatischem IP-Wechsel vom Provider
- Port-Forwarding auf den Asterisk Server ins interne Netzwerk ist erforderlich
- Gfs. langsame oder abbrüchige Verbindung, die zu schlechter Anrufqualität führt
- SIP-Telefone müssen im selben Netzwerk sein (ohne VPN zumindest)
Hier gibt es jetzt eine mögliche Lösung. – Einen vServer bzw. Root-Server in einem Rechenzentrum.
Dort lässt sich der Asterisk-Server entspannt hosten, hat eine dedizierte IP-Adresse die sich (normalerweise) niemals ändert, eine (meist) schnelle Internetverbindung und ist meistens durch eine stärkere Firewall abgesichert.
Auch private Daten sind mehr geschützt, da wir ja nicht mehr auf das Heimnetz zugreifen, sondern jetzt auf den Server.
Hier sollte man natürlich abwägen, was auf dem Server liegt.
Dieser Beitrag ist keine detallierte Installationsanleitung für Asterisk, sondern eine Erklärung wie man den Asterisk-Server ins Heimnetzwerk bekommt, ohne ihn wirklich im Heimnetz zu haben. – Die Anleitung ist für Linux, speziell für den Raspberry Pi und einen Ubuntu-Server geschrieben.
Vorraussetzungen
- Gerät im Heimnetz das Routing kann
- Gerät (selbes) welches WireGuard unterstützt (am besten RPI)
- Kenntnisse in Linux (oder ein beliebieges anderes System)
Einrichtung des WireGuard-Tunnels
Zunächst müssen wir den WireGuard-Tunnel einrichten, um überhaupt ein Interface zu haben, auf dem wir später arbeiten können.
Hierfür referenziere ich auf meine Anleitung zum einrichten eines WireGuard-Tunnels in ein internes Netzwerk. – Die Konfiguration ist sehr ähnlich und wird hier nur sehr bruchstückig beschrieben.
Zuerst müssen wir wie in meiner Anleitung beschrieben ein RSA-Keypair generieren. – Einmal für den Server & einmal für den Client.
Sprich auf beiden Geräten muss der folgende Befehl ausgeführt werden:
wg genkey | tee /etc/wireguard/privatekey | wg pubkey > /etc/wireguard/publickey
Die beiden Keys liegen nun jeweils unter /etc/wireguard/privatekey und /etc/wireguard/publickey.
Einrichtung WireGuard auf dem Server (auf dem Asterisk läuft)
Wir öffnen die Konfiguration unseres Servers (der im Rechenzentrum oder anderem Standort als zuhause) mittels eines Texteditors (z.B. Nano oder Vim):
[Interface] ## My VPN server private IP address ## Address = 10.1.0.1/24 ## My VPN server port ## ListenPort = 51820 ## VPN server's private key i.e. /etc/wireguard/privatekey ## PrivateKey = ******* # hier den private-key aus /etc/wireguard/privatekey einfügen PostUp = iptables -t nat -I POSTROUTING 1 -s 10.1.0.0/24 -o eth0 -j MASQUERADE; iptables -I INPUT 1 -i wg0 -j ACCEPT; iptables -I FORWARD 1 -i eth0 -o wg0 -j ACCEPT; iptables -I FORWARD 1 -i wg0 -o eth0 -j ACCEPT PostDown = iptables -t nat -D POSTROUTING -s 10.1.0.0/24 -o eth0 -j MASQUERADE; iptables -D INPUT -i wg0 -j ACCEPT; iptables -D FORWARD -i eth0 -o wg0 -j ACCEPT; iptables -D FORWARD -i wg0 -o eth0 -j ACCEPT # Unser Heimnetz-Peer [Peer] PublicKey = ******* # Hier den public-key vom Client im Heimnetz einfügen AllowedIPs = 10.1.0.140/32
Den ersten Wert (PrivateKey) füllen wir mit dem Private-Key aus, den wir eben mit dem Befehl von oben generiert haben. – Bitte beachte hier den PrivateKey vom Server zu nutzen, nicht vom Client. Der zweite Wert PublicKey bei Peer, muss mit dem Public-Key des Clients im Heimnetz gefüllt zu werden.
Der Tunnel ist auf der Server-Seite also schon einmal vorkonfiguriert.
Um den Server zu starten, geben wir ‚wg-quick up wg0′ ein.
Kommen wir nun zum Client.
Einrichtung WireGuard auf dem Client (im Heimnetz)
Hier ist es relativ ähnlich, bis auf dass wir noch eine IP-Adresse (Endpunkt) sowie einen anderen Private- und Publickey angeben müssen.
[Interface] Address = 10.1.0.140/32 PrivateKey = **** # hier private-key vom CLIENT einfügen PostUp = iptables -t nat -A PREROUTING -s [hier ip des Endgeräts im eigenen netz einfügen, z.B. 192.168.1.2/32]/32 -j DNAT --to-destination 10.1.0.140; iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE; iptabls -A FORWARD -i wg0 -o eth0 -j ACCEPT; iptables -A FORWARD -i eth0 -o wg0 -j ACCEPT PostDown = iptables -t nat -D PREROUTING -s [hier ip des Endgeräts im eigenen netz einfügen, z.B. 192.168.1.2/32]/32 -j DNAT --to-destination 10.1.0.140; iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE; iptabls -D FORWARD -i wg0 -o eth0 -j ACCEPT; iptables -D FORWARD -i eth0 -o wg0 -j ACCEPT [Peer] PublicKey = *** # hier public-key vom SERVER einfügen Endpoint = ip:51820 AllowedIPs = 10.1.0.0/24 PersistentKeepalive = 5 # für Asterisk ist ein Keepalive wichtig
Danach kann das Interface (und der Tunnel) mittels ‚wg-quick up wg0‘ aktiviert werden.
Um zu sehen ob die Interfaces jeweils aktiviert wurden, kann ‚wg show‘ eingegeben werden. Hier sollte z.B. sowas stehen:
$ wg show interface: wg0 public key: **** private key: (hidden) listening port: 33514 peer: **** endpoint: *****:51820 allowed ips: 10.5.0.0/24 latest handshake: 9 seconds ago transfer: 981.19 MiB received, 1215.68 MiB sent persistent keepalive: every 2 seconds
Jetzt müssen wir auf dem Gerät im Heimnetz (am besten Raspberry Pi), das ipv4-forwarding aktivieren.
Dazu öffnen wir die Datei /etc/sysctl.conf mit nano.
Es wird gesucht nach dem Stichwort ’net.ipv4.ip_forward‘ mittels Strg+W & net.ipv4.ip_forward & Enter.
Die Zeile muss nun einkommentiert werden (# am Anfang entfernen) und der Wert nach dem ‚=‘ auf 1 gesetzt werden.
Speichern lässt sich die Datei mittels Strg+X & ‚y‘ & Enter.
Um die Änderungen zu übernehmen, muss ‚sysctl -p‘ ausgeführt werden. Das Forwarding ist damit aktiv.
Einrichtung Routing
Wer das Gerät auf welchem der Client eingerichtet ist als Router für sein Heimnetz nutzt, muss in der Regel nichts weiter einrichten.
WireGuard erstellet durch wg-quick eine Route für 10.1.0.0/24 an das WireGuard-Interface.
Sollte in dem Netzwerk ein anderer Router sein, muss auf diesem die Route von hand angelegt werden.
Wenn es ein Linux-Gerät ist, kann hier der Befehl ‚ip route add 10.1.0.0/24 via *ip des Geräts im Heimnetz*‘ genutzt werden.
Bei einer Fritz-Box ist die Route über die Heimnetz-Einstellungen anzulegen. Eine detaillierte Anleitung dazu gibt es hier von avm.
Einstellungen in Asterisk
Asterisk sollte für diese Anleitung bereits eingerichtet sein. – Derzeit habe ich auf meinem Blog keine Anleitung für Asterisk mit PJSIP, allerdings überlege ich das irgendwann einmal nachzuholen. Somit verweise ich erstmal auf zwei gute Anleitungen:
- Einrichtung von Asterisk (hierbei bitte beachten sip.conf nicht einzurichten, da wir PJSIP nutzen)
- Grundkonfiguration PJSIP
Zunächst müssen die Änderungen für das Routen in der pjsip.conf angelegt werden. Dazu wird diese einmal mit z.B. nano geöffnet.
Sie liegt nach einer herkömmlichen Installation unter /etc/asterisk/pjsip.conf.
Nun ändern wir die Transport-Methoden für die SIP-Telefone ab.
Hier kann am besten eine neue erstellt werden, mit dem Namen [transport-tcp-wg], was für soviel wie transport, tcp port und wireguard steht.
Natürlich lässt sich auch sehr gut udp für die Kommunikation nutzen, allerdings hat sich bei mir TCP etwas besser bewährt, möglicherweise liegt es aber auch an meiner abbrüchigen Heimleitung.
Folgendes muss in die Konfiguration unter den anderen Transport-Methoden eingefügt werden:
[transport-tcp-wg] type=transport protocol=tcp ; Oder udp bind=10.1.0.1 external_media_address=10.1.0.1 external_signaling_address=10.1.0.1
Danach bitte die SIP Telefon-Konfigurationen jeweils anpassen, indem die transport= auf transport-tcp-wg gesetzt werden:
[201] type=endpoint transport=transport-tcp-wg context=from-internal callerid=XYZ <201> disallow=all allow=ulaw allow=gsm auth=201 aors=201 allow_subscribe=yes rewrite_contact=yes direct_media=no rtp_symmetric=yes force_rport=yes
Die Option ‚direct_media‘ ist wichtig auf no zu setzen, um zu verhindern dass die Medien direkt an den Endpunkt gesendet werden. Wir nutzen hier ein VPN aus einem internen Netzwerk, wodurch der Endpunkt das 10er Netz niemals finden könnte.
Danach alles speichern und Asterisk mittels ‚asterisk -rvvvvvv‘ und ‚core restart now‘ (in der CLI) neustarten.
Sofern kein Fehler in der CLI von Asterisk erscheint, einfach mittels Strg+C verlassen (sofern man sich im richtigen CLI-Modus befindet).
Fazit
Die Installation ist nicht gerade einfach und sollte vermutlich eher von Fachpersonal ausgeführt werden.
Meine Lösung könnte hier und da ein paar Fehler aufweisen, da ich alles selbst nur zusammengeschustert habe und kein Experte im Bereich Netwerk/Firewalls und Routing bin.
Ich übernehme keine Verantwortung für Fehlgeschlagene Experimente beim benutzen dieser Anleitung. Ein Backup vor dem Bearbeiten von Dateien sollte stets erfolgen um jederzeit auf die laufende Konfiguration zurückzukehren.
Sollte jemand einen Tippfehler oder stark technischen Fehler in dieser Anleitung zu Augen kommen, kann er mich gerne unter meiner E-Mail Adresse kontaktieren. Ich werde demnach die Änderungen einpflegen.
Vielen Dank fürs Lesen!