The mission: “save some bucks by using a free PBX using a cheap isdn card”. Don’t try! Buy something working in the first place. But if you have to, here is one example how it can be done. There are, for sure, many others!
The idea was to replace trixbox using an AVM Fritz!PCI card with something more up to date and not that buggy. FreePBX Distro kicked itself out because of the issues with mISDN. Elastix brought in mISDN support but still failed in configuring it. Since the setup was for only 3 users for now and the idea was to later buy something more professional (I really hope it comes to this point), I used Starface free. It has 4 users and 10 extensions for free. Yet the free version only allows using SIP providers. Also it was not possible to buy a Patton SmartNode 4120 at the moment, which I still hope to get somewhere in the future. So I needed to build our own SIP trunk since the provider used (M-NET) does not provide SIP trunks as a product.
Everything is done as user root
unless noted otherwise.
mISDN + gateway setup
Install a fresh centos 5 (5.9). You can use the netinstall version since you need practically nothing.
Be sure to update: yum update
add the elastix repository: elastix, epel
create file
/etc/yum.repos.d/epel.repo
[epel] name=Extra Packages for Enterprise Linux 5 - $basearch #baseurl=http://download.fedoraproject.org/pub/epel/5/$basearch mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-5&arch=$basearch failovermethod=priority enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL [epel-debuginfo] name=Extra Packages for Enterprise Linux 5 - $basearch - Debug #baseurl=http://download.fedoraproject.org/pub/epel/5/$basearch/debug mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-debug-5&arch=$basearch failovermethod=priority enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL gpgcheck=1 [epel-source] name=Extra Packages for Enterprise Linux 5 - $basearch - Source #baseurl=http://download.fedoraproject.org/pub/epel/5/SRPMS mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-source-5&arch=$basearch failovermethod=priority enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL gpgcheck=1
create file
/etc/yum.repos.d/elastix.repo
[elastix-base] name=Base RPM Repository for Elastix mirrorlist=http://mirror.elastix.org/?release=2&arch=$basearch&repo=base #baseurl=http://repo.elastix.org/elastix/2/base/$basearch/ gpgcheck=1 enabled=1 gpgkey=http://repo.elastix.org/elastix/RPM-GPG-KEY-Elastix [elastix-updates] name=Updates RPM Repository for Elastix mirrorlist=http://mirror.elastix.org/?release=2&arch=$basearch&repo=updates #baseurl=http://repo.elastix.org/elastix/2/updates/$basearch/ gpgcheck=1 enabled=1 gpgkey=http://repo.elastix.org/elastix/RPM-GPG-KEY-Elastix [elastix-beta] name=Beta RPM Repository for Elastix mirrorlist=http://mirror.elastix.org/?release=2&arch=$basearch&repo=beta #baseurl=http://repo.elastix.org/elastix/2/beta/$basearch/ gpgcheck=1 enabled=0 gpgkey=http://repo.elastix.org/elastix/RPM-GPG-KEY-Elastix [elastix-extras] name=Extras RPM Repository for Elastix mirrorlist=http://mirror.elastix.org/?release=2&arch=$basearch&repo=extras #baseurl=http://repo.elastix.org/elastix/2/extras/$basearch/ gpgcheck=1 enabled=1 gpgkey=http://repo.elastix.org/elastix/RPM-GPG-KEY-Elastix
import the required keys:
rpm --import http://repo.elastix.org/elastix/RPM-GPG-KEY-Elastix rpm --import http://fedoraproject.org/static/217521F6.txt
Now comes the tricky part. The mISDN modules from elastix require an older kernel than the current from centos. This might change in the future but for me, right now, this is the case.
Find oud the most recent mISDN version:
yum deplist mISDN | grep "package:"
This will give you a list of mISDN versions currently known to yum. Write don’t the most recent one.
package: mISDN-modules.i686 1.1.9.1-2
package: mISDN-modules.i686 1.1.9.1-1.2.6.18_164.6.1.el5
package: mISDN-modules.i686 1.1.9.1-1.2.6.18_194.el5
package: mISDN-modules.i686 1.1.9.1-1.2.6.18_164.el5
package: mISDN-modules.i686 1.1.9.1-1.2.6.18_164.11.1.el5
package: mISDN-modules.i686 1.1.9.1-1.2.6.18_238.12.1.el5
package: mISDN-modules.i686 1.1.9.1-1.2.6.18_194.3.1.el5
In this case mISDN-modules.i686 1.1.9.1-2
.
So check for the kernel of this version:
yum deplist mISDN-modules-1.1.9.1-2
Note the different syntax on the version! You need to specify mISDN-$VERSION
and without the i686
identifier!
package: mISDN-modules.i686 1.1.9.1-2
dependency: kernel = 2.6.18-238.12.1.el5
provider: kernel-PAE.i686 2.6.18-348.el5
provider: kernel-debug.i686 2.6.18-348.el5
provider: kernel-xen.i686 2.6.18-348.el5
provider: kernel.i686 2.6.18-348.el5
provider: kernel-xen.i686 2.6.18-194.3.1.el5
provider: kernel.i686 2.6.18-164.11.1.el5
provider: kernel.i686 2.6.18-194.el5
provider: kernel-xen.i686 2.6.18-164.6.1.el5
provider: kernel.i686 2.6.18-238.12.1.el5
provider: kernel.i686 2.6.18-194.3.1.el5
provider: kernel-xen.i686 2.6.18-194.el5
provider: kernel-xen.i686 2.6.18-238.12.1.el5
provider: kernel-xen.i686 2.6.18-164.11.1.el5
provider: kernel.i686 2.6.18-164.6.1.el5
dependency: mISDN >= 1.1.9.1
provider: mISDN.i686 1.1.9.1-0
provider: mISDN.i686 1.1.9.1-2
dependency: module-init-tools
provider: module-init-tools.i386 3.3-0.pre3.1.60.el5_5.1
dependency: /bin/sh
provider: bash.i386 3.2-32.el5
The required kernel is 2.6.18-238.12.1.el5
. So we need to install it:
yum install kernel-2.6.18-238.12.1.el5
Depending on your setup you need to use “yum downgrade kernel 2.6.18-238.12.1.el5” instead.
Check if the kernel is installed:
yum list "*kernel*"
In my case:
Installed Packages
kernel.i686 2.6.18-238.12.1.el5 installed
kernel-PAE.i686 2.6.18-348.el5 installed
Available Packages
kernel.i686 2.6.18-348.el5 base
kernel-PAE-devel.i686 2.6.18-348.el5 base
kernel-debug.i686 2.6.18-348.el5 base
…
So I got one that I don’t want (kernel-PAE.i686 2.6.18-348.el5) and one possible upgrade which must not be installed!
Removing the kernel is easy. But be careful not to uninstall the wrong one!
rpm -e kernel-PAE-2.6.18-348.el5
Checking the file /boot/grub/menu.lst
shows only one kernel now, the correct one!
Now we can install mISDN and asterisk.
yum install libxslt
yum install asterisk-mISDN mISDN
One possible way out of this update mess is to disable the original centos repositories and rely only on the elastix sources.
Now reboot
reboot
mISDN setup
Scan for your mISDN card:
/etc/init.d/mISDN scan
You should get something like:
1 mISDN compatible device(s) found:
>> avmfritz
Now store that configuration:
/etc/init.d/mISDN config
Not check the config file /etc/mISDN.conf
if this is really your configuration. Depends on what setup you have. Maybe you need to change it.
This should give you something like:
-- Loading mISDN modules --
>> /sbin/modprobe --ignore-install capi
>> /sbin/modprobe --ignore-install mISDN_core debug=0
>> /sbin/modprobe --ignore-install mISDN_l1 debug=0
>> /sbin/modprobe --ignore-install mISDN_l2 debug=0
>> /sbin/modprobe --ignore-install l3udss1 debug=0
>> /sbin/modprobe --ignore-install mISDN_capi
>> /sbin/modprobe --ignore-install avmfritz protocol=0x2 layermask=0xf
>> /sbin/modprobe --ignore-install mISDN_dsp debug=0 options=0
And activate on boot:
chkconfig mISDN on
chkconfig --list mISDN
Now you should be able to see the card in action:
misdnportinfo
For me:
Port 1: TE-mode BRI S/T interface line (for phone lines)
-> Interface is Poin-To-Point.
-> Protocol: DSS1 (Euro ISDN)
-> childcnt: 2
--------
mISDN_close: fid(3) isize(131072) inbuf(0x8cec060) irp(0x8cec060) iend(0x8cec060)
Now we need to re-create the configuration in a different format *sigh*
[code]/usr/sbin/misdn-init config[/code]
And edit the file /etc/misdn-init.conf
to match the content of /etc/mISDN.conf
. For example in my case I had to change from PTMP mode to PTP in both files. Asterisk will read the latter file and use it for its configuration.
Finally edit asterisks own misdn configuration file: /etc/asterisk/misdn.conf
Check the section “[intern]” near the end of the file and remove/rename the section to something like:
[fpstn]
; define your ports, e.g. 1,2 (depends on mISDN-driver loading order)
ports=1,2
; context where to go to when incoming Call on one of the above ports
context=from-pstn
msns=*
Again this depends heavly on your setup. Important is that the section is named [fpstn] and “context=from-pstn” since we need that later.
asterisk setup
After some hours of googling and trial&error I finally came up with some useful resources on the net:
At https://confluence.terena.org/pages/viewpage.action?pageId=131104 there is quite a good explanation of how to set up an asterisk VOIP gateway (SIP trunk). Still with some issues but it was a pretty good base. Also it did not use mISDN.
Asterisk had to be configured to provide a SIP user (the trunk). So replace the file “/etc/asterisk/sip.conf” with the following content:
[general]
context=guest ; Default context for incoming calls (non authenticated)
disallow=all ; First disallow all codecs
;allow=g729
allow=gsm
allow=alaw
allow=ulaw
language=en ; Default language setting for all users/peers
localnet=192.168.0.0/255.255.0.0; All RFC 1918 addresses are local networks
localnet=10.0.0.0/255.0.0.0 ; Also RFC1918
localnet=172.20.0.0/255.255.0.0 ; Another RFC1918 with CIDR notation
localnet=169.254.0.0/255.255.0.0 ;Zero conf local network
jbenable=yes
jbforce=yes
jbimpl = fixed
[600]
username=600
secret=somesecret600
type=friend
host=dynamic
context=sip
insecure=port,invite
This is a quite short configuration, but we only need one account for starface to hook up to the asterisk server. You should change the secret of course. The “insecure=port,invite” was necessary since asterisk otherwise rejected the starface pbx when making calls, although the initial registration using the username and password was successful. In pre-1.8 versions of asterisk this was “insecure=very”, but this is not working anymore.
So now we have two parts in the asterisk box, an mISDN trunk and a SIP account which will act as a trunk. Now we need to pass calls between them. Therefore we configure some dialplans in the “/etc/asterisk/extensions.conf”:
[general]
static=yes
writeprotect=yes
[from-pstn]
exten => _1234.,1,Dial(SIP/600/${EXTEN})
[sip]
exten => _0.,1,Dial(misdn/g:fpstn/${EXTEN})
So everthing that comes in using ISDN (from-pstn) will be directed to the SIP account 600 passing on the original number so that starface can use it. The rule “_1234.” must be adapted to match your telephone number.
Also everything that comes from the SIP account (starface) and starts with a zero will be sent to ISDN.
Tweaking the rules will be a task, then everybody needs something different here I guess.
Finally re-start asterisk:
/etc/init.d/asterisk restart
starface
Setting up Starface was the real easy part. Get the ISO image, install into the KVM server (Ubuntu 12.04 using KVM as virtualization). Starface officially supports only vmware, but is still based on Linux. I had to use “pcnet” as network interface and “sata” for the disk since the “virtio” module won’t work with Starface. Room for improvement ;-)
Installing Starface was simply booting from the ISO image and installing to the disk. The SIP trunk could now easly be added using the following settings:
- Create a new line
- Select “new” as provider
- Use the following provider settings (leave other settings to default):
- host=<your-sip-trunk-ip>
- Enter the username and password from above (600, somesecret600)
setting up starface
This is pretty straight forward now. Provision your phone. Setup a number. And make a call!
Some checks
SIP peers
Check if starface registeres with your sip trunk using the asterisk command line on the gateway:
asterisk -r
sip show peers
SIP Debugging
SIP Debugging can be enabled using the asterisk command sip set debug on
.
Turn on the full log
Edit /etc/asterisk/logger.conf
and comment in the full
line