Cómo Configurar Anti-Bot en el Servidor de MU Online
Aprende a configurar protección anti-bot en tu servidor MU Online con ajustes en GameServer.ini, consultas SQL de detección y baneo automatizado via SQL Server Agent.
Por Qué la Protección Anti-Bot es Esencial en MU Online
Los bots y trainers son una de las mayores amenazas a la economía y la experiencia de juego en servidores privados de MU Online. Acumulan Zen, ítems raros y experiencia de forma automatizada, desequilibrando completamente el servidor en cuestión de horas. Los servidores sin protección activa suelen ser invadidos masivamente en menos de 72 horas tras su apertura. Esta guía cubre la configuración completa del sistema anti-bot disponible en MuServer Season 6 — desde ajustes en archivos .ini hasta stored procedures SQL programadas automáticamente.
Requisitos Previos
- Acceso al directorio de instalación del servidor (ej:
C:\MuServer\) - SQL Server Management Studio (SSMS) conectado a la base de datos
MuOnline - Agente SQL Server habilitado (para automatización de jobs)
- Acceso de administrador al GameServer y ConnectServer
- Copia de seguridad completa realizada antes de cualquier cambio
Parte 1 — Configuración del GameServer
Paso 1: Habilitar Filtros de Paquetes en GameServer.exe.cfg
Localiza el archivo de configuración principal del GameServer:
C:\MuServer\GameServer\GameServer.exe.cfg
Agrega o edita los siguientes parámetros en la sección [AntiBot] (si la sección no existe, créala al final del archivo):
[AntiBot]
AntiBotEnable = 1
AntiBotCheckTime = 60 ; Intervalo de verificación en segundos
AntiBotMaxRepeat = 3 ; Máximo de acciones idénticas consecutivas
AntiBotKickEnable = 1 ; Expulsar al detectar comportamiento de bot
AntiBotBanEnable = 0 ; Baneo automático (activar con precaución)
AntiBotLogEnable = 1 ; Registrar sospechosos en archivo de log
AntiBotLogPath = Logs\AntiBot\
AntiBotBanEnable = 0 las primeras 48 horas. Ejecuta el sistema en modo de registro para calibrar los umbrales antes de activar baneos automáticos. La activación prematura puede banear jugadores legítimos y generar reclamaciones.Paso 2: Configurar AntiBot.ini (Season 6+)
En servidores Season 6 Episode 1 en adelante, existe un archivo de configuración dedicado para el anti-bot:
C:\MuServer\GameServer\Data\AntiBot.ini
Configuración recomendada para Season 6:
[Config]
Enable = 1
QuestionEnable = 1 ; Activa preguntas CAPTCHA en el chat del juego
QuestionInterval = 1800 ; Pregunta cada 30 minutos (en segundos)
QuestionTimeout = 120 ; Tiempo para responder antes de expulsión (segundos)
QuestionPunishment = 1 ; 0=Expulsión, 1=Baneo temporal, 2=Baneo permanente
WrongAnswerLimit = 3 ; Intentos incorrectos antes del castigo
MoveDetect = 1 ; Detecta movimiento en patrones de ruta repetidos
MoveDetectRange = 5 ; Variación mínima de posición esperada (celdas)
MoveDetectTime = 300 ; Ventana de tiempo para análisis de movimiento (segundos)
KillSpeedMax = 800 ; Kills por hora máximas antes de generar alerta
Paso 3: Definir las Preguntas CAPTCHA
El archivo de preguntas se encuentra en:
C:\MuServer\GameServer\Data\AntiBotQuestion.txt
Formato de cada línea: Pregunta,Respuesta_Correcta
De que color es el cielo durante el dia?,azul
Cuantas patas tiene un perro?,4
Que mes sigue a marzo?,abril
Cuanto es 7 mas 8?,15
Cual es la capital de Argentina?,Buenos Aires
Cuantos dias tiene una semana?,7
Cual es el oceano mas grande?,pacifico
Parte 2 — Detección vía SQL Server
Paso 4: Crear la Tabla de Registro de Sospechosos
Ejecuta lo siguiente en SSMS conectado a la base de datos MuOnline:
USE MuOnline;
GO
CREATE TABLE dbo.AntiBot_SuspectLog (
LogID INT IDENTITY(1,1) PRIMARY KEY,
AccountID VARCHAR(10) NOT NULL,
CharacterName VARCHAR(10) NOT NULL,
SuspectReason VARCHAR(200) NOT NULL,
KillsPerHour INT NULL,
OnlineHours DECIMAL(5,2) NULL,
PositionVariance INT NULL,
DetectedAt DATETIME DEFAULT GETDATE(),
ReviewStatus TINYINT DEFAULT 0
-- 0 = Pendiente, 1 = Bot Confirmado, 2 = Falso Positivo
);
GO
Paso 5: Crear el Procedimiento Almacenado de Detección
USE MuOnline;
GO
CREATE PROCEDURE dbo.SP_AntiBot_DetectSuspects
AS
BEGIN
SET NOCOUNT ON;
-- Detectar personajes con kills por hora por encima del umbral humano
INSERT INTO dbo.AntiBot_SuspectLog
(AccountID, CharacterName, SuspectReason, KillsPerHour, OnlineHours)
SELECT
a.memb___id,
c.Name,
'KillsPerHour superior a 1000 - posible bot de grinding',
c.PkCount,
DATEDIFF(MINUTE, s.ConnectTM, GETDATE()) / 60.0
FROM
Character c
INNER JOIN MEMB_STAT s ON c.AccountID = s.memb___id
INNER JOIN MEMB_INFO a ON c.AccountID = a.memb___id
WHERE
-- Kills por hora calculados desde el inicio de sesión
(c.PkCount / NULLIF(DATEDIFF(HOUR, s.ConnectTM, GETDATE()), 0)) > 1000
AND DATEDIFF(HOUR, s.ConnectTM, GETDATE()) >= 2
AND c.AccountID NOT IN (
SELECT AccountID FROM AntiBot_SuspectLog
WHERE CAST(DetectedAt AS DATE) = CAST(GETDATE() AS DATE)
AND ReviewStatus = 2 -- No reinsertar falsos positivos confirmados
);
-- Detectar cuentas en línea más de 22 horas consecutivas
INSERT INTO dbo.AntiBot_SuspectLog
(AccountID, CharacterName, SuspectReason, OnlineHours)
SELECT
s.memb___id,
c.Name,
'Sesion continua superior a 22 horas - posible bot 24/7',
DATEDIFF(MINUTE, s.ConnectTM, GETDATE()) / 60.0
FROM
MEMB_STAT s
INNER JOIN Character c ON s.memb___id = c.AccountID
WHERE
s.ConnStatus = 1
AND DATEDIFF(HOUR, s.ConnectTM, GETDATE()) > 22
AND s.memb___id NOT IN (
SELECT AccountID FROM AntiBot_SuspectLog
WHERE SuspectReason LIKE '%22 horas%'
AND CAST(DetectedAt AS DATE) = CAST(GETDATE() AS DATE)
);
PRINT 'Escaneo AntiBot completado: ' + CAST(GETDATE() AS VARCHAR);
END;
GO
Paso 6: Programar el Procedimiento en el Agente SQL Server
- Abre SSMS → expande Agente SQL Server → clic derecho en Trabajos → Nuevo trabajo
- Nombre:
AntiBot_Escaneo_Automatico - En la pestaña Pasos → Nuevo paso:
- Nombre del paso:
Ejecutar Deteccion - Tipo:
Script Transact-SQL (T-SQL) - Base de datos:
MuOnline - Comando:
EXEC dbo.SP_AntiBot_DetectSuspects;
- En la pestaña Programaciones → Nueva programación:
- Nombre:
Cada_30_minutos - Frecuencia: Diaria
- Subfrecuencia: Cada 30 minutos
- Hora de inicio:
00:00:00, Hora de fin:23:59:59
Agente SQL Server (MSSQLSERVER) tenga el estado En ejecución antes de probar el trabajo.Parte 3 — Configuración del ConnectServer
Paso 7: Limitar Conexiones por IP en ConnectServer
Edita el archivo C:\MuServer\ConnectServer\ConnectServer.ini:
[ServerInfo]
MaxConnectionPerIP = 3 ; Máximo de cuentas simultáneas por IP
ConnectionFloodLimit = 10 ; Intentos de conexión por segundo antes de bloquear
ConnectionFloodBanTime = 300 ; Duración del bloqueo en segundos (5 minutos)
PacketFloodProtection = 1 ; Habilitar protección contra flood de paquetes
MaxPacketsPerSecond = 50 ; Paquetes por segundo máximos por conexión
MaxConnectionPerIP=3 permite que jugadores en NAT compartida (familia, café internet) aún puedan acceder al servidor. Reduce a 2 solo si se detecta abuso significativo — valores más bajos aumentan las reclamaciones de jugadores legítimos en conexiones compartidas.Paso 8: Bloquear IPs de Datacenters Conocidos (Granjas de Bots)
Crea o edita C:\MuServer\ConnectServer\IPBanList.txt. Agrega rangos de IP de proveedores de VPS frecuentemente usados por granjas de bots:
# Formato: IP_INICIO IP_FIN
# Ejemplos de rangos de datacenters comunes
185.220.0.0 185.220.255.255
198.96.0.0 198.96.255.255
Parte 4 — Monitoreo y Respuesta
Paso 9: Consulta de Revisión Diaria
Ejecuta esta consulta cada mañana en SSMS para revisar la cola de sospechosos:
USE MuOnline;
GO
SELECT
LogID,
AccountID,
CharacterName,
SuspectReason,
KillsPerHour,
OnlineHours,
DetectedAt,
CASE ReviewStatus
WHEN 0 THEN 'Pendiente'
WHEN 1 THEN 'Bot Confirmado'
WHEN 2 THEN 'Falso Positivo'
END AS Estado
FROM dbo.AntiBot_SuspectLog
WHERE ReviewStatus = 0
ORDER BY DetectedAt DESC;
Paso 10: Banear una Cuenta Confirmada como Bot
Tras la revisión y confirmación manual, ejecuta:
USE MuOnline;
GO
-- Reemplaza 'CuentaSospechosa' con el AccountID real
UPDATE MEMB_INFO
SET bloc_code = 1
WHERE memb___id = 'CuentaSospechosa';
-- Registrar el baneo en el log de auditoría
UPDATE dbo.AntiBot_SuspectLog
SET ReviewStatus = 1
WHERE AccountID = 'CuentaSospechosa'
AND ReviewStatus = 0;
-- Opcional: desconectar inmediatamente si sigue en línea
UPDATE MEMB_STAT
SET ConnStatus = 0
WHERE memb___id = 'CuentaSospechosa';
Solución de Problemas
El GameServer ignora la configuración de AntiBot.ini Verifica que el archivo esté en el directorio correcto (GameServer\Data\) y que AntiBotEnable = 1 exista en GameServer.exe.cfg. Algunas compilaciones del GameServer requieren reinicio completo en lugar de recarga de configuración.
SP_AntiBot_DetectSuspects no inserta registros Confirma que las tablas MEMB_STAT y Character existen en la base de datos MuOnline y que la columna ConnStatus usa el valor 1 para en línea. Esto puede variar según la versión del servidor — verifica con: SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MEMB_STAT'.
Se generan demasiados falsos positivos Eleva el umbral de KillsPerHour a 1200 o 1500 y aumenta las horas mínimas en línea para detección de sesión larga a 24 horas. Calibra en base al comportamiento real de tus mejores jugadores — consulta el ranking de kills del servidor como referencia.
El Agente SQL Server no ejecuta el trabajo Revisa el historial del trabajo en SSMS (Agente SQL Server → Trabajos → clic derecho en el trabajo → Ver historial). Causas comunes: permisos insuficientes en la cuenta de servicio del Agente SQL, o la base de datos MuOnline fuera de línea en el momento de la ejecución programada.
El bloqueo por bloc_code no impide el inicio de sesión Verifica que el nombre exacto de la columna en tu schema sea bloc_code. Algunas compilaciones usan block_code o IsBlock. Confirma con: SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MEMB_INFO' AND COLUMN_NAME LIKE '%block%'.
Perguntas frequentes
¿El anti-bot nativo de MuServer es suficiente para proteger el servidor?
El anti-bot nativo ofrece una capa básica de protección, pero por sí solo no es suficiente. Se recomienda combinar la configuración del GameServer con verificaciones SQL periódicas, restricción de puertos en el firewall y, si es posible, una verificación de integridad del cliente (checksums) para una defensa en capas más robusta.
¿Cómo identificar si un personaje está usando bot desde la base de datos?
Consulta la tabla MEMB_STAT comparando LastLoginDate y LastLogoutDate con patrones de XP excesivo en ventanas de tiempo fijas. Monitorea también la tabla Character verificando PkCount acumulado por hora — los bots de grinding superan consistentemente 1000 kills por hora durante varias horas seguidas, algo imposible para un jugador humano.
¿Cuál es el valor recomendado para QuestionInterval en AntiBot.ini?
Para Season 6, el valor recomendado es 1800 segundos (30 minutos). Intervalos por debajo de 900 segundos irritan a jugadores legítimos en grinding normal. Valores superiores a 7200 segundos (2 horas) permiten que los bots operen durante períodos excesivamente largos entre verificaciones.
¿Qué hacer cuando el anti-bot causa desconexiones a jugadores legítimos?
Aumenta AntiBotCheckTime a 1000ms y revisa el umbral de MaxPacketsPerSec — valores por debajo de 150 causan kicks durante el uso de habilidades con múltiples proyectiles (BK Combo, Elf multi-shot). Verifica también que el Main.exe del cliente sea la versión correcta para tu servidor, ya que versiones desactualizadas disparan falsos positivos en el filtro de paquetes.