In a traditional PBX, external lines are generally accessed by way of an access code that must be dialed before the number.[69] It is common to use the digit 9 for this purpose.
In Asterisk, it is similarly possible to assign 9 for routing of external calls, but since the Asterisk dialplan is so much more intelligent, it is not really necessary to force your users to dial 9 before placing a call. Typically, you will have an extension range for your system (say, 100–199), and a feature code range (*00 to *99). Anything outside those ranges that matches the dialing pattern for your country or region can be treated as an external call.
If you have one carrier providing all of your external routing, you can handle your external dialing through a few simple pattern matches. The example in this section is valid for the North American Numbering Plan (NANP). If your country is not within the NANP (which serves Canada, the US, and several Caribbean countries), you will need a different pattern match.
The [globals]
section contains two variables, named
LOCAL
and TOLL
.[70] The purpose of these variables is to simplify management of
your dialplan should you ever need to change carriers. They allow you to
make one change to the dialplan that will affect all places where the
specified channel is referred to:
[globals] LOCAL=DAHDI/G0 ; assuming you have a PSTN card in your system TOLL=SIP/YourVoipCarrier ; as defined in sip.conf
The [external]
section contains the actual dialplan code that will recognize the
numbers dialed and pass them to the Dial()
application[71]:
[external] exten => _NXXNXXXXXX,1,Dial(${LOCAL}/${EXTEN}) ; 10-digit pattern match for NANP exten => _NXXXXXX,1,Dial(${LOCAL}/${EXTEN}) ; 7-digit pattern match for NANP exten => _1NXXNXXXXXX,1,Dial(${TOLL}/${EXTEN}) ; Long-distance pattern match for NANP exten => _011.,1,Dial(${TOLL}/${EXTEN}) ; International pattern match for ; calls made from NANP ; This section is functionally the same as the above section. ; It is for people who like to dial '9' before their calls exten => _9NXXNXXXXXX,1,Dial(${LOCAL}/${EXTEN:1}) exten => _9NXXXXXX,1,Dial(${LOCAL}/${EXTEN:1}) exten => _91NXXNXXXXXX,1,Dial(${TOLL}/${EXTEN:1}) exten => _9011.,1,Dial(${TOLL}/${EXTEN:1})
In any context that would be used
by sets or user devices, you would use an include
=> directive to allow access to the
external
context:
[LocalSets] include => external
It is critically important that you do not include access to the external lines in any context that might process an incoming call. The risk here is that a phishing bot could eventually gain access to your outgoing trunks (you’d be surprised at how common these phishing bots are).
We cannot stress enough how important it is that you ensure that no external resource can access your toll lines.
[69] In a key system, each line has a corresponding button on each telephone, and lines are accessed by pressing the desired line key.
[70] You can name these anything you wish. The words “local” and “toll” do not have any built-in meaning to the Asterisk dialplan.
[71] For more information on pattern matches, see Chapter 6, Dialplan Basics.