How to Interconnect Asterisk Servers Using PJSIP
In the world of VoIP communication, interconnecting Asterisk servers is a game-changer for small ISPs, businesses, or remote offices looking to build scalable phone systems. As someone who works daily with Asterisk for VoIP set-ups, I've seen how this open-source PBX can transform a simple server into a powerful trunk provider - and also a money maker. Whether you're providing SIP trunks to customers or would like to link branch offices seamlessly, this guide walks you through using Asterisk PJSIP configuration and dial-plan logic to create reliable interconnections. We'll cover everything from basics to hands-on set-up, optimized for VoIP trunking and SIP endpoint management.
If you're searching for "how to set up Asterisk trunks" or "PJSIP interconnection tutorial," you've come to the right place. Let's dive in and make your Asterisk server interconnection straightforward and efficient.
What is Asterisk?
Asterisk is the world's leading open-source software for building communications applications, often called the Swiss Army knife of telephony as it comes with really a lot of features. From simple telephony softswitch to a complex media handling in a SBC, Asterisk is just amazing. Developed by Digium (now part of Sangoma), it powers companies from simple PBXs to complex call centers. Nevertheless Asterisk handles voice calls, video, and messaging over IP networks, making it ideal for VoIP server setups.
Why choose Asterisk for interconnecting servers? It's free, highly customizable, and supports modern protocols like PJSIP—a lightweight, standards-compliant SIP stack that's replaced the older chan_sip module. PJSIP offers better performance, NAT traversal, and security features, perfect for SIP trunk provisioning in distributed environments. In a small ISP scenario, like the one I work in, Asterisk lets you act as a central hub, routing calls between customer endpoints and external providers without breaking a sweat.
For those new to telephony, think of Asterisk as the brain behind your phone system: it processes incoming calls, applies rules via dialplans, and bridges connections across networks.
Understanding Trunks
In telephony, a trunk refers to a communication pathway capable of handling multiple simultaneous calls - like an highway for phone calls. Historically, trunks were physical lines like E1 in Europe or T1 in the US, managed by telecom giants such as France Telecom (now Orange). These could carry dozens of channels, forming the core of traditional PSTN networks. Of course, with time, things thankfully changed.
With the rise of the internet, VoIP revolutionized this. Trunks evolved into virtual connections using IP protocols, allowing unlimited scalability at a fraction of the cost. In Asterisk trunk configuration, a trunk is essentially a logical link between your server and another endpoint, like a remote office or customer PBX. This setup enables seamless Asterisk interconnections, where calls flow bidirectionally without quality loss.
Key benefits for VoIP trunking:
- Cost Savings: No need for expensive hardware; just IP bandwidth.
- Scalability: Handle 10 or 10,000 calls by adding server resources.
- Flexibility: Route calls based on rules, like time of day or caller ID.
If you're optimizing for "Asterisk SIP trunk setup," trunks are your starting point for reliable, multi-site VoIP deployments.
What is SIP? The Protocol Powering Modern VoIP
SIP, or Session Initiation Protocol, is the standard (RFC 3261) for initiating, maintaining, and terminating real-time sessions in VoIP. Pronounced "sip," it's a protocol that sets up a phone call over the internet. SIP handles signalling—think invitations, acceptances, and goodbyes—while leaving the actual voice data to other protocols.
In PJSIP for Asterisk, SIP is implemented efficiently for server-to-server interconnections. For example, when two Asterisk servers connect via a trunk, SIP messages negotiate the call parameters, such as codecs and endpoints. Common SIP methods include INVITE (to start a call), ACK (to confirm), and BYE (to end it).
What is Media? Handling the Audio in Your Calls
It's not easy in the first time to understand what is "Media" in VoIP. As explained before, SIP is a signalling protocol and does not handle media (voice, video, etc.). Asterisk can seamlessly handle media with SIP. While SIP manages the "who" and "when" of a call, media is the actual content—the voice, video, or data streams. In VoIP, media travels via RTP (Real-time Transport Protocol) over UDP, separate from SIP signalling for efficiency. Codecs like G.711 (high-quality, bandwidth-heavy) or Opus (adaptive, low-latency) compress and transmit this data.
In Asterisk media handling, you configure trunks to bridge media streams securely, often using RTPEngine for NAT traversal in interconnected setups. Without proper media routing, calls might suffer from one-way audio or jitter—common pitfalls in multi-server VoIP architectures.
Pro tip: For optimal Asterisk PJSIP media setup, enable direct media (re-INVITE) between endpoints to bypass the server, saving CPU and bandwidth in large-scale trunks.
Step-by-Step: Configure a Trunk in Asterisk for Interconnections
Now, let's get practical. We'll configure two Asterisk servers: Server A (your main ISP hub, acting as the remote endpoint) and Server B (a customer or branch office PBX). This PJSIP trunk tutorial assumes Asterisk 16+ with PJSIP enabled (check via module show like pjsip in CLI).
Prerequisites for Successful Setup
- Both servers on stable networks with public IPs or STUN/TURN for NAT.
- Firewall ports open: 5060 UDP/TCP (SIP), 10000-20000 UDP (RTP media).
- Install PJSIP:
dnf install asterisk-pjsip(CentOS) or equivalent. - Backup configs:
cp /etc/asterisk/pjsip.conf /etc/asterisk/pjsip.conf.bak.
Reload after changes: asterisk -rx "pjsip reload".
Server A: Configuring the Remote Endpoint (ISP Side)
On Server A (e.g., IP: 192.0.2.1), create a trunk to accept connections from Server B. Edit /etc/asterisk/pjsip.conf:
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
[trunk-customer-b]
type=endpoint
transport=transport-udp
context=from-trunk ; Dialplan context for incoming calls
disallow=all
allow=ulaw,alaw,gsm ; Supported codecs for VoIP quality
auth=trunk-customer-b-auth
aors=trunk-customer-b
direct_media=no ; Force media through server for recording/security
[trunk-customer-b-auth]
type=auth
auth_type=userpass
username=trunkuser ; Shared secret with Server B
password=strongpass123
realm=192.0.2.1
[trunk-customer-b-aor]
type=aor
contact=sip:192.0.2.2:5060 ; Server B's IP
This sets up Server A as a secure SIP trunk provider. The auth section enforces username/password for PJSIP authentication in Asterisk, preventing unauthorized access.
Now, add dialplan rules in /etc/asterisk/extensions.conf for routing calls from the trunk:
[from-trunk]
exten => _X.,1,NoOp(Incoming from trunk)
same => n,Dial(PJSIP/${EXTEN}@local-extension) ; Route to internal users
same => n,Hangup()
This handles incoming calls, forwarding them to local extensions. For outbound to Server B, we'll cover in the next section.
Server B: Configuring the Customer Endpoint (Branch Office Side)
On Server B (e.g., IP: 192.0.2.2), register to Server A as a trunk client. In /etc/asterisk/pjsip.conf:
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
local_net=192.168.0.0/16 ; Your internal network for NAT
[trunk-isp-a]
type=endpoint
transport=transport-udp
context=from-isp ; Context for calls from Server A
disallow=all
allow=ulaw,alaw,gsm
auth=trunk-isp-a-auth
aors=trunk-isp-a
outbound_auth=trunk-isp-a-auth
from_user=trunkuser
from_domain=192.0.2.1
[trunk-isp-a-auth]
type=auth
auth_type=userpass
username=trunkuser
password=strongpass123
realm=192.0.2.1
[trunk-isp-a-aor]
type=aor
contact=sip:192.0.2.1:5060
Here, Server B authenticates to Server A, enabling bidirectional VoIP trunking. For outbound calls to the ISP trunk:
In /etc/asterisk/extensions.conf:
[from-internal]
exten => _9NXXNXXXXXX,1,NoOp(Outbound to ISP)
same => n,Set(CALLERID(num)=${CALLERID(num)}) ; Preserve caller ID
same => n,Dial(PJSIP/${EXTEN:1}@trunk-isp-a) ; Strip 9 prefix, dial via trunk
same => n,Hangup()
[from-isp]
exten => _X.,1,NoOp(Incoming from ISP trunk)
same => n,Dial(Local/${EXTEN}@internal-extensions) ; Route to local users
same => n,Hangup()
Test the setup: From Server B, dial an extension on Server A (e.g., Dial(PJSIP/100@trunk-isp-a)). Use pjsip show endpoints in Asterisk CLI to verify registration.
Troubleshooting Common Issues in Asterisk PJSIP Interconnections
- One-Way Audio: Enable
direct_media=yesor check RTP ports/firewalls. - Registration Fails: Verify auth credentials and realms match.
- NAT Problems: Use
externipandlocalnetinsip.confif needed. - Codec Mismatch: Align
allow/disallowon both ends.
For advanced Asterisk troubleshooting, enable debug logging: pjsip set logger on.
Best Practices for Secure and Scalable VoIP Trunks
- Use TLS for SIP (add
protocol=tlsin transports) to encrypt signaling. - Implement ACLs in
pjsip.confto restrict IPs. - Monitor with tools like
sngrepfor SIP traffic analysis. - Scale with multiple trunks for load balancing in multi-Asterisk environments.
By following this Asterisk PJSIP interconnection guide, you'll have a robust VoIP trunk up and running. For more on VoIP server configuration or custom dialplans, drop a comment below. Happy trunking!