Chat global
Melhorias para o socket do HAPPY

Proteções Anti-DDoS e Segurança do Servidor Priston Tale
📋 Resumo das Proteções Implementadas
Este documento descreve todas as proteções implementadas no código do socket do servidor Priston Tale para prevenir ataques DDoS e exploits de pacotes maliciosos.
🛡️ 1. Proteção Contra Flood de Pacotes
Limite de Pacotes por Segundo
- MAX_PACKETS_PER_SECOND: 100 pacotes/segundo por conexão
- PACKET_FLOOD_WINDOW: Janela de 1 segundo para contagem
- Conexões que excedem este limite são marcadas como suspeitas e desconectadas
Implementação
struct FloodProtection {
DWORD dwLastResetTime;
UINT uPacketCount;
UINT uInvalidPacketCount;
DWORD dwLastActivityTime;
}
🚫 2. Proteção Contra Pacotes Inválidos
Validações Implementadas
- Tamanho Mínimo: Pacotes devem ter pelo menos
sizeof(Packet)
- Tamanho Máximo: Pacotes não podem exceder
smSOCKBUFF_SIZE
- Tamanho Declarado vs Recebido: Verifica consistência
- Limite de Pacotes Inválidos: Máximo de 10 pacotes inválidos antes de desconectar
Função de Validação
bool ValidatePacket(Packet* p, int iReceivedSize)
🌐 3. Controle de Conexões por IP
Limites Implementados
- MAX_CONNECTIONS_PER_IP: 3 conexões simultâneas por IP
- Conexões adicionais são rejeitadas automaticamente
- IPs que tentam exceder o limite recebem ban temporário
Rastreamento de IPs
struct IPConnectionTracker {
DWORD dwIP;
UINT uConnectionCount;
DWORD dwFirstConnectionTime;
DWORD dwBanExpireTime;
bool bTempBanned;
}
⏱️ 4. Sistema de Timeout de Conexão
Timeout de Inatividade
- CONNECTION_TIMEOUT: 30 segundos sem atividade
- Conexões inativas são automaticamente fechadas
- Previne conexões "zumbis" que consomem recursos
Timeout de Socket
DWORD timeout = CONNECTION_TIMEOUT;
setsockopt(s->sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));
🔨 5. Sistema de Banimento (Dual)
Ban Permanente
- IPs com comportamento extremamente malicioso
- Muitos pacotes inválidos (>= 10)
- Armazenado em
dwaIPListBan[MAX_BANCONNECTIONS]
Ban Temporário
- TEMP_BAN_DURATION: 5 minutos (300.000ms)
- Aplicado automaticamente para:
- Tentativa de múltiplas conexões simultâneas
- Flood de pacotes
- Comportamento suspeito moderado
- Expira automaticamente após o tempo definido
Limpeza Automática
void CleanupExpiredBans() // Executado a cada 60 segundos
🔍 6. Detecção de Atividade Suspeita
Critérios de Suspeita
- Mais de 100 pacotes por segundo
- Mais de 10 pacotes inválidos
- Timeout de inatividade
- Pacotes com tamanhos malformados
Marcação de Conexão
bool bSuspicious; // Flag na estrutura SocketData
📊 7. Proteções em Múltiplas Camadas
Camada 1: Listener (accept)
- Verifica se IP está banido antes de aceitar
- Rejeita conexões de IPs banidos imediatamente
- Limpa bans expirados periodicamente
Camada 2: SocketAccept
- Verifica limite de conexões por IP
- Aplica ban temporário se exceder limite
- Registra conexão no rastreador de IPs
Camada 3: ReceivePacket
- Valida tamanho do pacote antes de processar
- Conta pacotes inválidos
- Verifica flood de pacotes
- Retorna erro específico (0x6A6A) para DDoS
Camada 4: SocketPacket
- Verifica se conexão está marcada como suspeita
- Log de atividades suspeitas
- Aplica ban e fecha conexão se necessário
Camada 5: Receiver Thread
- Detecta código de erro DDoS (0x6A6A)
- Decide entre ban permanente ou temporário
- Log de ataques detectados
📝 8. Sistema de Logging
Eventos Registrados
// Atividade Suspeita
std::cout << "[SECURITY] Suspicious activity from IP: " << sd->szIP << std::endl;
// DDoS Detectado
std::cout << "[SECURITY] DDoS/Flood detected from IP: " << sd->szIP << std::endl;
// Ban Permanente
std::cout << "[SECURITY] IP permanently banned: " << [IP] << std::endl;
⚙️ 9. Configurações Ajustáveis
Constantes Principais
#define MAX_PACKETS_PER_SECOND 100 // Pacotes/segundo permitidos
#define MAX_INVALID_PACKETS 10 // Pacotes inválidos antes de ban
#define PACKET_FLOOD_WINDOW 1000 // Janela de tempo (1 seg)
#define MAX_PACKET_SIZE_MULTIPLIER 3 // Multiplicador de segurança
#define CONNECTION_TIMEOUT 30000 // 30 segundos timeout
#define MAX_CONNECTIONS_PER_IP 3 // Conexões por IP
#define TEMP_BAN_DURATION 300000 // 5 minutos ban temporário
Como Ajustar
Você pode modificar estas constantes em socket.h
e socketserver.h
conforme necessário:
- Servidor com muitos jogadores legítimos: Aumente
MAX_CONNECTIONS_PER_IP
para 5-10 - Ataques muito agressivos: Diminua
MAX_PACKETS_PER_SECOND
para 50 - Bans muito curtos: Aumente
TEMP_BAN_DURATION
para 600000 (10 min)
🔄 10. Compatibilidade com Cliente
Garantias de Compatibilidade
✅ Pacotes válidos do cliente são mantidos
- Validação apenas rejeita pacotes malformados
- Cliente legítimo nunca envia pacotes inválidos
✅ Handshake de conexão preservado
- Nenhuma modificação no protocolo de conexão
- Apenas adiciona validações de segurança
✅ Timeouts apropriados
- 30 segundos é suficiente para lag normal
- Cliente mantém keepalive automático
✅ Múltiplas contas do mesmo IP
- 3 conexões simultâneas permitem família jogando
- Ajustável se necessário
🚀 11. Como Compilar e Testar
Compilação
- Substitua os arquivos originais pelos novos
- Compile normalmente com seu compilador C++
- Certifique-se de ter suporte a
std::map
(C++11)
Teste de Funcionamento Normal
1. Conecte com cliente normal
2. Verifique se login funciona
3. Jogue normalmente por alguns minutos
4. Observe logs para confirmar ausência de falsos positivos
Teste de Proteção
1. Simule múltiplas conexões do mesmo IP (>3)
- Esperado: Rejeição após 3ª conexão
2. Envie muitos pacotes rapidamente
- Esperado: Desconexão após 100 pacotes/seg
3. Envie pacotes com tamanhos inválidos
- Esperado: Desconexão após 10 pacotes inválidos
4. Verifique logs para confirmação
📈 12. Melhorias Futuras (Opcionais)
Sugestões Adicionais
-
Whitelist de IPs
- Lista de IPs confiáveis sem limites
- Útil para GMs e administradores
-
Sistema de Rate Limiting Avançado
- Token bucket algorithm
- Limites diferentes por tipo de pacote
-
Detecção de Padrões
- Machine learning para detectar bots
- Análise de comportamento anormal
-
Dashboard de Segurança
- Interface web para monitorar ataques
- Estatísticas em tempo real
-
Integração com Firewall
- Banimento automático no iptables/Windows Firewall
- Proteção antes da aplicação
⚠️ 13. Avisos Importantes
Backups
⚠️ SEMPRE faça backup dos arquivos originais antes de aplicar as mudanças
Testes
⚠️ Teste em ambiente de desenvolvimento primeiro
- Não aplique diretamente em produção
- Verifique compatibilidade com seu cliente específico
Monitoramento
⚠️ Monitore os logs após implementação
- Verifique se há falsos positivos
- Ajuste as constantes se necessário
Atualização Gradual
⚠️ Recomendado aplicar em etapas:
- Primeiro: Validação de pacotes
- Segundo: Limite de conexões por IP
- Terceiro: Sistema de banimento
- Quarto: Detecção de flood
🐛 14. Troubleshooting
Problema: Jogadores legítimos sendo banidos
Solução: Aumente MAX_PACKETS_PER_SECOND
para 150-200
Problema: Família não consegue jogar junto
Solução: Aumente MAX_CONNECTIONS_PER_IP
para 5-10
Problema: Desconexões frequentes
Solução: Aumente CONNECTION_TIMEOUT
para 60000 (60 seg)
Problema: Ataques ainda passam
Solução:
- Diminua
MAX_INVALID_PACKETS
para 5 - Diminua
MAX_PACKETS_PER_SECOND
para 50 - Aumente
TEMP_BAN_DURATION
para 600000 (10 min)
📞 15. Suporte e Considerações Finais
Logs são Seus Amigos
Os logs implementados vão mostrar:
- Quando um IP é banido
- Por que foi banido (flood, pacotes inválidos, etc)
- IPs suspeitos
Monitoramento Contínuo
- Verifique os logs regularmente
- Ajuste as configurações conforme necessário
- Mantenha lista de IPs banidos atualizada
Performance
As proteções adicionam overhead mínimo:
- Validações são O(1)
- Mutex apenas em operações críticas
- Map para rastreamento de IPs é eficiente
✅ Checklist de Implementação
- [ ] Backup dos arquivos originais feito
- [ ] socket.h atualizado
- [ ] socket.cpp atualizado
- [ ] socketserver.h atualizado
- [ ] socketserver.cpp atualizado
- [ ] Código compilado com sucesso
- [ ] Teste de conexão normal funcionando
- [ ] Teste de múltiplas conexões funcionando
- [ ] Logs aparecendo corretamente
- [ ] Sistema de ban funcionando
- [ ] Servidor em produção monitorado
🎯 Conclusão
Estas proteções fornecem uma defesa robusta em múltiplas camadas contra:
- ✅ Ataques DDoS
- ✅ Flood de pacotes
- ✅ Buffer overflow
- ✅ Pacotes malformados
- ✅ Múltiplas conexões maliciosas
- ✅ Exploits de protocolo
- 20 Fóruns
- 225 Tópicos
- 1,260 Posts
- 2 Online
- 224 Membros