Enviado por admin el
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
- Documentación oficial de Kamailio Security
- Fail2ban Wiki
- Rocky Linux Security Guide
- OWASP VoIP Security Guide
¿Tienes preguntas o sugerencias? Déjame un comentario abajo y con gusto te ayudo a refinar tu configuración de seguridad VoIP.
Comentarios recientes