Building A PBX Part 2 — Configuring Incoming & Outgoing Calls

This article is one in a series about building a PBX. If you haven’t already, please check out the first in the series, Building A PBX Part 1 — PBX Hardware.

So now we’re ready to configure our PBX to interact with the global telephone network. This means that anyone in the world can call into our PBX, and we can call out.

Much like needing an ISP to connect a home network to the Internet, we will need a VoIP provider to hook into the telephone network.

There are many VoIP providers out there, but I chose VoIP.ms based on their pricing model. At the time of writing, their most basic plan costs $0.85 USD a month for incoming calls with an additional $0.009 USD per minute, and $0.01 USD per minute for outgoing calls. You can do quite a bit of experimentation with these rates for less than the cost of a cup of coffee. However, you need to note that you can only deposit funds into your account in increments of $25.00, so you will need to invest that much up-front. This initial deposit could last you for years depending on your usage.

After registering an account and depositing funds, log in to the customer portal and go to DID Numbers >> Order DID(s) in order to register a DID (Direct Inward Dialing) number. This number is what everyone will eventually call to access our PBX. The process is relatively simple, allowing you to pick an area code, and even do some searching if you want any of the digits to be in a certain order to spell out a word, or anything like that. Of course, you have to pick from a pool of numbers that aren’t already being used.

After we have our DID number, we need to configure our DID Routing by going to Main Menu >> Account Settings and clicking the DID Routing tab. From here, we can choose a POP server that is physically close to our PBX (for lower latency) and make sure that the Routing is set to SIP/IAX for our main account. When done, hit the ‘Apply All’ button at the bottom of the page. At this point, we can also take a little time to explore all of the options under account settings. Most options can be left as they are, but some like disabling international calls can safe-guard against mis-configurations and higher bills.

Choosing a server through VoIP.ms’ control panel.

Now we need to configure the PBX to actually use VoIP.ms. Log in to FreePBX and go to Connectivity >> Trunks. Here, we will edit the VoIPms trunk that is already pre-configured (minimally) in Incredible PBX. If you don’t have this trunk already, you can press the ‘Add Trunk’ button to create a new one (chan_sip should work just fine if it prompts you). “Trunking” is a method  in telecommunications that lets a system service many clients (like a tree trunk with many branches). From our perspective, this means that many people will be able to call in and interact with our PBX at once.

The Incredible PBX Trunks page.

On the General tab, give the trunk a name and an Outbound CallerID if you’d like (the number others will see calls coming from).

The General tab, under Edit Trunk.

On the Dialed Numbers Manipulation Rules tab, edit the dial patterns so the look like the following:

()  | 1NXXNXXXXXX
(1) | NXXNXXXXXXX
()  | NXXXXXX

The Dialed Number Manipulation Rules tab, under Edit Trunks.

On the sip Settings tab, enter the following configuration using your username (a sip username emailed to you from VoIP.ms, not what you log in with), secret (password you use for VoIP.ms, unless you changed it through their Account Settings), and host (you specified this when you chose a pop server, something like newyork4.voip.ms):

username=YOUR-6-DIGIT-VOIPMS-USERNAME
type=friend
trustrpid=yes
sendrpid=yes
secret=YOUR-VOIPMS-PASSWORD
qualify=yes
nat=yes
insecure=port,invite
host=YOUR-VOIPMS-POP-HOST
fromuser=YOUR-6-DIGIT-VOIPMS-USERNAME-AGAIN
disallow=all
context=from-trunk
canreinvite=nonat
allow=ulaw

The Outgoing tab, under sip Settings, under Edit Trunk.

The sip Settings tab also has a sub-tab for Incoming (you are currently on Outgoing). Click on that tab and enter a register string in the following format:

YOUR-6-DIGIT-VOIPMS-USERNAME:YOUR-VOIPMS-PASSWORD@YOUR-VOIPMS-POP-HOST:5060/YOUR-6-DIGIT-VOIPMS-USERNAME-AGAIN

The Incoming tab, under sip Settings, under Edit Trunk.

Press the ‘Submit’ button when done.

Now go to Connectivity >> Inbound Routes and press the button for ‘Add Inbound Route’. On the General tab, modify Set Destination to IVR (Interactive Voice Response), and choose the DemoIVR. All of the other tabs should have default settings. Press the ‘Submit’ button to save.

The General tab, under Inbound Routes.

 

The Advanced tab, under Inbound Routes.

 

The Privacy tab, under Inbound Routes.

 

The Fax tab, under Inbound Routes.

 

The Other tab, under Inbound Routes.

 

Next, go to Connectivity >> Outbound Routes and press the button for ‘Add Outbound Route’. The settings here will mostly mirror your trunk configuration. On the Route Settings tab, give the route a Route Name, and set the same Route CID you did for the trunk earlier. For the Trunk Sequence for Matched Routes setting, select the VoIPms trunk.

The Route Settings tab, under Outbound Routes.

On the Dial Patterns tab, make sure to use the same dial patterns set for the trunk earlier.

The Dial Patterns tab, under Outbound Routes.

We won’t need to change any settings on the Import/Export Settings or Additional Settings tabs.

The Import/Export Settings tab, under Outbound Routes.

 

The Additional Settings tab, under Outbound Routes.

Finally, press the big red ‘Apply Config’ button at the top right of the page. This will apply the new config and make our trunk/route changes live.

At this point, you should be able to call the DID number you got from VoIP.ms from any phone and have it reach your PBX, which will lead you to an automated menu with a few options. If you don’t get a friendly greeting and a bunch of options you can choose, check your config and see if anything looks incorrect.

We will test the outgoing calling in the next part of this guide when we set up a phone to interact with the PBX!

 

Building A PBX Part 1 — PBX Hardware

I’ve always had some sort of fascination with the telephone system. There is something that excites me about large systems in general, whether it has to do with computer networking, telephony, power, or even the postal service. Phone phreaking sort of plays into this fascination—we learn how the phone network works by poking and prodding until something interesting is discovered.

In 2012 or so, I set up by own PBX (or private branch exchange) using an original 256MB Raspberry Pi model B. The system worked great! I was able to take and place calls, hook in my trusty Western Electric phone, and play around with all of the different features I could figure out. Eventually, the system was powered down and put into a bin, mostly forgotten until earlier this year.

A few months ago I decided to resurrect my trusty PBX by completely recreating the original functionality I attained six years ago, with a few other little additions thrown in. I’ve decided to start this series of guides to document what I’ve been able to figure out (and maybe some stuff I haven’t yet). It’s for you as much as it is for me. Some of the configuration I’ve seen can be cryptic, and documentation disappears from the web constantly. It’s good to keep a set of internal documents if the system ever goes poof and need to be rebuilt. As fun as they may be, I aim to avoid those late nights gazing hopelessly at a console for who-knows-how-many hours while I try to derive some logical solution out of an elusive issue.

If you don’t know what a PBX is, it is easily equatable to a networking switch: the little box on your home network with a bunch of ethernet cables clipped into it. Your network devices communicate with one another through the switch, and possibly with other devices over the Internet if the switch is connected up to a router and modem. A PBX operates in a similar matter, with phones (physical or software-based) connecting to one another through it at a local site or to other phones in the telephone network, all over the world.

I wanted to accomplish a few things with my PBX, so I split functionality out into a few different areas:

1) Create a PBX using a spare Raspberry Pi. (DONE, see part 1. Wait, you’re already there.)
2) Be able to accept incoming calls. (DONE, see part 2)
3) Be able to make outgoing calls. (DONE, see part 2)
4) Connect a physical, touch-tone phone to the PBX. (DONE, see part 3)
5) Connect a physical, rotary phone to the PBX. (DONE, see part 4)

Additionally, I may expand this functionality further. I could hook up some sort of modem, install software on my PC so it can act as a phone, or even run a fax machine (thrilling, I know)!

Being that this is a learning experience, I’m also committed to spending as little money as possible (within reason). With a technology as old as telephony, there are a lot of cheap/used devices out there that can be had in abundance.

So, let’s get started with the PBX setup. Originally, I ran my installation on an older Raspberry Pi model B. It worked great then, but is definitely showing its age as software gets more and more bloated complex. In the world of open-source PBX software, the two big names you will probably hear are FreeSWITCH and Asterisk. People could discuss the pros and cons of each for hours, but for simplicity, I’ve chosen to use Asterisk as my backing system. Asterisk itself is a very old and capable piece of software, but an administrator can only configure it via editing text configuration files. This is a great way to learn the software at a low level, but I prefer to admin the system using FreePBX, a web-based GUI that sits atop Asterisk, for convenience and speed. While you can still run this fairly well on an original Raspberry Pi model B, I’d recommend at least using a Raspberry Pi 2 (like I am) if not something newer. Of course, you will also need a power adapter and a microSD card (16 GB is more than enough)

There are a few distributions that couple Asterisk/FreePBX on the Raspberry Pi, but I will be using the Debian-based Incredible PBX. Installation is easy enough if you have an SD card inserted on an exisiting Linux machine. Just make sure you do fdisk -l to determine the location of your SD card.

$ wget -O incrediblepbx13.13-raspbian8.zip https://downloads.sourceforge.net/project/pbxinaflash/IncrediblePBX13-13%20for%20Raspbian/incrediblepbx13.13-raspbian8.zip?r=https%3A%2F%2Fsourceforge.net%2Fprojects%2Fpbxinaflash%2Ffiles%2FIncrediblePBX13-13%2520for%2520Raspbian%2Fincrediblepbx13.13-raspbian8.zip%2Fdownload&ts=1531600211
$ unzip incrediblepbx13.13-raspbian8.zip
$ sudo dd bs=1m if=incrediblepbx13.13-raspbian8.img of=/dev/disk4

After dd completes, you can pop the SD card into your Raspberry Pi and boot it up.

The Raspberry Pi PBX is online!

Check your router or nmap scan your network to find the IP address of the new RPi machine and visit it in a browser. The FreePBX UI should pop up and allow you to login with admin/admin.

After a successful login, you will be presented with the FreePBX dashboard.