Este script em Perl é uma implementação básica de um servidor que monitora e bloqueia IPs com base no número de conexões feitas a ele. A seguir, uma explicação detalhada de cada parte do código:
strict e warnings: Impõem regras rigorosas de sintaxe e emitiram avisos para possíveis erros de programação.
POSIX ":sys_wait_h": Importa funções de manipulação de processos e espera de status, embora não esteja sendo usado diretamente aqui.
Socket: Módulo utilizado para manipulação de sockets TCP.
IO::Handle: Fornece métodos para trabalhar com objetos de fluxo de entrada/saída (não utilizado explicitamente no código, mas geralmente presente quando você deseja usar funções como flush).
2. Configuração de variáveis:
$limite_conexoes: Número máximo de conexões permitidas de um único IP (50 neste caso).
$tempo_bloqueio: O tempo durante o qual o IP ficará bloqueado após ultrapassar o limite de conexões, configurado como 4 horas (4 * 3600 segundos).
3. Armazenamento das conexões:
%conexoes_por_ip: Um hash para armazenar o número de conexões feitas por cada IP.
4. Configuração de regras no iptables:
iptables -F: Limpa todas as regras do iptables anteriores.
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT: Aceita conexões de entrada que já estejam estabelecidas ou relacionadas a uma conexão existente.
iptables -A INPUT -j DROP: Bloqueia todas as outras conexões de entrada.
iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above $limite_conexoes -j REJECT --reject-with tcp-reset: Limita o número de conexões simultâneas de um único IP, rejeitando aquelas que excedem o limite definido.
5. Configuração do socket e aceitação de conexões:
socket: Cria um novo socket TCP.
setsockopt: Permite a reutilização de endereços e portas.
bind: Associa o socket ao endereço e porta definidos (no caso, qualquer endereço INADDR_ANY e porta 0).
listen: Coloca o socket em modo de escuta para aceitar conexões.
6. Loop para aceitar conexões:
O script entra em um loop infinito onde fica aceitando conexões.
accept: Aceita uma nova conexão do cliente.
sockaddr_in e inet_ntoa: Obtêm a porta e o IP do cliente.
$conexoes_por_ip{$ip_cliente}++: Incrementa o contador de conexões para o IP do cliente.
Se o número de conexões do cliente ultrapassar o limite, o IP é bloqueado.
7. Função de bloqueio do IP:
open e print: Registra o IP bloqueado no arquivo ban.txt.
system("iptables -A INPUT -s $ip -j DROP"): Adiciona uma regra ao iptables para bloquear o IP.
sleep($tempo_bloqueio): Espera o tempo de bloqueio configurado (4 horas).
system("iptables -D INPUT -s $ip -j DROP"): Remove a regra do iptables e desbloqueia o IP.
Considerações:
Este script age como um servidor simples, monitorando as conexões e bloqueando IPs que ultrapassam o limite de conexões definidas.
O bloqueio é temporário (4 horas), após o qual o IP é desbloqueado.
O arquivo ban.txt mantém um registro dos IPs bloqueados.
Se você tiver alguma dúvida ou quiser fazer ajustes no código, é só avisar!
Fonte : Chat GPT