Kamailio en Español

El manual de referencia más completo sobre Kamailio en castellano. Documentación, tutoriales, módulos y guías de instalación para las versiones 5 y 6.

🆕 Última versión: 6.1.3 ⭐ LTS: 5.8.8 🔧 +250 módulos 🌐 SIP · WebRTC · RTP
Instalar Kamailio ¿Qué es Kamailio?

¿Qué es Kamailio?

Kamailio es un servidor SIP de código abierto y alto rendimiento, heredero directo del proyecto OpenSER (que a su vez derivó de SER — SIP Express Router, creado en 2001 por Fraunhofer FOKUS). Es uno de los servidores SIP más utilizados en el mundo para construir infraestructuras de voz sobre IP (VoIP), plataformas de comunicaciones unificadas, WebRTC y redes de telecomunicaciones a escala operadora.

Kamailio actúa como proxy SIP, registrar, redirect server y location server. Su arquitectura modular y su potente lenguaje de scripting (kamailio.cfg) lo hacen idóneo tanto para instalaciones pequeñas como para despliegues masivos con millones de usuarios simultáneos.

Alto Rendimiento

Capaz de procesar decenas de miles de llamadas por segundo en hardware convencional. Arquitectura no bloqueante y multihilo (con TLS multihilo desde 6.1).

🧩

Modular

Más de 250 módulos disponibles: autenticación, bases de datos, NAT traversal, IMS, WebRTC, RTPEngine, LDAP, Redis, Kafka, NATS y mucho más.

📜

Scriptable (KEMI)

Lenguaje de configuración nativo muy potente, más soporte KEMI para scripts en Python 3, Lua, JavaScript, Ruby y Go.

🌐

Protocolos

UDP, TCP, TLS, WebSocket (WSS), SCTP, IPv6. Compatible con WebRTC, IMS/LTE, SIP SIMPLE, presencia y SIPREC.

🔒

Seguridad

TLS/SRTP, autenticación SIP digest, anti-flood, listas negras, algoritmos de hash robustos (desde 6.1) y módulo secfilter.

🏢

Escala Operadora

Usado por operadoras de telecomunicaciones, proveedores VoIP y grandes plataformas de comunicaciones en todo el mundo.

Historia y evolución

AñoHito
2001SER (SIP Express Router) creado por Fraunhofer FOKUS — primer servidor SIP open source de alto rendimiento
2002SER liberado como open source bajo GPLv2
2005Fork de SER: nace OpenSER con una comunidad más abierta
2008OpenSER se renombra a Kamailio por reclamaciones de marca
2012Fusión con el proyecto SER: Kamailio absorbe el código base de SER
2016Kamailio 5.0 — gran refactorización y soporte KEMI (Python, Lua, JavaScript, Ruby)
2025Kamailio 6.0 — nueva arquitectura de módulos, mejoras KEMI, soporte QUIC experimental
Feb 2026Kamailio 6.1.0 — TLS multihilo, SIPREC con RTPEngine, hashing más robusto, 4 módulos nuevos
May 2026Kamailio 6.1.3 — última versión estable disponible

Versiones de Kamailio

Kamailio sigue un ciclo de versiones semestral. A continuación las ramas activas y las últimas de la serie 5.x:

6.1.3 ★ Última 6.0.x 5.8.x LTS 5.7.x 5.6.x 5.5.x
Versión Publicación Estado Novedades principales Descarga
6.1.3 Mayo 2026 Activa Correcciones de estabilidad sobre 6.1.x. Última versión recomendada para nuevas instalaciones. Descargar ↗
6.1.0 Feb 2026 Activa TLS multihilo, SIPREC con RTPEngine, hashing robusto (SHA-256/512), 4 nuevos módulos: dlgs, siprepo, outbound_dmq, stir_shaken mejorado Descargar ↗
6.0.x 2025 Mantenimiento Nueva API de módulos, mejoras KEMI, soporte QUIC experimental, refactorización del core Descargar ↗
5.8.x 2024 LTS Mejoras en RTPEngine, módulo lost (location services), mejoras en dispatcher, correcciones de seguridad continuadas Descargar ↗
5.7.x 2023 EOL Nuevo módulo nats (NATS.io), mejoras en http_async_client, soporte Go KEMI Descargar ↗
5.6.x 2022 EOL Módulo mqtt, mejoras WebSocket, jsonrpcs mejorado, soporte SIP over QUIC experimental Descargar ↗
5.5.x 2021 EOL Módulo cfgt, mejoras de rendimiento en el core, módulo topos_redis Descargar ↗
Recomendación: Para nuevas instalaciones en producción se recomienda Kamailio 6.1.3 (últimas funcionalidades y correcciones). Para entornos que requieren máxima estabilidad probada: 5.8.x LTS.

Módulos Principales

Kamailio carga funcionalidad a través de módulos (.so). Se cargan con loadmodule "nombre.so" y se configuran con modparam().

Autenticación y Usuarios

authAutenticación SIP digest (RFC 3261). Base para auth_db y auth_radius.
auth_dbAuth contra MySQL/PostgreSQL. Parámetro clave: calculate_ha1
auth_radiusAutenticación vía servidor RADIUS externo.
permissionsACLs: controla qué IPs/usuarios pueden llamar a qué destinos.
usrlocLocation server: gestiona los contactos de los REGISTER.
registrarProcesa peticiones REGISTER. Usa usrloc como backend.

Ejemplo: configurar auth_db

loadmodule "auth.so"
loadmodule "auth_db.so"
loadmodule "db_mysql.so"

modparam("auth_db", "db_url", "mysql://kamailio:pass@localhost/kamailio")
modparam("auth_db", "calculate_ha1", yes)   # la BD guarda password en texto plano
modparam("auth_db", "password_column", "password")
modparam("auth_db", "user_column", "username")
modparam("auth_db", "domain_column", "domain")

# En request_route:
if (!auth_check("$fd", "subscriber", "1")) {
    auth_challenge("$fd", "0");
    exit;
}

Base de Datos

db_mysqlConector MySQL/MariaDB. El más usado en producción.
db_postgresConector PostgreSQL con soporte de transacciones.
db_sqliteConector SQLite. Ideal para entornos de desarrollo/pruebas.
db_redisConector Redis para almacenamiento en memoria de alta velocidad.
db_unixodbcConector ODBC genérico (SQL Server, Oracle, etc.).
sqlopsOperaciones SQL avanzadas desde el script (SELECT, INSERT…).

Ejemplo: consulta SQL con sqlops

loadmodule "sqlops.so"
modparam("sqlops","sqlcon","ca=>mysql://kamailio:pass@localhost/kamailio")

# En request_route:
sql_query("ca", "SELECT did FROM did_routing WHERE number='$rU'", "res");
if($dbr(res=>rows) > 0) {
    $ru = "sip:" + $dbr(res=>[0,0]) + "@gateway.local";
}
sql_result_free("res");

Enrutamiento y Proxy

tmTransaction Manager. Imprescindible: gestiona transacciones SIP con estado.
slStateless replies. Para respuestas sin gestión de transacción.
rrRecord-Route: mantiene Kamailio en el path del diálogo.
dispatcherLoad balancing SIP con múltiples algoritmos (round-robin, hash, failover).
lcrLeast Cost Routing: enrutamiento por coste hacia operadoras.
droutingDynamic routing: enrutamiento configurable en base de datos.

Ejemplo: dispatcher (balanceo de carga)

loadmodule "dispatcher.so"
modparam("dispatcher", "db_url", "mysql://kamailio:pass@localhost/kamailio")
modparam("dispatcher", "ds_ping_interval", 10)   # ping cada 10s para detectar caídas
modparam("dispatcher", "ds_probing_mode", 1)      # probar todos los destinos

# En request_route:
if (is_method("INVITE")) {
    if (!ds_select_dst("1", "4")) {   # grupo 1, algoritmo round-robin
        send_reply(503, "Service Unavailable");
        exit;
    }
}

# Gestionar fallos (event_route o failure_route):
failure_route[MANAGE_FAILURE] {
    if (t_is_canceled()) exit;
    if (t_check_status("500|503")) {
        if (ds_next_dst()) {
            t_relay();
            exit;
        }
    }
}

NAT y Media

nathelperNAT traversal: detect, fix_nated_contact, keepalives UDP.
rtpengineControl de RTPEngine (media relay, transcoding, grabación).
rtpproxyControl de RTPProxy clásico para relay de media.

Ejemplo: nathelper + rtpengine

loadmodule "nathelper.so"
loadmodule "rtpengine.so"

modparam("nathelper", "natping_interval", 30)
modparam("nathelper", "ping_nated_only", 1)
modparam("rtpengine", "rtpengine_sock", "udp:127.0.0.1:2223")

route[MEDIA] {
    if (is_method("INVITE") || is_method("UPDATE")) {
        if (nat_uac_test(19)) {
            fix_nated_contact();
            rtpengine_offer("replace-origin replace-session-connection");
        }
    }
}

onreply_route[REPLY_MEDIA] {
    if (nat_uac_test(19)) {
        rtpengine_answer("replace-origin replace-session-connection");
        fix_nated_contact();
    }
}

WebRTC y Transporte

websocketWebSocket (WS/WSS) para clientes WebRTC en navegador.
tlsTLS/SRTP. Desde 6.1 con modo multihilo.
xhttpServidor HTTP embebido para APIs REST y webhooks.
outboundRFC 5626 SIP Outbound para clientes tras NAT simétrico.
pathSoporte de Path header (RFC 3327) para SIP outbound.

Scripting KEMI

app_python3Scripts de enrutamiento en Python 3. Módulo KEMI más popular.
app_luaScripts en Lua. Muy rápido y embebido.
app_jsdtScripts en JavaScript (Duktape).
app_rubyScripts en Ruby.
app_goScripts en Go mediante biblioteca compartida.
http_async_clientCliente HTTP asíncrono (curl) desde el script.

Ejemplo: KEMI con Python 3

# kamailio.cfg — activar KEMI Python
loadmodule "app_python3.so"
modparam("app_python3", "load", "/etc/kamailio/kamailio_route.py")

cfgengine "python"

# /etc/kamailio/kamailio_route.py
import kamailio

def ksr_request_route():
    KSR.info("Petición: {} desde {}\n".format(
        KSR.pv.get("$rm"), KSR.pv.get("$si")))

    if KSR.is_REGISTER():
        return ksr_route_registrar()

    if KSR.siputils.has_totag() > 0:
        if KSR.rr.loose_route() > 0:
            return ksr_route_relay()

def ksr_route_registrar():
    if KSR.registrar.save("location", 0) < 0:
        KSR.sl.sl_reply_error()
    return

def ksr_route_relay():
    if KSR.tm.t_relay() < 0:
        KSR.sl.sl_reply_error()
    return

Seguridad y Monitorización

pikeAnti-flood: bloquea IPs que superan un umbral de peticiones/segundo.
secfilterFiltrado de User-Agent, From, To maliciosos desde BD.
htableHash tables compartidas entre procesos: contadores, baneos en memoria.
statisticsEstadísticas internas: llamadas activas, peticiones/s, errores.
prometheusExporta métricas en formato Prometheus para Grafana.
siptraceTrazado SIP completo vía protocolo HEP (Homer/Captagent).

Ejemplo: pike + htable (anti-flood)

loadmodule "pike.so"
loadmodule "htable.so"

modparam("pike", "sampling_time_unit", 2)
modparam("pike", "reqs_density_per_unit", 30)  # max 30 req/2s por IP
modparam("pike", "remove_latency", 4)
modparam("htable", "htable", "ipban=>size=8;autoexpire=300")

request_route {
    # Bloquear IPs baneadas
    if ($sht(ipban=>$si) != $null) {
        xlog("L_WARN", "IP baneada: $si\n");
        exit;
    }
    # Detectar flood
    if (!pike_check_req()) {
        $sht(ipban=>$si) = 1;
        xlog("L_WARN", "Flood detectado, baneando $si por 300s\n");
        exit;
    }
}
Documentación completa de módulos: kamailio.org/docs/modules/stable/ — documentación oficial de todos los módulos de la rama estable.

Instalación de Kamailio

Desde repositorios oficiales (recomendado)

Debian 12 / Ubuntu 24.04 — Kamailio 6.1

# 1. Añadir clave GPG y repositorio oficial
curl -fsSL https://deb.kamailio.org/kamailiodebkey.gpg | sudo gpg --dearmor \
  -o /usr/share/keyrings/kamailio.gpg

# Debian 12 (Bookworm) / Ubuntu 24.04:
echo "deb [signed-by=/usr/share/keyrings/kamailio.gpg] \
  https://deb.kamailio.org/kamailio61 bookworm main" \
  | sudo tee /etc/apt/sources.list.d/kamailio.list

# 2. Instalar paquetes base + módulos más comunes
sudo apt update
sudo apt install kamailio kamailio-mysql-modules kamailio-tls-modules \
  kamailio-websocket-modules kamailio-utils-modules kamailio-extras-modules

# 3. Crear base de datos
kamdbctl create

# 4. Habilitar e iniciar
sudo systemctl enable kamailio
sudo systemctl start kamailio
sudo systemctl status kamailio

AlmaLinux 9 / Rocky Linux 9 — Kamailio 6.1

sudo dnf install epel-release
sudo curl -fsSL https://rpm.kamailio.org/kamailio61/kamailio.repo \
  -o /etc/yum.repos.d/kamailio.repo

sudo dnf install kamailio kamailio-mysql kamailio-tls kamailio-websocket

kamdbctl create
sudo systemctl enable --now kamailio

Docker — Arranque rápido

docker pull kamailio/kamailio:6.1-debian

docker run -d \
  --name kamailio \
  --network host \
  -v /etc/kamailio:/etc/kamailio \
  kamailio/kamailio:6.1-debian

Compilar desde código fuente

# Dependencias (Debian/Ubuntu)
sudo apt install -y git gcc flex bison make libmysqlclient-dev \
  libssl-dev libpcre3-dev libcurl4-openssl-dev libxml2-dev libevent-dev

# Clonar y compilar versión 6.1
git clone --depth 1 --branch 6.1 https://github.com/kamailio/kamailio.git
cd kamailio

make FLAVOUR=kamailio include_modules="db_mysql tls websocket nathelper \
  rtpengine dispatcher app_python3" cfg
make all
sudo make install

Paquetes disponibles por distribución

DistribuciónVersiones soportadasRepositorio
Debian 12 (Bookworm)5.8, 6.0, 6.1deb.kamailio.org
Debian 11 (Bullseye)5.8, 6.0deb.kamailio.org
Ubuntu 24.04 LTS5.8, 6.0, 6.1deb.kamailio.org
Ubuntu 22.04 LTS5.7, 5.8, 6.0deb.kamailio.org
AlmaLinux / Rocky 95.8, 6.0, 6.1rpm.kamailio.org
Docker (todas)5.6–6.1hub.docker.com

Configuración de Kamailio

El fichero principal es /etc/kamailio/kamailio.cfg. Se organiza en cuatro bloques: directivas globales, carga de módulos, parámetros de módulos y bloques de rutas.

Estructura completa de kamailio.cfg

#!KAMAILIO

#!define DBURL "mysql://kamailio:pass@localhost/kamailio"

# ── Parámetros globales ──────────────────────────────────────────────
debug=2
log_stderror=no
log_facility=LOG_LOCAL0
fork=yes
children=4

listen=udp:0.0.0.0:5060
listen=tcp:0.0.0.0:5060
listen=tls:0.0.0.0:5061

# ── Módulos ──────────────────────────────────────────────────────────
loadmodule "tm.so"
loadmodule "sl.so"
loadmodule "rr.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "auth.so"
loadmodule "auth_db.so"
loadmodule "db_mysql.so"
loadmodule "nathelper.so"
loadmodule "xlog.so"
loadmodule "maxfwd.so"
loadmodule "textops.so"

# ── Parámetros de módulos ────────────────────────────────────────────
modparam("usrloc", "db_url", DBURL)
modparam("usrloc", "db_mode", 2)          # write-back caché + BD
modparam("auth_db", "db_url", DBURL)
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("rr", "enable_full_lr", 1)

# ── Rutas ────────────────────────────────────────────────────────────
request_route {
    xlog("L_INFO", "[$ci] $rm $ru desde $fu ($si:$sp)\n");

    if (!mf_process_maxfwd_header(10)) {
        sl_send_reply(483, "Too Many Hops"); exit;
    }

    if (is_method("REGISTER")) {
        route(AUTH);
        route(REGISTRAR);
        exit;
    }

    if (is_method("INVITE|SUBSCRIBE")) { record_route(); }

    if (has_totag()) {
        if (loose_route()) { route(RELAY); }
        exit;
    }

    if (is_method("INVITE")) {
        route(AUTH);
        route(LOCATION);
    }
}

route[AUTH] {
    if (!auth_check("$fd", "subscriber", "1")) {
        auth_challenge("$fd", "0");
        exit;
    }
    consume_credentials();
}

route[REGISTRAR] {
    if (!save("location")) { sl_reply_error(); }
    exit;
}

route[LOCATION] {
    if (!lookup("location")) {
        $var(rc) = $retcode;
        if ($var(rc) == -1 || $var(rc) == -3) {
            send_reply(404, "Not Found"); exit;
        }
        send_reply(405, "Method Not Allowed"); exit;
    }
    route(RELAY);
}

route[RELAY] {
    if (!t_relay()) { sl_reply_error(); }
    exit;
}

Configuración TLS con modo multihilo (Kamailio 6.1)

loadmodule "tls.so"
modparam("tls", "config", "/etc/kamailio/tls.cfg")
modparam("tls", "tls_threads_mode", 1)   # multihilo — novedad 6.1

# /etc/kamailio/tls.cfg
[server:default]
method = TLSv1.2+
verify_certificate = no
require_certificate = no
private_key = /etc/ssl/kamailio/privkey.pem
certificate = /etc/ssl/kamailio/fullchain.pem

Configuración WebSocket / WebRTC

loadmodule "xhttp.so"
loadmodule "websocket.so"
loadmodule "nathelper.so"
loadmodule "rtpengine.so"

modparam("websocket", "keepalive_mechanism", 1)
modparam("websocket", "keepalive_interval", 30)
modparam("rtpengine", "rtpengine_sock", "udp:127.0.0.1:2223")

listen=tcp:0.0.0.0:8080    # WS
listen=tls:0.0.0.0:4443    # WSS

event_route[xhttp:request] {
    set_reply_close();
    set_reply_no_connect();
    if (ws_handle_handshake()) exit;
    send_reply(404, "Not found");
}

event_route[websocket:closed] {
    xlog("L_INFO", "WS cerrado $si:$sp\n");
}

Comandos de administración

# Estado del servidor
kamctl status

# Ver registraciones activas
kamctl ul show
kamctl ul show usuario@dominio.com

# Recargar dispatcher desde BD (sin reiniciar)
kamcmd dispatcher.reload

# Estadísticas en tiempo real
kamcmd stats.get_statistics all
kamcmd stats.get_statistics "inuse_transactions:"

# Número de llamadas activas
kamcmd tm.stats

# Ver conexiones TLS activas
kamcmd tls.info

# Banear una IP manualmente
kamcmd htable.seti ipban 192.168.1.100 1

# Enviar SIP OPTION de prueba
kamctl fifo via_list

Pseudovariables en Kamailio

Las pseudovariables permiten acceder a campos del mensaje SIP y del entorno de ejecución directamente desde el script. Su sintaxis es $nombre o $(nombre{transformacion}).

Mensaje SIP — petición

VariableDescripciónEjemplo
$rmMétodo SIPINVITE, REGISTER, BYE…
$ruRequest URI completosip:alice@ejemplo.com
$rUParte usuario del Request URIalice
$rdDominio del Request URIejemplo.com
$rpPuerto del Request URI5060
$fuFrom URI completosip:bob@dominio.com
$fUUsuario del Frombob
$fdDominio del Fromdominio.com
$fnDisplay name del FromBob Smith
$tuTo URI completosip:alice@ejemplo.com
$tUUsuario del Toalice
$ciCall-IDabc123@192.168.1.1
$csCSeq número1
$ctContact header URIsip:bob@192.168.1.10:5080
$mlMessage length (bytes)512

Respuesta SIP

VariableDescripción
$rsReply Status code (200, 404, 500…)
$rrReply Reason phrase (OK, Not Found…)

Red y conexión

VariableDescripción
$siIP fuente del paquete SIP
$spPuerto fuente
$RiIP de la interfaz receptora de Kamailio
$RpPuerto de la interfaz receptora
$protoProtocolo (udp, tcp, tls, ws, wss)
$afFamilia de dirección (INET o INET6)

Variables de usuario y compartidas

# AVP — por transacción, tipadas (int o string)
$avp(nombre) = "valor string";
$avp(i:42)   = 100;

# $var — por proceso/petición, alta velocidad
$var(contador) = $var(contador) + 1;

# $dlg_var — persiste durante todo el diálogo (requiere módulo dialog)
$dlg_var(clave) = "valor permanente del diálogo";

# $sht — hash table compartida entre todos los procesos (requiere htable)
$sht(tabla=>clave) = "compartido";
if ($sht(ipban=>$si) != $null) { exit; }

# Cabeceras SIP
xlog("Contact: $hdr(Contact)\n");
xlog("2º Via: $(hdr(Via)[1])\n");    # índice base 0

# Transformaciones
xlog("Usuario en mayúsculas: $(rU{s.upper})\n");
xlog("IP válida: $(si{ip.isavp})\n");
xlog("Longitud de rU: $(rU{s.len})\n");
$var(host) = $(ru{uri.host});         # extraer host del URI

Recursos y Comunidad

Documentación Oficial

En Sinologic.net (español)

Comunidad y Soporte

Lista de correo en Español:
sr-users-es@lists.kamailio.org
Suscripción: lists.kamailio.org → sr-users-es

Otras listas de correo

Otros canales

Cómo preguntar bien en la lista

  • Indica la versión exacta: kamailio -V
  • Incluye la distribución Linux y la versión
  • Adjunta los logs relevantes con debug=3
  • Pega el fragmento de kamailio.cfg relacionado
  • Describe el comportamiento esperado vs. el obtenido
  • Ejecuta kamctl status antes de preguntar