Installer Kamailio + FreeSWITCH sur Debian 13 : guide complet d'une stack VoIP opérateur
Author

admin

Installer Kamailio + FreeSWITCH sur Debian 13 : guide complet d'une stack VoIP opérateur

Guide pas à pas pour installer et configurer une stack VoIP Kamailio (SIP proxy) + FreeSWITCH (media server) sur Debian 13 Trixie. Architecture opérateur, TLS, codecs, load balancing.

Installer Kamailio + FreeSWITCH sur Debian 13 (Trixie)

Architecture Kamailio + FreeSWITCH

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

Aucun commentaire pour le moment. Soyez le premier !

Laisser un commentaire