A basic VoIP service configuration is fast, easy and straight-forward. Provided that your network and required DNS records have been preconfigured, the configuration of a VoIP service can be done purely via the administrative web interface. The configuration mainly includes the following steps:
Let us assume you are using the 1.2.3.4 IP address with an associated sip.yourdomain.com domain to provision VoIP services. This allows you to provide an easy-to-remember domain name instead of the IP address as the proxy server. Also, your subscribers' URIs will look like 1234567@sip.yourdomain.com.
tip | |
Using an IP address instead of an associated FQDN (domain name) for a SIP domain is not suggested as it could add extra administrative work if you decide to relocate your servers to another datacenter or just change IP addresses. |
Go to the Administrative Web Panel (Admin Panel) running on https://<ip>:1443/login/admin and follow the steps below. The default web panel user and password are administrator, if you have not already changed it.
A SIP domain is a connection point for your subscribers. The SIP domain also contains specific default configuration for all its subscribers.
tip | |
Thoroughly plan your domain names policy in advance and take into account that: 1) the name of a SIP domain cannot be changed after creating it in the administrative web panel; 2) subscribers cannot be moved from one domain to another and must be recreated. |
To create a SIP domain, follow these steps:
Firstly, configure an FQDN on your DNS server for it.
The domain name must point to the physical IP address you are going to use for providing the VoIP service. A good approach is to create an SRV record:
SIP via UDP on port 5060 SIP via TCP on port 5060 SIP via TCP/TLS on port 5061
Create a new SIP domain in the administrative web panel.
Go to the Domains page and create a new SIP Domain using the FQDN created above.
Select a Reseller who will own the subscribers in this SIP domain. Use the default virtual reseller if you provide services directly. Enter your SIP domain name and press Save.
You can create multiple SIP domains reusing the existing IP address or adding a new one. Extra SIP domains are required e.g., if you would like to host a virtual operator on your platform, create separate domains for providing services in different countries or just offer a new service.
A Customer is a special type of contract acting as legal and billing information container for SIP subscribers. A customer can have one or more SIP subscriber entities that represent SIP lines.
tip | |
For correct billing, notification and invoicing, create a customer with a single SIP subscriber for the residential service (as it normally has only one telephone line) and a customer with multiple SIP subscribers to provide a service to a company with many telephone lines. |
To create a Customer, go to Settings→Customers.
Click on Create Customer.
Each Customer has a Contact — a container for the personal and legal information that identifies a private or corporate customer.
tip | |
Create a dedicated Contact for every Customer as it contains specific data e.g., name, address and IBAN that identifies this customer. |
Click on Create Contact to create a new Contact.
Select the required Reseller and enter the contact details (at least an Email is required), then press Save.
You will be redirected back to the Customer form. The newly created Contact is selected by default now, so only select a Billing Profile and press Save.
You will now see your first Customer in the list. Hover over the customer and click Details to make extra configuration if necessary.
In your Customer details view, click on the Subscribers row, then click Create Subscriber.
Select a SIP Domain created earlier and specify required and optional parameters:
tip | |
This number can actually be used to place calls between local subscribers, even if you don’t have any PSTN interconnection. This comes in handy if you use phones instead of soft-clients for your tests. The format in which this number can be dialled, so the subscriber is reached is defined in Section 5.7, “Configuring Rewrite Rule Sets”. |
important | |
NGCP allows a single subscriber to have multiple E.164 numbers to be used as aliases for receiving incoming calls. Also, NGCP supports so-called "implicit" extensions. If a subscriber has phone number 012345, but somebody calls 012345100, then NGCP first tries to send the call to number 012345100 (even though the user is registered as 012345). If NGCP then receives the 404 - Not Found response, it falls back to 012345 (the user-part with which the callee is registered). |
caution | |
The web username needs to be unique. The system will return a fault if you try to use the same web username twice. |
Repeat the creation of Customers and Subscribers for all your test accounts. You should have at least 3 subscribers to test the functionality of the NGCP.
tip | |
At this point, you’re able to register your subscribers to the NGCP and place calls between these subscribers. |
You should now revise the Domain and Subscriber Preferences.
The Domain Preferences are the default settings for Subscriber Preferences, so you should set proper values there if you don’t want to configure each subscriber separately. You can later override these settings in the Subscriber Preferences if particular subscribers need special settings. To configure your Domain Preferences, go to Settings→Domains and click on the Preferences button of the domain you want to configure.
The most important settings are in the Number Manipulations group.
Here you can configure the following:
To assign a Rewrite Rule Set to a Domain, create a set first as described in Section 5.7, “Configuring Rewrite Rule Sets”, then assign it to the domain by editing the rewrite_rule_set preference.
Select the Rewrite Rule Set and press Save.
Then, select the field you want the User Provided Number to be taken from for inbound INVITE messages. Usually the From-Username should be fine, but you can also take it from the Display-Name of the From-Header, and other options are available as well.
You can override the Domain Preferences on a subscriber basis as well. Also, there are Subscriber Preferences which don’t have a default value in the Domain Preferences.
To configure your Subscriber, go to Settings→Subscribers and click Details on the row of your subscriber. There, click on the Preferences button on top.
You want to look into the Number Manipulations and Access Restrictions options in particular, which control what is used as user-provided and network-provided calling numbers.
info | |
Subscribers preference allowed_clis will be synchronized with subscribers primary number and aliases if ossbss→provisioning→auto_allow_cli is set to 1 in /etc/ngcp-config/config.yml. |
info | |
Subscribers preference cli will be synchronized with subscribers primary number if ossbss→provisioning→auto_sync_cli is set to yes in /etc/ngcp-config/config.yml. |
If you want to terminate calls at or allow calls from 3rd party systems (e.g. PSTN gateways, SIP trunks), you need to create SIP peerings for that. To do so, go to Settings→Peerings. There you can add peering groups, and for each peering group add peering servers and rules controlling which calls are routed over these groups. Every peering group needs a peering contract for correct interconnection billing.
Click on Create Peering Group to create a new group.
In order to create a group, you must select a peering contract. You will most likely want to create one contract per peering group.
Click on Create Contract create a Contact, then select a Billing Profile.
Click Save on the Contacts form, and you will get redirected back to the form for creating the actual Peering Group. Put a name, priority and description there, for example:
test group
1
peering to a test carrier
The Priority option defines which Peering Group to favor (Priority 1 gives the highest precedence) if two peering groups have peering rules matching an outbound call. Peering Rules are described below.
Then click Save to create the group.
In the group created before, you need to add peering servers to route calls to and receive calls from. To do so, click on Details on the row of your new group in your peering group list.
To add your first Peering Server, click on the Create Peering Server button.
In this example, we will create a peering server with IP 2.3.4.5 and port 5060:
test-gw-1
2.3.4.5
5060
UDP
1
None
Click Save to create the peering server.
tip | |
The hostname field for a peering server is optional. Usually, the IP address of the peer is used as the domain part of the Request URI. Fill in this field if a peer requires a particular hostname instead of the IP address. The IP address must always be given though as the request will always be sent to the specified IP address, no matter what you put into the hostname field. |
tip | |
If you want to add a peering server with an IPv6 address, enter the address without surrounding square brackets into the IP Address column, e.g. ::1. |
You can force an additional hop (e.g. via an external SBC) towards the peering server by using the Via Route option. The available options you can select there are defined in /etc/ngcp-config/config.yml
, where you can add an array of SIP URIs in kamailio
→lb
→external_sbc
like this:
kamailio: lb: external_sbc: - sip:192.168.0.1:5060 - sip:192.168.0.2:5060
Execute ngcpcfg apply added external sbc gateways
, then edit your peering server and select the hop from the Via Route selection.
Once a peering server has been created, this server can already send calls to the system.
important | |
To be able to send outbound calls towards the servers in the Peering Group, you also need to define Outbound Peering Rules. They specify which source and destination numbers are going to be terminated over this group. To create a rule, click the Create Outbound Peering Rule button. |
Since the previously created peering group will be the only one in our example, we have to add a default rule to route all calls via this group. To do so, create a new peering rule with the following values:
Default Rule
Then click Save to add the rule to your group.
tip | |
In contrast to the callee/caller pattern, the callee prefix has a regular alphanumeric string and can not contain any regular expression. |
tip | |
If you set the caller or callee rules to refine what is routed via this peer, enter all phone numbers in full E.164 format, that is <cc><ac><sn>. |
tip | |
The Caller Pattern field covers the whole URI including the subscriber domain, so you can only allow certain domains over this peer by putting for example |
Starting from mr5.0 release, Sipwise NGCP supports filtering SIP INVITE requests sent by SIP peers. The system administrator may define one or more matching rules for SIP URIs that are present in the headers of SIP INVITE requests, and select which SIP header (or part of the header) must match the pattern declared in the rule.
If the incoming SIP INVITE message has the proper headers, NGCP will accept and further process the request. If the message does not match the rule it will be rejected.
caution | |
An incoming SIP INVITE message must match all the inbound peering rules so that NGCP does not reject the request. |
In order to create an inbound peering rule you have to select a peering group, press Details and then press Create Inbound Peering Rule button.
An inbound peering rule has the following properties:
Match Field
: select which header and which part of that header in a SIP INVITE
message will be checked for matching the pattern
Pattern
: a POSIX regular expression that defines the accepted value of a header;
example: ^sip:.+@example\.org$
— this will match a SIP URI that contains "example.org"
in the domain part
Reject code
: optional; a SIP status code that will be sent as a response to
an INVITE request that does not match the pattern; example: 403
Reject reason
: optional; an arbitrary text that will be included in the SIP
response sent with the reject code
Enabled
: a flag to enable / disable the particular inbound peering rule
info | |
Both of the properties |
When all settings for a peering group are done the details of the group look like:
The selection of peering groups and peering servers for outgoing calls is done in the following way:
All peering groups that meet the following criteria configured in the outbound peering rule are added to the list of routes for a particular call:
Peering groups with the same callee prefix length are further ordered by Priority. Peering group(s) with the higher priorities will occupy higher positions.
important | |
Priority 1 gives the highest precedence to the corresponding peering group. Hence, a lower priority value will put the peering group higher in the list of routes (compared to other peering groups with the same callee prefix length). |
Priority can be selected from 1 (highest) to 9 (lowest).
All peering servers in the peering group with the highest priority (e.g. priority 1) are tried one-by-one starting from the highest server weight. Peering groups with lower priorities or with shorter callee prefix will be used only for fail-over.
The weight of the peering servers in the selected peering group will influence the order in which the servers within the group will be tried for routing the outbound call. The weight of a server can be set in the range from 1 to 127.
important | |
Opposite to the peering group priority, a peering server with a higher weight value has a higher precedence, but the server weight rather sets a probability than a strict order. E.g. although a peering server with weight 127 has the highest chance to be the first in the list of routes, another server with a lower weight (e.g. 100) sometimes will be selected first. |
In order to find out this probability knowing the weights of peering servers, use the following script:
#!/usr/bin/php <?php // This script can be used to find out actual probabilities // that correspond to a list of peering weights. if ($argc < 2) { echo "Usage: lcr_weight_test.php <list of weights (integers 1-254)>\n"; exit; } $iters = 10000; $rands = array(); for ($i = 1; $i <= $iters; $i++) { $elem = array(); for ($j = 1; $j < $argc; $j++) { $elem["$j"] = $argv[$j] * (rand() >> 8); } $rands[] = $elem; } $sorted = array(); foreach ($rands as $rand) { asort($rand); $sorted[] = $rand; } $counts = array(); for ($j = 1; $j < $argc; $j++) { $counts["$j"] = 0; } foreach ($sorted as $rand) { end($rand); $counts[key($rand)]++; } for ($j = 1; $j < $argc; $j++) { echo "Peer with weight " . $argv[$j] . " has probability " . $counts["$j"]/$iters . "\n"; } ?>
Let us say you have 2 peering servers, one with weight 1 and another with weight 2. At the end — running the script as below — you will have the following traffic distribution:
# lcr_weight_test.php 1 2 Peer with weight 1 has probability 0.2522 Peer with weight 2 has probability 0.7478
If a peering server replies with SIP codes 408
, 500
or 503
, or if a peering
server doesn’t respond at all, the next peering server in the current peering group
is tried as a fallback. All the servers within the group are tried one after another
until the call succeeds. If no more servers are left in the current peering group,
the next group which matches the outbound peering rules is used.
info | |
The Sipwise NGCP may use a slightly different approach in selecting the appropriate peering server if the peer probing feature is enabled. See the details in Section 6.10, “Peer Probing” of the handbook. |
The default call routing uses statically configured peering group priorities to decide where to send the calls. This solution is useful when you have an external SBC that makes all the routing decisions and is described in the Routing Order Selection section. Sipwise C5 also allows you routing calls to the cheapest SIP peers saving your termination cost.
To enable LCR routing, do the following:
When the LCR routing is enabled, the selection of peering groups would be the following:
All peering groups that meet the following criteria configured in the outbound peering rule are added to the list of routes for a particular call (for pure LCR you might want to omit these filters leaving them blank):
The platform will first route the call to the servers of the first peering group in this list. If no peering server can terminate the call, the call would fail-over to the second peering group from the list and so on.
info | |
The peering servers in every peering group are sorted and tried according to their weight as described in the previous section. |
Let us consider a short example. There are two peering groups (PG1 and PG2) that can deliver calls to New York (e.g. 12121234567) and they have the following rates:
Peering Group | Prefix | Cost | Description |
---|---|---|---|
PG1 | 1 | 0.02 | USA & Canada |
PG2 | 1 | 0.05 | USA & Canada |
1212 | 0.03 | New York, USA |
PG1 has only one rate that matches the dialed number, so that it will be taken into account, PG2 has two rates and the longest will be selected. The call will be routed to PG1 servers first as it has a cheaper price and can fail-over to PG2 servers.
The Sipwise C5 LCR feature together with the codec filtering, media transcoding, header manipulations, SIP, and RTP encryption and other SBC features make an external SBC unnecessary. This simplifies your VoIP network and cuts deployment and operation costs.
If a peering server requires the sip:provider PRO to authenticate for outbound calls (by sending a 407 as response to an INVITE), then you have to configure the authentication details in the Preferences view of your peer host.
To configure this setting, open the Remote Authentication tab and edit the following three preferences:
<username for peer auth>
<password for peer auth>
<domain for peer auth>
important | |
If you do NOT authenticate against a peer host, then the caller CLI is put into the |
tip | |
You will notice that these three preferences are also shown in the Subscriber Preferences for each subscriber. There you can override the authentication details for all peer host if needed, e.g. if every user authenticates with his own separate credentials at your peering provider. |
tip | |
If peer_auth_realm is set, the system may overwrite the Request-URI with the peer_auth_realm value of the peer when sending the call to that peer or peer_auth_realm value of the subscriber when sending a call to the subscriber. Since this is rarely a desired behavior, it is disabled by default starting with NGCP release 3.2. If you need the replacement, you should set set_ruri_to_peer_auth_realm: 'yes' in /etc/ngcp-config/config.yml. |
Unfortunately, the credentials configured above are not yet automatically used to register the sip:provider PRO at your peer hosts. There is however an easy manual way to do so, until this is addressed.
Configure your peering servers with the corresponding credentials in /etc/ngcp-config/templates/etc/ngcp-sems/etc/reg_agent.conf.tt2, then execute ngcpcfg apply 'added upstream credentials'.
important | |
Be aware that this will force SEMS to restart, which will drop running conference calls. |
On the NGCP, every phone number is treated in E.164 format <country code><area code><subscriber number>. Rewrite Rule Sets is a flexible tool to translate the caller and callee numbers to the proper format before the routing lookup and after the routing lookup separately. The created Rewrite Rule Sets can be assigned to the domains, subscribers and peers as a preference. Here below you can see how the Rewrite Rules are used by the system:
As from the image above, following the arrows, you will have an idea about which type of Rewrite Rules are applied during a call. In general:
You would normally begin with creating a Rewrite Rule Set for your SIP domains. This is used to control what an end user can dial for outbound calls, and what is displayed as the calling party on inbound calls. The subscribers within a domain inherit Rewrite Rule Sets of that domain, unless this is overridden by a subscriber Rewrite Rule Set preference.
You can use several special variables in the Rewrite Rules, below you can find a list of them. Some examples of how to use them are also provided in the following sections:
${caller_cc}
: This is the value taken from the subscriber’s preference CC value under Number Manipulation
${caller_ac}
: This is the value taken from the subscriber’s preference AC value under Number Manipulation
${caller_emergency_cli}
: This is the value taken from the subscriber’s preference emergency_cli value under Number Manipulation
${caller_emergency_prefix}
: This is the value taken from the subscriber’s preference emergency_prefix value under Number Manipulation
${caller_emergency_suffix}
: This is the value taken from the subscriber’s preference emergency_suffix value under Number Manipulation
${caller_cloud_pbx_base_cli}
:This is the value taken from the Primary Number field from section Details → Master Data of the Pilot Subscriber for a particular PBX customer.
To create a new Rewrite Rule Set, go to Settings→Rewrite Rule Sets. There you can create a Set identified by a name. This name is later shown in your peer-, domain- and user-preferences where you can select the rule set you want to use.
Click Create Rewrite Rule Set and fill in the form accordingly.
Press the Save button to create the set.
To view the Rewrite Rules within a set, hover over the row and click the Rules button.
The rules are ordered by Caller and Callee as well as direction Inbound and Outbound.
tip | |
In Europe, the following formats are widely accepted: +<cc><ac><sn>, 00<cc><ac><sn> and 0<ac><sn>. Also, some countries allow the areacode-internal calls where only subscriber number is dialed to reach another number in the same area. Within this section, we will use these formats to show how to use rewrite rules to normalize and denormalize number formats. |
These rules are used to normalize user-provided numbers (e.g. passed in From Display Name or P-Preferred-Identity headers) into E.164 format. In our example, we’ll normalize the three different formats mentioned above into E.164 format.
To create the following rules, click on the Create Rewrite Rule for each of them and fill them with the values provided below.
Strip leading 00
or +
^(00|\+)([1-9][0-9]+)$
\2
International to E.164
Inbound
Caller
Replace 0
by caller’s country code:
^0([1-9][0-9]+)$
${caller_cc}\1
National to E.164
Inbound
Caller
Normalize local calls:
^([1-9][0-9]+)$
${caller_cc}${caller_ac}\1
Local to E.164
Inbound
Caller
Normalization for national and local calls is possible with special variables ${caller_cc}
and ${caller_ac}
that can be used in Replacement Pattern and are substituted by the country and area code accordingly during the call routing.
important | |
These variables are only being filled in when a call originates from a subscriber (because only then the cc/ac information is known by the system), so you can not use them when a calls comes from a SIP peer (the variables will be just empty in this case). |
tip | |
When routing a call, the rewrite processing is stopped after the first match of a rule, starting from top to bottom. If you have two rules (e.g. a generic one and a more specific one), where both of them would match some numbers, reorder them with the up/down arrows into the appropriate position. |
These rules are used to rewrite the number the end user dials to place a call to a standard format for routing lookup. In our example, we again allow the three different formats mentioned above and again normalize them to E.164, so we put in the same rules as for the caller.
Strip leading 00
or +
^(00|\+)([1-9][0-9]+)$
\2
International to E.164
Inbound
Callee
Replace 0
by caller’s country code:
^0([1-9][0-9]+)$
${caller_cc}\1
National to E.164
Inbound
Callee
Normalize areacode-internal calls:
^([1-9][0-9]+)$
${caller_cc}${caller_ac}\1
Local to E.164
Inbound
Callee
tip | |
Our provided rules will only match if the caller dials a numeric number. If he dials an alphanumeric SIP URI, none of our rules will match and no rewriting will be done. You can however define rules for that as well. For example, you could allow your end users to dial |
These rules are used to rewrite the calling party number for a call to an end user. For example, if you want the device of your end user to show 0<ac><sn> if a national number calls this user, and 00<cc><ac><sn> if an international number calls, put the following rules there.
Replace Austrian country code 43
by 0
^43([1-9][0-9]+)$
0\1
E.164 to Austria National
Outbound
Caller
Prefix 00
for international caller
^([1-9][0-9]+)$
00\1
E.164 to International
Outbound
Caller
tip | |
Note that both of the rules would match a number starting with |
These rules are used to rewrite the called party number immediately before sending out the call on the network. This gives you an extra flexibility by controlling the way request appears on a wire, when your SBC or other device expects the called party number to have a particular tech-prefix. It can be used on calls to end users too if you want to do some processing in intermediate SIP device, e.g. apply legal intercept selectively to some subscribers.
Prefix sipsp#
for all calls
^([0-9]+)$
sipsp#\1
Intercept this call
Outbound
Callee
There are 2 ways to handle calls from local subscribers to emergency numbers in NGCP:
The overview of emergency call processing is as follows:
Configuring Emergency Numbers is also done via Rewrite Rules.
For Emergency Calls from a subscriber to the platform, you need to define an Inbound Rewrite Rule For Callee, which
adds a prefix emergency_
to the number (and can rewrite the number completely as well at the same time). If the proxy
detects a call to a SIP URI starting with emergency_
, it will enter a special routing logic bypassing various checks
which might make a normal call fail (e.g. due to locked or blocked numbers, insufficient credits or exceeding the max. amount
of parallel calls).
Tag an Emergency Call
^(911|112)$
emergency_\1
Tag Emergency Numbers
Inbound
Callee
To route an Emergency Call to a Peer, you can select a specific peering group by adding a peering rule with a
callee prefix set to emergency_
to a peering group.
In order to normalize the emergency number to a valid format accepted by the peer, you need to assign an Outbound Rewrite
Rule For Callee, which strips off the emergency_
prefix. You can also use the variables ${caller_emergency_cli}
,
${caller_emergency_prefix}
and ${caller_emergency_suffix}
as well as ${caller_ac}
and ${caller_cc}
, which are all configurable per
subscriber to rewrite the number into a valid format.
Normalize Emergency Call for Peer
^emergency_(.+)$
${caller_emergency_prefix}${caller_ac}\1
Normalize Emergency Numbers
Outbound
Callee
Once you have finished to define your Rewrite Rule Sets, you need to assign them. For sets to be used for subscribers, you can assign them to their corresponding domain, which then acts as default set for all subscribers. To do so, go to Settings→Domains and click Preferences on the domain you want the set to assign to. Click on Edit and select the Rewrite Rule Set created before.
You can do the same in the Preferences of your subscribers to override the rule on a subscriber basis. That way, you can finely control down to an individual user the dial-plan to be used. Go to Settings→Subscribers, click the Details button on the subscriber you want to edit, the click the Preferences button.
For each peering server, you can use one of the Rewrite Rule Sets that was created previously as explained in Section 5.7, “Configuring Rewrite Rule Sets” (keep in mind that special variables ${caller_ac}
and ${caller_cc}
can not be used when the call comes from a peer). To do so, click on the name of the peering server, look for the preference called Rewrite Rule Sets.
If your peering servers don’t send numbers in E.164 format <cc><ac><sn>, you need to create Inbound Rewrite Rules for each peering server to normalize the numbers for caller and callee to this format, e.g. by stripping leading +
or put them from national into E.164 format.
Likewise, if your peering servers don’t accept this format, you need to create Outbound Rewrite Rules for each of them, for example to append a + to the numbers.
The sip:provider PRO provides a utility that helps with the verification of call routing among local subscribers and peers. It is called Call Routing Verification and employs rewrite rules and peer selection rules, in order to process calling and called numbers or SIP users and find the appropriate peer for the destination.
The Call Routing Verification utility performs only basic number processing and does not invoke the full number manipulation logic applied on real calls. The goal is to enable testing of rewrite rules, rather than validate the complete number processing.
What is considered during the test:
cli
and allowed_clis
What is not taken into account during the test:
You can access the utility following the path on Admin web interface: Tools → Call Routing Verification.
Expected input data
Caller number/uri
: 2 formats are accepted in this field:
00431..
, +431..
) or E.164 (431..
) format.
username@domain
format (without adding "sip:" at the beginning).
Callee number/uri
: The same applies as for Caller number/uri
.
Caller Type
: Select Subscriber
or Peer
, depending on the source of the call.
Caller Subscriber
or Caller Peer
: Optionally, you can select the subscriber
or peer explicitly. Without the explicit selection, however, the Call Routing Verification
tool is able to find the caller in the database, based on the provided number / URI.
Caller RWR Override, Callee RWR Override, Callee Peer Override
: The caller /
callee rewrite rules and peer selection rules defined in domain, subscriber and
peer preferences are used for call processing by default. But you can also override
them by explicitly selecting another rewrite or peer selection rule.
Examples
Using only phone numbers and explicit subscriber selection
Using phone number and URI, without explicit subscriber selection