Installer Kamailio + FreeSWITCH sur Debian 13 (Trixie)
L'association Kamailio (SIP proxy/registrar) + FreeSWITCH (media server/B2BUA) est l'architecture de référence pour les opérateurs VoIP. Kamailio gère la signalisation SIP à haute performance, tandis que FreeSWITCH traite les flux média (audio, vidéo, T.38). Cette séparation permet de scaler indépendamment chaque couche.
Ce guide détaille l'installation complète sur Debian 13 (Trixie).
Prérequis
- Serveur Debian 13 (Trixie) fraîchement installé
- 4 Go RAM minimum (8 Go recommandé)
- 2 vCPU minimum
- IP publique fixe
- Nom de domaine (pour TLS/Let's Encrypt)
- Ports ouverts : 5060/UDP+TCP, 5061/TCP (TLS), 16384-32768/UDP (RTP)
1. Préparation du système
# Mise à jour
apt update && apt upgrade -y
# Paquets essentiels
apt install -y curl gnupg2 lsb-release ca-certificates \
build-essential git wget nftables
# Activer nftables
systemctl enable --now nftables
Firewall nftables
cat > /etc/nftables.conf << 'EOF'
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# Loopback
iif "lo" accept
# Established
ct state established,related accept
# SSH
tcp dport 22 accept
# SIP signalisation
tcp dport { 5060, 5061 } accept
udp dport 5060 accept
# RTP media
udp dport 16384-32768 accept
# ICMP
icmp type { echo-request, echo-reply } accept
icmpv6 type { echo-request, echo-reply, nd-neighbor-solicit, nd-neighbor-advert, nd-router-advert, nd-router-solicit } accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
EOF
nft -f /etc/nftables.conf
2. Installer Kamailio
Ajouter le dépôt officiel
# Clé GPG Kamailio
curl -fsSL https://deb.kamailio.org/kamailiodebkey.gpg | \
gpg --dearmor -o /usr/share/keyrings/kamailio.gpg
# Dépôt Kamailio 6.0 (dernière stable)
echo "deb [signed-by=/usr/share/keyrings/kamailio.gpg] \
http://deb.kamailio.org/kamailio60 trixie main" \
> /etc/apt/sources.list.d/kamailio.list
apt update
Installer les paquets
apt install -y kamailio kamailio-mysql-modules \
kamailio-tls-modules kamailio-websocket-modules \
kamailio-json-modules kamailio-utils-modules
Configuration principale
# /etc/kamailio/kamailio.cfg
#!KAMAILIO
#!define WITH_MYSQL
#!define WITH_TLS
#!define WITH_DISPATCHER
#!define WITH_ANTIFLOOD
# ─── Globals ───
listen=udp:0.0.0.0:5060
listen=tcp:0.0.0.0:5060
listen=tls:0.0.0.0:5061
# Augmenter les limites pour la production
children=8
tcp_children=4
# ─── Modules ───
loadmodule "tm.so"
loadmodule "sl.so"
loadmodule "rr.so"
loadmodule "pv.so"
loadmodule "maxfwd.so"
loadmodule "textops.so"
loadmodule "siputils.so"
loadmodule "xlog.so"
loadmodule "sanity.so"
loadmodule "nathelper.so"
loadmodule "tls.so"
loadmodule "pike.so"
loadmodule "htable.so"
loadmodule "dispatcher.so"
loadmodule "dialog.so"
# ─── Paramètres modules ───
# TLS
modparam("tls", "config", "/etc/kamailio/tls.cfg")
# Pike (anti-flood)
modparam("pike", "sampling_time_unit", 2)
modparam("pike", "reqs_density_per_unit", 30)
modparam("pike", "remove_latency", 4)
# Dispatcher (load balancing vers FreeSWITCH)
modparam("dispatcher", "list_file", "/etc/kamailio/dispatcher.list")
modparam("dispatcher", "ds_probing_mode", 1)
modparam("dispatcher", "ds_ping_interval", 10)
modparam("dispatcher", "ds_ping_method", "OPTIONS")
# ─── Routing ───
request_route {
# Vérifications de base
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483", "Too Many Hops");
exit;
}
if (!sanity_check("17895", "7")) {
xlog("L_WARN", "Sanity check failed from $si\n");
exit;
}
# Anti-flood
if (src_ip != myself) {
if (!pike_check_req()) {
xlog("L_ALERT", "PIKE blocking $si\n");
exit;
}
}
# Record-Route
if (is_method("INVITE|SUBSCRIBE")) {
record_route();
}
# Requêtes en-dialog
if (has_totag()) {
if (loose_route()) {
route(RELAY);
exit;
}
}
# CANCEL
if (is_method("CANCEL")) {
if (t_check_trans()) {
route(RELAY);
}
exit;
}
# Absorb retransmissions
t_check_trans();
# REGISTER → rejeter (ou configurer registrar)
if (is_method("REGISTER")) {
sl_send_reply("403", "Forbidden");
exit;
}
# INVITE → dispatcher vers FreeSWITCH
if (is_method("INVITE")) {
# Round-robin vers les instances FreeSWITCH
if (!ds_select_dst("1", "4")) {
sl_send_reply("502", "No Media Server Available");
exit;
}
route(RELAY);
exit;
}
# Autres requêtes
route(RELAY);
}
route[RELAY] {
if (!t_relay()) {
sl_reply_error();
}
}
Fichier dispatcher (load balancing)
# /etc/kamailio/dispatcher.list
# setid(tab)destination(tab)flags(tab)priority(tab)attrs
1 sip:127.0.0.1:5080 0 0 weight=50;duid=fs1
TLS (Let's Encrypt)
# Installer certbot
apt install -y certbot
# Obtenir le certificat
certbot certonly --standalone -d sip.example.com
# /etc/kamailio/tls.cfg
[server:default]
method = TLSv1.2+
certificate = /etc/letsencrypt/live/sip.example.com/fullchain.pem
private_key = /etc/letsencrypt/live/sip.example.com/privkey.pem
3. Installer FreeSWITCH
Dépôt SignalWire
# Token SignalWire (créer un compte sur signalwire.com)
TOKEN="votre-token-signalwire"
apt install -y apt-transport-https
curl -fsSL https://freeswitch.signalwire.com/repo/deb/debian-release/signalwire-freeswitch-repo.gpg \
| gpg --dearmor -o /usr/share/keyrings/freeswitch.gpg
echo "deb [signed-by=/usr/share/keyrings/freeswitch.gpg] \
https://$TOKEN@freeswitch.signalwire.com/repo/deb/debian-release/ \
trixie main" > /etc/apt/sources.list.d/freeswitch.list
apt update
Installer FreeSWITCH
apt install -y freeswitch-meta-all
# Ou version minimale :
# apt install -y freeswitch freeswitch-mod-sofia \
# freeswitch-mod-dialplan-xml freeswitch-mod-dptools \
# freeswitch-mod-commands freeswitch-mod-console \
# freeswitch-mod-logfile freeswitch-mod-cdr-csv \
# freeswitch-mod-g711 freeswitch-mod-g722 \
# freeswitch-mod-opus freeswitch-mod-sndfile
Configurer le profil SIP interne (liaison avec Kamailio)
<!-- /etc/freeswitch/sip_profiles/kamailio.xml -->
<profile name="kamailio">
<settings>
<param name="sip-ip" value="127.0.0.1"/>
<param name="sip-port" value="5080"/>
<param name="rtp-ip" value="$${local_ip_v4}"/>
<!-- Codecs -->
<param name="inbound-codec-string" value="PCMA,PCMU,G722,opus"/>
<param name="outbound-codec-string" value="PCMA,PCMU,G722,opus"/>
<!-- RTP -->
<param name="rtp-timer-name" value="soft"/>
<param name="rtp-rewrite-timestamps" value="true"/>
<!-- Pas d'auth depuis Kamailio (réseau local) -->
<param name="accept-blind-reg" value="false"/>
<param name="accept-blind-auth" value="false"/>
<param name="auth-calls" value="false"/>
<!-- NAT -->
<param name="apply-nat-acl" value="rfc1918.auto"/>
<!-- Gestion des médias -->
<param name="manage-presence" value="false"/>
</settings>
</profile>
Dialplan de base
<!-- /etc/freeswitch/dialplan/kamailio_context.xml -->
<context name="kamailio">
<!-- Appels entrants depuis Kamailio -->
<extension name="from_kamailio">
<condition field="destination_number" expression="^(\d+)$">
<action application="set" data="effective_caller_id_number=${caller_id_number}"/>
<action application="set" data="hangup_after_bridge=true"/>
<action application="bridge" data="sofia/external/${destination_number}@trunk-operateur"/>
</condition>
</extension>
</context>
4. Démarrer les services
# Activer et démarrer
systemctl enable --now kamailio
systemctl enable --now freeswitch
# Vérifier
systemctl status kamailio
systemctl status freeswitch
# Logs
journalctl -u kamailio -f
journalctl -u freeswitch -f
5. Tests et validation
Vérifier que Kamailio écoute
ss -tulnp | grep -E '5060|5061'
# Doit afficher les ports UDP 5060, TCP 5060, TCP 5061
Vérifier FreeSWITCH
fs_cli -x "sofia status"
# Doit afficher le profil "kamailio" en état RUNNING
fs_cli -x "sofia status profile kamailio"
Test SIP avec sipp
apt install -y sipp
# Test d'appel basique
sipp -sn uac 127.0.0.1:5060 -s 0612345678 -m 1
6. Monitoring
Kamailio stats
kamctl stats
kamctl fifo dispatcher.list
FreeSWITCH stats
fs_cli -x "show calls count"
fs_cli -x "show channels count"
fs_cli -x "sofia status profile kamailio"
Architecture cible en production
Pour la production, on recommande :
- 2+ instances Kamailio en actif/actif derrière un VIP (keepalived)
- 2+ instances FreeSWITCH load-balancées par le dispatcher Kamailio
- RTPEngine pour le relay média (surtout si NAT)
- Base MySQL/PostgreSQL pour les CDR et la configuration dynamique
- Supervision : Prometheus + Grafana avec les exporters Kamailio et FreeSWITCH
Conclusion
Cette stack Kamailio + FreeSWITCH sur Debian 13 constitue une base solide pour une plateforme VoIP opérateur. Kamailio assure le routage SIP haute performance (des milliers d'appels/seconde) tandis que FreeSWITCH gère le traitement média avec une grande flexibilité.
Chez Technixis, nous déployons et maintenons cette architecture pour des opérateurs télécoms en production. Besoin d'aide ? Contactez-nous ou appelez le 0800 012 013.
Liens & sources open source :
- Kamailio — Site officiel
- FreeSWITCH — Site officiel
- RTPEngine — GitHub
- Debian 13 Trixie
Laisser un commentaire