Scaling Asterisk Using Kamailio and RTPProxy: A Step-by-Step Guide
Efficiently Scaling VoIP Infrastructure: Load Balancing SIP and RTP Traffic with Kamailio and RTPProxy
Architecture of the Asterisk cluster setup using Kamailio and RTPProxy
Introduction:
In this article, we will walk you through the process of scaling an Asterisk cluster using Kamailio and RTPProxy. This solution provides efficient load balancing of SIP calls and media traffic across multiple Asterisk nodes, allowing you to achieve improved performance and high availability for your VoIP infrastructure.
Prerequisites:
Two or more Asterisk nodes deployed using Docker (or any other deployment method)
A dedicated server or container for running Kamailio and RTPProxy
Step 1: Install Kamailio and RTPProxy
Install Kamailio and RTPProxy on a separate server or container that will act as the load balancer for your Asterisk cluster.
On Debian-based systems, you can use the following command:
sudo apt-get update sudo apt-get install kamailio kamailio-mysql-modules rtpproxy
Step 2: Configure RTPProxy
Edit the RTPProxy configuration file (typically located at
/etc/default/rtpproxy
USER="rtpproxy" GROUP="rtpproxy" PIDFILE="/var/run/rtpproxy/rtpproxy.pid" LOG_LEVEL="3" EXTRA_OPTS="-l <RTPProxy_IP_Address>"
Replace
<RTPProxy_IP_Address>
Restart the RTPProxy service to apply the changes:
sudo systemctl restart rtpproxy
Step 3: Configure Kamailio
Edit the Kamailio configuration file (typically located at
/etc/kamailio/kamailio.cfg
A minimal configuration example:
# Load required modules loadmodule "sl.so" loadmodule "tm.so" loadmodule "rr.so" loadmodule "maxfwd.so" loadmodule "textopsx.so" loadmodule "rtpproxy.so" loadmodule "dispatcher.so" loadmodule "nathelper.so"# Global parameters cfgengine "native" fork=yes children=4# RTPProxy settings modparam("rtpproxy", "rtpproxy_sock", "udp:<RTPProxy_IP_Address>:7722")# Dispatcher settings modparam("dispatcher", "list_file", "/etc/kamailio/dsipatcher.list")# Main request routing logic route { # Max forward check if (!mf_process_maxfwd_header("10")) { sl_send_reply("483", "Too Many Hops"); exit; } # Record routing for stateful processing record_route(); # Load balance using dispatcher if (!ds_select_dst("0", "4")) { sl_send_reply("500", "No destination"); exit; } # Engage RTPProxy for RTP traffic if (is_method("INVITE")) { force_rtp_proxy(); } else if (is_method("BYE")) { end_media_session(); } # Forward the request t_relay(); }
Replace
<RTPProxy_IP_Address>
Create a dispatcher list file at
/etc/kamailio/dispatcher.list
1 sip:<Asterisk_Node1_IP_Address>:5060 1 sip:<Asterisk_Node2_IP_Address>:5060
Replace
<Asterisk_Node1_IP_Address>
<Asterisk_Node2_IP_Address>
Step 4: Restart Kamailio
Restart the Kamailio service to apply the changes:
sudo systemctl restart kamailio
Step 5: Update Asterisk configuration
Update the
rtp.conf
[general] rtpstart=10000 rtpend=20000
Step 6: Point your SIP clients to Kamailio
Configure your SIP clients or devices to use the Kamailio load balancer as their SIP server. All SIP traffic should now be handled by Kamailio, which will load balance calls between your Asterisk nodes and use RTPProxy to handle RTP traffic.
Conclusion:
With this setup, Kamailio handles SIP signaling, allowing you to load balance and distribute calls across your Asterisk nodes. RTPProxy takes care of the RTP traffic, relaying media streams between your SIP clients and Asterisk nodes without the need to expose a large number of RTP ports on each container. This approach provides a more efficient and scalable solution for your Asterisk cluster, enabling you to achieve improved performance and high availability for your VoIP infrastructure.
Kiran Chaulagain
kkchaulagain@gmail.com
I am a Full Stack Software Engineer and DevOps expert with over 6 years of experience. Specializing in creating innovative, scalable solutions using technologies like PHP, Node.js, Vue, React, Docker, and Kubernetes, I have a strong foundation in both development and infrastructure with a BSc in Computer Science and Information Technology (CSIT) from Tribhuvan University. I’m passionate about staying ahead of industry trends and delivering projects on time and within budget, all while bridging the gap between development and production. Currently, I’m exploring new opportunities to bring my skills and expertise to exciting new challenges.