Discussion:
Faxen mit dem All-IP-Anschluss der Telekom und FreePBX / Asterisk
(zu alt für eine Antwort)
Andreas Hartmann
2015-05-05 16:50:12 UTC
Permalink
Hallo zusammen,

ich schildere hier, wie man mit Hilfe von FreePBX und Asterisk mit dem
VoIP - Anschluss der Telekom Faxe von einem Computer aus senden und
empfangen kann. Es geht hier nicht um die Anbindung eines klassischen
Fax-Gerätes via ISDN oder POTS an VOIP.

Vorweg einige grundsätzliche Anmerkungen zum Thema Fax und
VoIP-Anschluss, da konventionelles Faxen mit einem VoIP-Anschluss nicht
ganz unproblematisch ist.

Die Älteren unter uns kennen vielleicht noch die alten klassischen
Modem-Zeiten (da gab es noch kein DSL), mit denen man sich ursprünglich
über die analoge Telefonleitung beim Internetprovider eingewählt hat. Da
konnte man, je nach Modem-Konfiguration, am Anfang ein Piepsen
wahrnehmen: Über dieses Piepsen haben sich das eigene Modem und die
Gegenstelle verständigt auf digitalem Weg über eine analoge Leitung. Das
Piepsen wurde von digitalen Signalprozessoren (DSP) auf beiden Seiten
jenseits der Leitung erzeugt bzw. verstanden.

Auf gleicher Weise wird auch ein Fax an einem analogen Anschluss
übertragen (den gab es schon vor ISDN :-)): Ein DSP im Faxgerät macht es
möglich, die (digitalen) Faxdaten digital über eine analoge Leitung zu
bringen. Auf der Gegenseite wird diese "analoge Digitalisierung" über
einen weiteren DSP wieder rückgängig gemacht in "echte" digitale Signale.


Zurück zum All-IP - Anschluss der Telekom: Dieser bietet keine analoge
Telefonie mehr, nur noch rein digitale Anbindung via IP.

Für Telefoniezwecke wird das VoIP - Protokoll verwendet, welches
seinerseits im Datenkanal rtsp via UDP bzw. eine für das Gehörempfinden
optimierte Sprachdatenaufbereitung einsetzt: dafür wurde VoIP konzipiert.

Die Sprachoptimierungen filtern nun aber Teile der von den DSPs der Faxe
generierten Pieptöne weg. Zusätzlich macht das rtsp via UDP der
Fax-Verbindung zu schaffen, da die DSPs sowohl auf zeitlich konstante
(jitter-freie) Datenübertragung angewiesen sind als auch auf eine
lückenlose Übertragung - beides ist nicht die Domäne von UDP/IP: hier
können schon einmal Pakete unterwegs verloren gehen - für VoIP noch
nicht problematisch, solange es nicht zu viele sind - für Fax aber
schon, weil dann die Verbindung aus dem Tritt gerät und das Fax somit
nicht übertragen werden kann. Genau sowenig ist gewährleistet, dass die
Pakete zeitlich kontinuierlich transportiert werden (jitter). Für
IP-Verbindungen unkritisch - für die Fax-DSPs kann auch das der Tod sein.

Die Probleme sind bekannt und es gibt auch eine Lösung dafür: Fax over
IP (FoIP). FoIP baut auf dem T.38-Standard auf. Das Problem dabei: die
Fax-Geräte unterstützen das in den wenigsten Fällen. Aber nicht nur die:
auch die Mehrzahl der VoIP-Provider unterstützen es nicht (zumindest
derzeit). Auch die Telekom unterstützt kein FoIP ... .

Siehe auch [1].

Wie kann man sich nun behelfen und Faxe über VoIP ohne
T.38-Unterstützung verschicken? Unter Berücksichtigung der oben
geschilderten technischen Rahmenbedingungen sind folgende Anpassungen /
Bedingungen nötig, um ca. 80% (diese Zahl habe ich des öfteren mal
gelesen) aller Faxe durchzubekommen - für Gelegenheitsfaxer mit wenigen
Seiten evtl. brauchbar - für Powerfaxer mit langen Faxen eher
unbrauchbar - muss aber jeder für sich selbst entscheiden:

- Verwendung eines nicht komprimierenden Codecs (G.711 bzw. alaw)
- Die beteiligten Übertragungsleitungen -komponenten sollten nicht
überlastet sein (kein Jitter und keine Paketverluste).



Wie sieht die oben genannte Vorgehensweise nun mit FreePBX / Asterisk aus?

Voraussetzung: Asterisk 11.17.0, FreePBX 2.11


Als All-IP - Kunde der Telekom bekommt man 3 Telefonnummern. Eine davon
kann man sich als Fax-Nummer einrichten. Dies geschieht in Asterisk /
FreePBX dadurch, dass jede Nummer als eigener Trunk konfiguriert wird.

Als Vorbereitung der Konfiguration in FreePBX muss man die zusätzlichen
FreePBX-Module "Custom Context" und "Fax Configuration" im Vorfeld
installieren.

Damit das "Fax Configuration" Module funktioniert, muss in Asterisk das
Module /usr/lib64/asterisk/modules/res_fax_spandsp.so vorhanden sein
(die Pfade können natürlich variieren von System zu System und müssen
für die eigene Umgebung angepasst werden).

Per Default war das Asterisk Module hier nicht vorhanden. Ich musste mir
das erst selbst übersetzen. Hierzu den Sourcecode von Asterisk in der
eingesetzten Version runterladen und in ein Unterverzeichnis entpacken.
Zusätzlich das Asterisk devel-Paket für den aktiven Asterisk-Server
installieren.
Außerdem muss natürlich die libspandsp2 und deren devel-Pakete
installiert sein. Dann kann man im runtergeladenen Asterisk-Source das
Module wie folgt übersetzen (nachdem man ins passende Unterverzeichnis
der Sourcen gewechselt ist, in dem res_fax_spandsp.c liegt):

gcc -g -Wall -D_REENTRANT -D_GNU_SOURCE -fPIC
-DAST_MODULE=\"res_fax_spandsp\" -c -o res_fax_spandsp.o res_fax_spandsp.c

gcc -shared -Xlinker -x /usr/lib64/libspandsp.so -o res_fax_spandsp.so
res_fax_spandsp.o

Dann wird die res_fax_spandsp.so ins Asterisk-Module-Verzeichnis kopiert
und Asterisk durchgestartet.


Das im Folgenden beschriebene Vorgehen setzt also voraus, dass ein Trunk
für die Faxnummer in FreePBX angelegt wurde und dass die zusätzlichen
FreePBX-Module "Custom Context" und "Fax Configuration" installiert sind
sowie das Asterisk-Module res_fax_spandsp.so vorhanden und geladen ist.

Des Weiteren muss iaxmodem und Hylafax installiert sein [2].



1. Senden von Faxen
-------------------

Der SW-Stack gestaltet sich wie folgt:

Hylafax -> iaxmodem -> IAX2-Extension -> "Custom Contexts" Module ->
Outbound Routes -> Fax-Trunk


Hylafax übergibt die Fax-Daten (tiff) auf seriellem Wege an das
iaxmodem. Das iaxmodem stellt einen in Software gegossenen DSP dar, der
die Daten unter Verwendung des G.711 / alaw - Codecs an die Asterisk
IAX2 Extension übergibt.


Hierzu wird in FreePBX eine IAX2-Extension angelegt:
Applications -> Extension -> Generic IAX2 Device -> Submit.

Man bekommt nun sämtliche (nicht alle!) Optionen dieser neuen Extension
zur Auswahl. Wichtig sind zunächst (hier beispielhaft ausgefüllt):

- User Extension: 33 (die Rufnummer, wie wir die Extension erreichen)
- Display Name: Fax (zu Anzeigezwecken)
- Outbound CID: die eigene Faxnummer inkl. Vorwahl
- secret: wird automatisch generiert - hier verwende ich jetzt der
Einfachheit halber "pass" - sollte man natürlich nicht tun im real
life!

Dann submit. Die neue Extension wird nun in der Liste der Extensions
angezeigt und kann wieder ausgewählt werden. Genau das tun wir nun,
damit wir die Konfiguration vervollständigen können:

- type: friend
- Custom Context: hier muss später noch der für Fax angelegte Context
eingestellt werden.

Unter Fax:
Enabled: Haken setzen
Fax Email: sinnvolle Mailadresse, wo man empfangene Faxe hingesendet
haben möchte.
Attachment Format: ein passendes aussuchen.

Dann wieder submit. In "Optional Destinations" müssen nun noch die Fälle
"No Answer", "Busy" und "Not Reachable" auf "Fax recipient" "Fax (33)"
zeigen (auf sich selbst - diese Möglichkeit bekommt man erst, wenn wie
beschrieben im Bereich Fax der Enabled-Haken gesetzt ist und einmal
submitted wurde). Dies ist nötig, damit die Extension beim Senden nicht
auf Signale seitens des Empfängers wartet, sondern unabhängig davon
loslegt, falls der Empfänger auch wartet :-).


Die Konfig für das Iaxmodem sieht dann so aus mit den Werten aus der
IAX2-Extension:

cat /etc/iaxmodem/ttyIAX0
device /dev/ttyIAX0
owner uucp:uucp
mode 660
port 4570
refresh 120
server 127.0.0.1
peername 33 # (aus der IAX2-Extension "User Extension")
secret pass # (aus der IAX2-Extension "Secret")
codec alaw


Das Fax ist nun von Hylafax aus via iaxmodem in Asterisk angekommen.
Hier muss nun sichergestellt werden, dass das Fax über den immer
gleichen korrekten Trunk rausgeht (um die korrekte CLI beim Empfänger zu
erhalten, welche von der Telekom zwangsgesetzt wird).

Das ist nun nicht so einfach, da das Routing einer Extension zu einem
Trunk in FreePBX auf Basis oder Teilen von Zielrufnummern (also z.B.
alle Handy-Gespräche, alle oder (bestimmte) Auslandsgespräche) in den
Outbound routes vorgenommen wird. Diese Ebene unterscheidet nicht
zwischen Voice-Calls und Fax-Calls.

Die Lösung besteht darin, die Outbound Routes, die eine Extension nutzen
kann, einzuschränken. Dies ist mit Hilfe des Custom Context in FreePBX
möglich, welcher einer Extension zugewiesen wird.

Zunächst wird nun eine Outbound Route für Faxe angelegt. Diese Route
matched z.B. auf sämtliche Nummern (der Einfachheit halber erstmal) und
wird als letzte Route in die Outbound Routes Liste gestellt.


Es wird nun ein eigener Custom Context wie folgt angelegt:

Connectivity -> Custom Contexts -> Add Context:
Im Context-Feld gibt man einen Context-Namen an, z.B. "faxContext" und
eine Beschreibung des Contexts im Description-Feld "Context fuer Faxe".

Nach Bestätigung bekommt man alle Optionen angezeigt, die ein Context
bietet. Die folgenden Änderungen sind wenigstens vorzunehmen:

ENTIRE Basic Internal Dialplan -> Deny
ALL OUTBOUND ROUTES -> Deny

Im Bereich der Outbound-Routes sind alle Routen zu verbieten, außer der
Route(n), welche zum Fax-Trunk führt.

Nachdem nun der Custom Context für den Fax-Trunk angelegt wurde und
submitted wurde, legt man nun genauso auch noch gleich einen Custom
Context für die Voice Calls an und gibt diesem aber die Routen, welche
für die Voice-Nummern gedacht sind.

Nun geht man wieder in die Fax-Extension und in die Voice-Extensions und
ordnet dort unter "Custom Context" den gewünschten Context zu, der
verwendet werden soll zum Raustelefonieren bzw. Rausfaxen, so dass
zukünftig die korrekten Outbound Routes genutzt werden.

Zum Schluss natürlich nicht vergessen, das Ganze auch zu aktivieren mit
"Apply Config".

Hiermit sollte das Versenden von Faxen in FreePBX abgeschlossen sein.

Zur Einrichtung von Hylafax: siehe [2]

Wichtig im Rahmen der Schnittstelle zwischen Hylafax und dem iaxmodem
ist, dass dem restarteten Hylafaxserver das laufende iaxmodem bekannt
gemacht werden muss mit dem Befehl

faxmodem ttyIAX0


2. Empfangen von Faxen (Fax2Mail)

Der SW-Stack gestaltet sich wie folgt:

Fax-Trunk -> Incoming Routes -> IAX2-Extension -> Mail-Server


Das Empfangen von Faxen ist etwas einfacher zu konfigurieren als das
Senden von Faxen. Der Fax-Trunk ist ja vom Senden schon vorhanden. Es
muss nun noch eine Inbound Route für Faxe angelegt werden:

Connectivity -> Inbound Routes

Hier wird das Routing auf Basis der DID (-> die Nummer, auf der man
angerufen wurde) durchgeführt:

Description: Fax (z.B.)
DID-Number: Die eigene Fax-Nummer ohne Vorwahl

Fax Detect:
Detect Faxes: no

Set Destination:
Extensions: die für das Versenden angelegte Fax-Extension, im Beispiel
mit der Nummer 33.

-> Submit

Die oben für das versenden der Faxe angelegte Extension kümmert sich nun
um die Annahme des Faxes und leitet das Fax per Mail weiter (so haben
wir das beim Anlegen der Extension schon definiert).

Das war es schon :-))



Testen kann man die Ganze Nummer erstmal mit sich selbst - man hat ja
zwei gleichzeitige Calls bei All-IP zur Verfügung. D.h., man schickt
sich selbst ein Fax an die eigene Fax-Nummer. Mit diesem Test kann die
Funktionalität des gesamten Stacks getestet werden:

- Als Fax-Client kann man z.B. YajHFC verwenden [3]
- Geht der Call über die richtige Nummer raus, sprich, ist das Outbound
Routing korrekt eingestellt?
- Erscheint auf dem Fax die korrekte Absendernummer?
- Wird das ankommende Fax von der korrekten Extension entgegengenommen?
- Klappt das Mailrouting?
- ...
- Gehen Voice-Calls auch noch die richtigen Routen? Werden die
korrekten CIDs angezeigt (= die korrekten Routen verwendet)?

Wenn das alles einwandfrei funktioniert, kann man nun auch mal ein Fax
an einen "fremden" Teilnehmer aus dem Freundeskreis schicken und testen,
ob alles passt. Der Freund kann das Fax auch gleich zurückschicken, dann
sieht man gleich, was angekommen ist. Dieser finale Test sollte aber
problemlos laufen, wenn man sich vorher selbst die Faxe zuschicken konnte.

Diesen 4-seitigen Text als PDF habe ich mir z.B. auch selbst als
Test-Fax zugeschickt. Hat auf Anhieb problemlos funktioniert. Überhaupt
haben alle bisher ausgeführten Faxe zu 100% funktioniert. Doch nicht so
schlecht wie erwartet :-).



Viel Spaß,
Gruß,
Andreas


[1] http://www.elektronik-kompendium.de/sites/net/1103151.htm
[2] http://das-asterisk-buch.de/1.6/faxserver-mit-iaxmodem-und-hylafax.html
[3] http://www.yajhfc.de/
Thomas Rechberger
2015-05-13 14:04:20 UTC
Permalink
Post by Andreas Hartmann
Diesen 4-seitigen Text als PDF habe ich mir z.B. auch selbst als
Test-Fax zugeschickt. Hat auf Anhieb problemlos funktioniert. Überhaupt
haben alle bisher ausgeführten Faxe zu 100% funktioniert. Doch nicht so
schlecht wie erwartet :-).
Erfahrungsgemäß besser mit wenig Seiten und schneller Leitung.
Das Telekom immer noch kein T.38 anbietet ist schon übel. Weil die
wenigsten wissen das es das überhaupt gibt. Da ist zuviel Halbwissen
unterwegs.

Faxe senden kann man übrigens auch mit der Applikation sendfax die in
Asterisk integriert ist. Für Fax brauch ich auch nichts an den Optionen
vor dem kompilieren umstellen.
Um Faxe zu verschicken habe ich einen Webserver laufen wo ich die Datei
über ein Perl Script hochladen kann und das wird dann vom Server
verschickt. Eine "Sendebestätigung" gibts als Email.

Loading...