Cómo proteger un servidor Kamailio en Rocky Linux 9 en menos de 15 minutos

La seguridad en servidores VoIP es crítica. Un servidor SIP expuesto sin protección adecuada puede convertirse en objetivo de ataques de fraude telefónico, escaneos masivos y consumo fraudulento de recursos en cuestión de horas. En este artículo te mostraré cómo implementar medidas de seguridad esenciales en Rocky Linux 9 que puedes configurar en menos de 15 minutos.

Los servidores SIP son constantemente escaneados por bots que buscan vulnerabilidades. Un ataque exitoso puede resultar en:

  • Llamadas internacionales fraudulentas que generan miles de dólares en costos
  • Consumo de ancho de banda y recursos del servidor
  • Compromiso de la privacidad de las comunicaciones
  • Daño a la reputación de tu servicio

Requisitos previos

Antes de comenzar, asegúrate de tener:

  • Rocky Linux 9 instalado y actualizado
  • Acceso root o sudo al servidor
  • Kamailio u otro servidor SIP instalado
  • Puertos básicos identificados (típicamente 5060 UDP/TCP para SIP, 16384-32768 UDP para RTP)

Paso 1: Actualizar el sistema (2 minutos)

Siempre comenzamos con un sistema actualizado:

sudo dnf update -y
sudo dnf install -y epel-release

Paso 2: Configurar iptables (3 minutos)

Desactivamos firewalld y usamos iptables directamente para mayor control:

# Detener y deshabilitar firewalld
sudo systemctl stop firewalld
sudo systemctl disable firewalld

# Instalar iptables-services
sudo dnf install -y iptables-services

# Habilitar e iniciar iptables
sudo systemctl enable iptables
sudo systemctl start iptables

# Limpiar reglas existentes
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X

# Política por defecto: denegar todo excepto lo explícitamente permitido
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

# Permitir loopback
sudo iptables -A INPUT -i lo -j ACCEPT

# Permitir conexiones establecidas
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Permitir SSH (ajusta el puerto si usas otro)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Permitir SIP
sudo iptables -A INPUT -p udp --dport 5060 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 5060 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 5061 -j ACCEPT

# Permitir RTP para media
sudo iptables -A INPUT -p udp --dport 16384:32768 -j ACCEPT

# Si usas RTPEngine en puerto específico
sudo iptables -A INPUT -p udp --dport 22222 -j ACCEPT

# Guardar reglas
sudo service iptables save

Paso 3: Instalar y configurar Fail2ban (4 minutos)

Fail2ban es esencial para bloquear automáticamente IPs que realicen intentos de ataque:

# Instalar Fail2ban
sudo dnf install -y fail2ban fail2ban-firewalld

# Crear configuración local
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Crear filtro específico para Kamailio:

sudo nano /etc/fail2ban/filter.d/kamailio.conf

Agregar el siguiente contenido:

[Definition]
failregex = ^.*\[.*\] NOTICE:.* <HOST>:.* - authentication failure
            ^.*\[.*\] WARNING:.* <HOST> - invalid password
            ^.*\[.*\] WARNING:.* <HOST> - failed to authenticate
ignoreregex =

Configurar la jail para Kamailio:

sudo nano /etc/fail2ban/jail.d/kamailio.local

Contenido:

[kamailio]
enabled = true
port = 5060,5061
protocol = udp
filter = kamailio
logpath = /var/log/kamailio.log
maxretry = 3
bantime = 3600
findtime = 600
action = iptables-allports

Iniciar Fail2ban:

sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban

Paso 4: Implementar rate limiting con iptables (2 minutos)

Agregar reglas para limitar conexiones por IP:

# Crear script de rate limiting
sudo nano /usr/local/bin/voip-rate-limit.sh

Contenido del script:

#!/bin/bash

# Limitar nuevas conexiones SIP por IP
iptables -A INPUT -p udp --dport 5060 -m state --state NEW -m recent --set
iptables -A INPUT -p udp --dport 5060 -m state --state NEW -m recent --update --seconds 60 --hitcount 20 -j DROP

# Limitar INVITE messages
iptables -A INPUT -p udp --dport 5060 -m string --string "INVITE sip:" --algo bm -m recent --set --name INVITE
iptables -A INPUT -p udp --dport 5060 -m string --string "INVITE sip:" --algo bm -m recent --update --seconds 60 --hitcount 10 --name INVITE -j DROP

# Limitar REGISTER messages
iptables -A INPUT -p udp --dport 5060 -m string --string "REGISTER sip:" --algo bm -m recent --set --name REGISTER
iptables -A INPUT -p udp --dport 5060 -m string --string "REGISTER sip:" --algo bm -m recent --update --seconds 60 --hitcount 15 --name REGISTER -j DROP

Hacer ejecutable y aplicar:

sudo chmod +x /usr/local/bin/voip-rate-limit.sh
sudo /usr/local/bin/voip-rate-limit.sh

# Hacer persistente con systemd
sudo nano /etc/systemd/system/voip-rate-limit.service

Contenido del servicio:

[Unit]
Description=VoIP Rate Limiting Rules
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/voip-rate-limit.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Habilitar el servicio:

sudo systemctl daemon-reload
sudo systemctl enable voip-rate-limit.service

Paso 5: Configurar seguridad básica en Kamailio (4 minutos)

Edita tu configuración de Kamailio para incluir validaciones básicas:

sudo nano /etc/kamailio/kamailio.cfg

Agregar en la sección de enrutamiento:

# Anti-scanning: Drop SUBSCRIBE, NOTIFY, PUBLISH
if (method=="SUBSCRIBE" || method=="NOTIFY" || method=="PUBLISH") {
    sl_send_reply("405", "Method Not Allowed");
    exit;
}

# Rechazar métodos no estándar
if (!is_method("INVITE|ACK|BYE|CANCEL|REGISTER|OPTIONS")) {
    sl_send_reply("501", "Not Implemented");
    exit;
}

# Anti-flood: Limitar tamaño de mensajes
if (msg:len > 8192) {
    sl_send_reply("513", "Message Too Large");
    exit;
}

# Validar User-Agent vacío o sospechoso
if ($ua == "" || $ua =~ "friendly-scanner|sipcli|sipvicious") {
    sl_send_reply("403", "Forbidden");
    exit;
}

# Rechazar dominios no autorizados
if (!is_myself("$rd")) {
    sl_send_reply("403", "Relay Not Allowed");
    exit;
}

Reiniciar Kamailio:

sudo systemctl restart kamailio
sudo systemctl status kamailio

Verificación de la configuración

Después de implementar estas medidas, verifica que todo funciona correctamente:

# Verificar reglas de iptables
sudo iptables -L -n -v

# Ver reglas con números de línea
sudo iptables -L INPUT -n -v --line-numbers

# Verificar Fail2ban
sudo fail2ban-client status kamailio

# Ver IPs bloqueadas por Fail2ban
sudo fail2ban-client status kamailio

# Revisar logs de Kamailio
sudo tail -f /var/log/kamailio.log

# Monitorear intentos bloqueados
sudo journalctl -u fail2ban -f

# Ver estadísticas de rate limiting
sudo iptables -L -n -v | grep -A 5 "dport 5060"

Medidas adicionales recomendadas

Aunque las configuraciones anteriores te dan una protección sólida, considera implementar:

1. GeoIP Blocking

Bloquear países desde donde no esperas tráfico legítimo usando iptables con ipset. ipset permite crear listas de IPs que se evalúan eficientemente:

# Instalar ipset
sudo dnf install -y ipset

# Crear un conjunto (set) para almacenar rangos de IP de países bloqueados
sudo ipset create blocked_countries hash:net maxelem 1000000

# Descargar listas de rangos IP por país desde ipdeny.com
# Ejemplo: bloquear China (cn) y Rusia (ru)
cd /tmp
wget http://www.ipdeny.com/ipblocks/data/aggregated/cn-aggregated.zone
wget http://www.ipdeny.com/ipblocks/data/aggregated/ru-aggregated.zone

# Agregar todos los rangos de China al set
while read ip; do
    sudo ipset add blocked_countries $ip
done < cn-aggregated.zone

# Agregar todos los rangos de Rusia al set
while read ip; do
    sudo ipset add blocked_countries $ip
done < ru-aggregated.zone

# Aplicar regla de bloqueo en iptables
# Esta regla verifica si la IP origen está en el set y la bloquea
sudo iptables -I INPUT -p udp --dport 5060 -m set --match-set blocked_countries src -j DROP
sudo iptables -I INPUT -p tcp --dport 5060 -m set --match-set blocked_countries src -j DROP

# Verificar cuántas IPs hay en el set
sudo ipset list blocked_countries | grep "Number of entries"

# Guardar configuración para que persista
sudo service iptables save
sudo ipset save blocked_countries > /etc/sysconfig/ipset.blocked_countries

# Crear script de restauración al inicio
sudo tee /etc/systemd/system/ipset-restore.service > /dev/null <<EOF
[Unit]
Description=Restore ipset rules
Before=iptables.service

[Service]
Type=oneshot
ExecStart=/usr/sbin/ipset restore -f /etc/sysconfig/ipset.blocked_countries
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable ipset-restore.service

Script opcional para actualizar listas automáticamente:

# Crear script de actualización
sudo tee /usr/local/bin/update-geoip-blocks.sh > /dev/null <<'EOF'
#!/bin/bash

COUNTRIES="cn ru"  # Agrega códigos de país separados por espacio
TEMP_DIR="/tmp/geoip"
mkdir -p $TEMP_DIR

# Limpiar set existente
ipset flush blocked_countries 2>/dev/null || ipset create blocked_countries hash:net maxelem 1000000

# Descargar y agregar rangos
for country in $COUNTRIES; do
    wget -q -O $TEMP_DIR/$country.zone http://www.ipdeny.com/ipblocks/data/aggregated/$country-aggregated.zone
    while read ip; do
        ipset add blocked_countries $ip 2>/dev/null
    done < $TEMP_DIR/$country.zone
    echo "Agregados rangos de $country"
done

# Guardar configuración
ipset save blocked_countries > /etc/sysconfig/ipset.blocked_countries
echo "GeoIP blocks actualizados: $(ipset list blocked_countries | grep 'Number of entries')"

# Limpiar
rm -rf $TEMP_DIR
EOF

sudo chmod +x /usr/local/bin/update-geoip-blocks.sh

# Ejecutar ahora
sudo /usr/local/bin/update-geoip-blocks.sh

# Programar actualización mensual
echo "0 3 1 * * root /usr/local/bin/update-geoip-blocks.sh" | sudo tee -a /etc/crontab

Países disponibles para bloquear: Puedes encontrar la lista completa en http://www.ipdeny.com/ipblocks/ Códigos comunes: cn (China), ru (Rusia), in (India), br (Brasil), ua (Ucrania)

2. Autenticación fuerte

  • Usar contraseñas complejas de al menos 20 caracteres
  • Implementar autenticación de dos factores cuando sea posible
  • Rotar credenciales regularmente

3. Monitoreo continuo

Usar herramientas de monitoreo de tráfico SIP:

# Capturar tráfico SIP con tcpdump
sudo tcpdump -i any -n port 5060 -w /tmp/sip_capture.pcap

# Ver tráfico SIP en tiempo real
sudo tcpdump -i any -n port 5060 -A

# Analizar con tshark (Wireshark CLI)
sudo dnf install -y wireshark-cli
sudo tshark -i any -f "port 5060" -Y sip

4. Actualizaciones automáticas de seguridad

sudo dnf install -y dnf-automatic
sudo systemctl enable --now dnf-automatic.timer

5. Encriptación TLS

Configurar TLS para SIP (puerto 5061) y SRTP para media:

listen=tls:your-ip:5061
enable_tls=yes
tls_verify_server=1
tls_verify_client=1
tls_require_client_certificate=0
tls_method=TLSv1.2+
tls_certificate="/etc/kamailio/tls/cert.pem"
tls_private_key="/etc/kamailio/tls/privkey.pem"
tls_ca_list="/etc/kamailio/tls/ca-list.pem"

Checklist final de seguridad

  • [ ] iptables configurado y activo con política restrictiva
  • [ ] Fail2ban instalado y monitoreando logs
  • [ ] Rate limiting con iptables implementado
  • [ ] Kamailio configurado con validaciones básicas
  • [ ] Puertos innecesarios cerrados
  • [ ] Contraseñas fuertes en todas las cuentas SIP
  • [ ] Logs siendo monitoreados regularmente
  • [ ] Respaldos configurados
  • [ ] Actualizaciones automáticas habilitadas
  • [ ] TLS/SRTP configurado (recomendado)
  • [ ] Reglas de iptables guardadas y persistentes

Conclusión

Con estos pasos has implementado una capa sólida de protección para tu servidor VoIP SIP en Rocky Linux 9. Estas medidas te protegen contra los ataques más comunes: escaneos automatizados, intentos de fuerza bruta y flood attacks.

Recuerda que la seguridad es un proceso continuo. Revisa tus logs regularmente, mantén el sistema actualizado y ajusta las reglas según los patrones de ataque que observes.

Tiempo total invertido: Aproximadamente 15 minutos para un servidor básico.

Nivel de protección: Alto contra ataques automatizados comunes.

Recursos adicionales


¿Tienes preguntas o sugerencias? Déjame un comentario abajo y con gusto te ayudo a refinar tu configuración de seguridad VoIP.

 

Vota el Articulo: 

Sin votos (todavía)
Evalúa la calidad del articulo
Suscribirse a Comentarios de "Cómo proteger un servidor Kamailio en Rocky Linux 9 en menos de 15 minutos" Suscribirse a VozToVoice - Todos los comentarios