sexta-feira, 3 de julho de 2026

Solucao de Falha Critica no Fail2ban: Corrigindo o Erro NameError poll2 e Estouro de File Descriptors no Python

Este artigo documenta a analise tecnica e o passo a passo para a resolucao de uma falha critica no Fail2ban em ambientes Linux. Se o seu serviço de protecao parou de responder, falhou ao iniciar ou entrou em loop infinito de erros de socket, acompanhe a sequencia exata dos eventos e como aplicar a mitigacao definitiva.


1. Cronologia da Falha e Diagnostico dos Sintomas

O problema nao ocorre de forma isolada; ele se manifesta em uma cadeia progressiva de erros que culminam na queda total do sistema de mitigacao de ataques.

Fase 1: O Sintoma Inicial — Too many open files (Errno 24)
Sob alto volume de acessos ou durante um escaneamento massivo de bots, o Fail2ban comeca a registrar falhas de conexao no arquivo de log. O primeiro sinal de alerta e o esgotamento dos descritores de arquivo do processo:

[Errno 24] Too many open files

O serviço tenta continuar rodando, mas a contagem de erros de escuta (err_count['listen']) comeca a subir rapidamente.


Fase 2: O Serviço para de Iniciar e Responder
Apos o estouro de descritores, o daemon do Fail2ban trava. Ao tentar reiniciar o serviço ou checar a comunicacao com o comando fail2ban-client ping, o cliente para de receber resposta do servidor (sem o retorno esperado de Server replied: pong). O socket IPC em /var/run/fail2ban/fail2ban.sock deixa de responder ou e corrompido.


Fase 3: A Causa Raiz no Backend — filedescriptor out of range in select()
Ao depurar o arquivo do servidor assincrono do Fail2ban (/usr/lib/python3/dist-packages/fail2ban/server/asyncserver.py), identifica-se que o motor interno do sistema esta utilizando a chamada legada select.select() do Python.

No sistema operacional Linux, a syscall select() possui um limite rigoroso e hardcoded de 1024 arquivos abertos (FD_SETSIZE). Quando o servidor web abre o descritor de arquivo de numero 1025 ou superior, o Python dispara a seguinte excecao fatal:

ValueError: filedescriptor out of range in select()

Isso faz com que o loop de eventos do Fail2ban quebre imediatamente.


Fase 4: A Falha na Re-definicao — NameError: name 'poll2' is not defined
Para contornar a limitação de 1024 arquivos do select(), a solucao teorica e alterar o motor de eventos para usar a syscall poll() do kernel (que suporta dezenas de milhares de descritores). Porem, ao tentar ajustar o codigo para utilizar a funcao poll2() do modulo asyncore, o interpretador Python dispara um novo erro:

File "/usr/lib/python3/dist-packages/fail2ban/server/asyncserver.py", line 165, in loop
poll2(timeout)
NameError: name 'poll2' is not defined. Did you mean: 'poll'?

Esse erro ocorre porque a funcao poll2 nao esta presente ou nao foi exportada no namespace padrao da biblioteca asyncore na versao do Python em execucao no sistema.


Hipotese de Adulteracao / Vetor de Ataque: Existe uma forte suspeita de que essa sequencia de alteracoes ou a inoperancia da funcao poll2 possa ter sido induzida ou explorada deliberadamente por atacantes. Ao forcar o Fail2ban a retroceder para o algoritmo select() (limitado a 1024 FDs), um atacante consegue derrubar o serviço gerando um volume controlado de conexoes concorrentes. Com o Fail2ban inativo e sem conseguir reiniciar, o servidor fica vulneravel para ataques de forca bruta e scanners automatizados sem qualquer bloqueio no firewall.


2. Solucao Passo a Passo e Mitigacao Definitiva

Para corrigir a cadeia de erros, reestabelecer o serviço e migrar a filtragem para a syscall poll() nativa, siga as etapas abaixo.

Passo 1: Corrigir o arquivo asyncserver.py
Abra o arquivo de codigo do Fail2ban:

sudo nano /usr/lib/python3/dist-packages/fail2ban/server/asyncserver.py

Localize o bloco da funcao loop por volta da linha 160. Substitua a chamada com falha para garantir a importacao da funcao poll2 diretamente do asyncore antes do laço principal:

# Codigo corrigido no asyncserver.py:

from asyncore import poll2
while active():
    try:
        poll2(timeout)
        if err_count['listen']:
            err_count['listen'] -= 1
    except Exception as e:
        if not active():
            break
        err_count['listen'] += 1

Nota tecnica: Caso o seu ambiente Python nao exporte o simbolo poll2 dentro de asyncore, utilize a chamada nativa do motor assincrono especificando o parametro poll: asyncore.loop(timeout=timeout, use_poll=True, count=1).


Passo 2: Definir a acao do Firewall para IPTables
Se o seu ambiente utiliza o IPTables tradicional e voce precisa garantir a criacao das cadeias f2b- sem conflitos com o nftables, edite o arquivo /etc/fail2ban/jail.local:

[DEFAULT]
banaction = iptables-multiport
banaction_allports = iptables-allports
backend = auto


Passo 3: Limpeza de Sockets Presos e Reinicializacao
Como o Fail2ban falhou ao iniciar anteriormente, limpe os arquivos de socket residuais em memoria antes de subir o daemon:

sudo systemctl stop fail2ban
sudo rm -rf /var/run/fail2ban/*
sudo systemctl start fail2ban


3. Procedimento de Validacao

Apos aplicar a correcao, execute o protocolo de verificacao para atestar a estabilidade do serviço:

1. Teste de resposta do Daemon:
Execute sudo fail2ban-client ping. O resultado deve ser estritamente Server replied: pong.

2. Verificacao das cadeias no IPTables:
Execute sudo iptables -L -n -v e confirme que as tabelas de bloqueio (ex: f2b-sshd, f2b-apache-400) foram criadas e estao prontas para receber regras de banimento.

3. Inspeçao do arquivo de Log:
Acompanhe os logs com tail -f /var/log/fail2ban.log. O serviço devera registrar o processamento normal dos arquivos de log sem apresentar excecoes de descritores de arquivos ou erros no loop do Python.


Conclusao: A substituicao do algoritmo de selecao de sockets do select() para o poll() no motor assincrono do Python elimina o limite de 1024 arquivos abertos, estabilizando o Fail2ban e neutralizando o vetor de ataque por esgotamento de descritores.

domingo, 29 de setembro de 2024

Como transformar um torno em tacômetro e contador de voltas com Arduino e Sensor Hall

Quem trabalha com máquinas operatrizes ou oficinas em geral sabe como é útil ter uma leitura precisa da velocidade de rotação do equipamento. Recentemente, desenvolvi um projeto para instalar um sensor Hall e um display de 7 segmentos no meu torno mecânico usando um Arduino Nano.

A grande vantagem dessa implementação é que o circuito ganhou dupla função:
1. Modo F001 (Tacômetro / RPM): Mede as rotações por minuto em tempo real.
2. Modo F002 (Contador de Voltas): Conta o número total de voltas acumuladas, ideal para tarefas de precisão como enrolamento de fios, bobinas e transformadores.

Como Funciona o Circuito

O sensor Hall fica posicionado no eito/árvore do torno para detectar a passagem de um pequeno ímã. Cada passagem aciona uma interrupção digital no pino D2 do Arduino Nano, garantindo que nenhum pulso seja perdido, mesmo em altas velocidades.

O painel conta com um display de 7 segmentos de 4 dígitos (gerenciado pela biblioteca SevSeg) e dois botões de controle:
- Botão SET (pino A4): Alterna entre as funções F001 (RPM) e F002 (Contador de Voltas), exibindo a indicação da função escolhida no display por 2 segundos.
- Botão RESET (pino A5): Zera a contagem de voltas quando o sistema está no modo F002.

Aplicações Práticas

- Uso em Usinagem: Acompanhar a rotação exata ajuda a selecionar a velocidade de corte adequada para diferentes materiais e ferramentas.
- Uso como Rebobinadora: O modo contador facilita imensamente o enrolamento de bobinas, pequenos transformadores e motores de forma precisa sem precisar contar manualmente.

Código Completo para Arduino Nano

(NOVO) Código disponível para download em: https://github.com/aobatroz/rpmcounter-4digit-display

Abaixo está o código-fonte desenvolvido. Para compilá-lo, certifique-se de ter a biblioteca SevSeg instalada na sua IDE do Arduino:

#include <SevSeg.h>
SevSeg sevseg;

#define MAX_WAIT_FREQ 2000

const byte ledPin = 13;
const byte interruptPin = 2; // contador de pulso (Sensor Hall)
const byte setButtonPin = A4; // botao set
const byte resetButtonPin = A5; // botao reset
const byte digitPins[] = {A0, 3, 4, 5}; // pinos dos digitos do display
const byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13}; // pinos dos segmentos

unsigned long interruptCount = 0; // Contador de interrupcoes
unsigned long rpmCount = 0;
double rps = 0;
unsigned long lastPulse = millis();
unsigned long interval = 0;
unsigned long refreshTime = millis();
unsigned int mode = 0;
unsigned int functionMode = 1; // 1 para F001 (RPM), 2 para F002 (Contador)
bool forceDisplayValue = false;

void interruptFunction()
{
    interval = millis() - lastPulse;
    lastPulse = millis();
    interruptCount++; // Incrementa o contador de interrupcoes
}

void displayFunctionMode()
{
    char buffer[5];
    snprintf(buffer, sizeof(buffer), "F00%d", functionMode); // Formata a string F00X
    sevseg.setChars(buffer); // Exibe no display
    for (unsigned long start = millis(); millis() - start < 2000;) { // Exibe por 2 segundos
        sevseg.refreshDisplay();
    }
    sevseg.blank(); // Apaga o display
    sevseg.refreshDisplay();
}

void setup()
{
    Serial.begin(9600);

    const byte numDigits = 4;
    bool resistorsOnSegments = 0;

    pinMode(interruptPin, INPUT_PULLUP);
    pinMode(setButtonPin, INPUT_PULLUP);
    pinMode(resetButtonPin, INPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(interruptPin), interruptFunction, RISING);

    sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins, resistorsOnSegments);
    sevseg.setBrightness(10);

    displayFunctionMode();
}

void F001()
{
    // Calculando rps (rotacoes por segundo)
    rps = 0;
    if (interval > 0 && (millis() - lastPulse) < MAX_WAIT_FREQ) // ignora leituras muito lentas
    {
        rps = 1000.0 / interval;
    }

    if ((millis() > refreshTime))
    {
        Serial.println(rps);
        sevseg.setNumber(rps * 60); // Converte RPS para RPM
        refreshTime = millis() + 200;
    }
}

void F002()
{
    static unsigned long lastInterruptCount = -1;

    if (digitalRead(resetButtonPin) == LOW)
    {
        interruptCount = 0; // Reseta o contador
    }

    if ((lastInterruptCount != interruptCount) || forceDisplayValue)
    {
        lastInterruptCount = interruptCount;
        Serial.println(interruptCount);
        sevseg.setNumber(interruptCount);        
        forceDisplayValue = false;
    }
}

void loop()
{
    // Alterna o modo ao pressionar o botao SET
    if (digitalRead(setButtonPin) == LOW)
    {
        functionMode = (functionMode % 2) + 1; // Alterna entre 1 e 2
        displayFunctionMode(); // Exibe o modo por 2 segundos
        forceDisplayValue = true;
        delay(200); // Debounce
    }

    if (functionMode == 1)
    {
        F001();
    }
    else if (functionMode == 2)
    {
        F002();
    }

    sevseg.refreshDisplay();
}

Se você gostou da ideia, pretende aplicar em alguma máquina aí da sua oficina ou tem sugestões de melhorias no código, deixe seu comentário!

segunda-feira, 27 de dezembro de 2021

Como consertar painel LED usando fita LED e SEM NECESSIDADE DE FONTE!

Quem trocou todas as lâmpadas e luminárias de casa por painéis LED em busca de economia e sustentabilidade provavelmente já passou pela raiva de ver um painel parar de funcionar do nada. Na grande maioria das vezes, o problema não está nos LEDs, mas sim no módulo da fonte (driver) de baixa qualidade que vem junto com o produto.

Depois que o meu painel queimou a fonte pela segunda vez — e o valor de uma fonte nova já equivalia ao preço de um painel inteiro —, decidi dar uma solução definitiva: consertar o painel LED usando fita LED e ligando tudo DIRETO na energia (120V), eliminando a fonte para sempre!

Confira o tutorial completo e o teste de iluminação no link abaixo:

Entendendo o Conceito: Ligação em Série sem Fonte

A fita LED comercial (sugiro a de 24V) é dividida em blocos em paralelo. Se cortarmos 5 pedaços contendo esses blocos e os ligarmos em série (unindo o positivo de um ao negativo do outro), o resultado é um conjunto que opera na tensão combinada próxima a 120V da rede elétrica residencial.

Porém, ao ligar a corrente alternada (AC) direto nessa fita, os LEDs piscam 60 vezes por segundo e parecem apagados aos nossos olhos. É aí que entra o segredo do projeto!

A Ponte Retificadora (Full Bridge Rectifier)

Para resolver o oscilar da corrente e manter os LEDs acesos de forma contínua, utilizamos uma ponte retificadora de onda completa. Apesar do nome técnico, é um dos circuitos mais simples e baratos da eletrônica:
1. Você precisa apenas de 4 diodos (que custam centavos ou podem ser retirados de qualquer sucata eletrônica).
2. Solda-se os 4 diodos em formato de losango, prestando atenção no sentido das faixas indicadoras.
3. A corrente alternada entra de um lado e sai transformada em corrente contínua do outro, suficiente para alimentar os LEDs perfeitamente.

Passo a Passo da Montagem

1. Medição e Corte: Meça o perímetro interno da moldura do painel (no meu caso, um painel quadrado de 25 cm precisou de 1 metro total de fita).
2. Divisão dos Pedaços: Divida esse comprimento em 5 pedaços iguais (20 cm cada) para fazer a ligação em série.
3. Isolamento e Fixação: Remova as pontas de cobre desnecessárias de cada lado para evitar curtos, cole as fitas na moldura original e faça a soldagem dos pedaços em série usando fio esmaltado fino.
4. Conexão Final: Solde a ponte retificadora compacta na entrada dos LEDs e conecte ao plugue da tomada.

Resultado Final

O painel ficou extremamente forte, iluminando muito mais do que com a fita original e, o melhor de tudo: sem nunca mais precisar gastar dinheiro trocando fontes queimadas!

Se você gostou da ideia e quer economizar recuperando suas luminárias encostadas, deixe seu comentário no blog ou no canal!

domingo, 16 de setembro de 2018

Como consertar o botão Ligar do micro-ondas gastando quase nada

Quem nunca passou pelo perrengue de ter um eletrodoméstico parado por causa de um detalhe bobo? O micro-ondas Panasonic Piccolo aqui de casa parou de funcionar porque o botão "Ligar" não dava mais contato de jeito nenhum.

Por ser a tecla mais usada da membrana (o contato bolha do painel), ela acabou desgastando com o tempo. Ao pesquisar a peça de reposição na internet, o valor do painel com o frete passava de R$ 70,00, e nas lojas locais não havia o modelo em estoque. A solução? Criar uma modificação prática e estilosa para resolver o problema: bypass do botão ligar no circuito de teclado! Sim, a análise de TI também serve para salvar o seu almoço!

Confira o vídeo com o passo a passo da modificação no link abaixo:

Aviso Importante de Segurança

Atenção: Aparelhos de micro-ondas trabalham com altíssima voltagem e capacitores que armazenam cargas perigosas mesmo desligados da tomada. Nos testes do vídeo, o relé do magnetron foi desligado para garantir total segurança contra radiação e choques. Se você não tem experiência com eletrônica, tome extremo cuidado ou consulte um profissional.

O Diagnóstico e a Solução

Ao remover a membrana do painel, temos acesso à placa de circuito com as trilhas de contato. Mapeando o circuito, identifiquei quais pinos do flat eram responsáveis por fechar o contato do botão "Ligar".

Para substituir a tecla defeituosa:
1. Soldei dois fios diretamente nos pontos de contato da placa correspondentes à função "Ligar".
2. Adaptei um botão físico do tipo botoeira na outra extremidade dos fios.
3. Para dar um acabamento personalizado e divertido, utilizei uma botoeira verde de fliperama (arcade) que eu tinha sobrando e fiz o encaixe no plástico do painel.

Isolando o Botão Defeituoso

Um detalhe crucial nesse tipo de reparo: quando o botão do painel bolha estraga, ele costuma ficar em curto (como se estivesse permanentemente pressionado), travando as outras teclas do micro-ondas.

Para resolver isso, abri a camada da membrana e usei uma gilete para interromper as trilhas do botão defeituoso. Isso isolou o contato em curto e permitiu que a nova botoeira de fliperama assumisse o comando perfeitamente.

Resultado Final

Embora o isolamento das trilhas tenha desativado duas teclas secundárias do teclado numérico (os números 7 e 0), a usabilidade não foi afetada no dia a dia. Basta utilizar a função "Mais 1 Minuto" ou os outros números e acionar o grande botão de fliperama para iniciar o aquecimento!

Se você tem um micro-ondas encostado pelo mesmo motivo ou curte projetos de reparo e modificação em casa, deixe seu comentário no blog ou no vídeo!

domingo, 26 de agosto de 2018

Dica simples para consertar secador de cabelo e eletrodomésticos em geral

Sabiam que problemas elétricos também afetam a TI? Então nada melhor do que saber consertar algo que possa servir para uma gama enorme de nichos diferentes! Sabe aquele eletrodoméstico que para de funcionar do nada e fica esquecido no armário por meses? Foi exatamente o que aconteceu por aqui com este secador de cabelo. Ele ficou parado por mais de um ano e meio porque, ao colocar na tomada e ligar os botões, não dava nenhum sinal de vida.

A gente já estava quase jogando o aparelho fora, mas resolvi abrir para dar uma olhada e tentar consertar. A surpresa? O problema era muito mais simples do que parecia!

Confira o vídeo com o passo a passo completo do conserto no link abaixo:

O diagnóstico do problema

Ao desmontar o secador, verifiquei que o motor e as escovas estavam em perfeito estado. Testei a continuidade dos interruptores e botões, e todos estavam funcionando normalmente.

Aí veio uma dica de ouro do meu pai para qualquer manutenção elétrica ou eletrônica:
Antes de mexer em componentes complexos, verifique sempre o cabo de energia primeiro!

Muitas vezes a gente quebra a cabeça achando que o motor queimou ou que a placa estragou, quando na verdade o defeito está no próprio fio elétrico.

Como foi feito o teste (Bypass)

Para testar se o problema era realmente o cabo sem precisar dessoldar tudo de início, fiz um teste em paralelo (bypass):

1. Peguei um cabo auxiliar de energia que eu sabia que estava funcionando.
2. Liguei esse cabo nos pontos de entrada do circuito do secador.
3. Com o circuito isolado e os botões ligados, conectei o cabo de teste na tomada.
4. O motor funcionou perfeitamente e na hora!

A causa: Apenas 8 centímetros de fio partido!

Procurando onde estava a interrupção, descobri que o fio estava quebrado por dentro logo nos primeiros centímetros perto do plugue — a região que mais sofre dobras e torções no uso diário.

O secador ficou guardado e inútil por mais de um ano por causa de apenas 8 centímetros de cabo quebrado! Bastou cortar o pedaço danificado, reaproveitar o plugue original, fazer uma nova solda reforçada e remontar a carcaça.

A lição para seus próximos consertos

Sempre comece o diagnóstico do mais simples para o mais complexo. Verifique cabo de força, fusíveis, conectores e tomadas antes de condenar o motor ou a eletrônica do seu equipamento. Na maioria das vezes, o reparo é rápido, barato e evita o descarte desnecessário.

Se você gostou da dica ou conseguiu salvar algum eletrodoméstico aí na sua casa ou mesmo seu computador ou servidor da sua empres, deixe seu comentário no blog ou no vídeo!

sábado, 23 de dezembro de 2017

Por que a Internet discada usava o telefone?

Por que quando falamos de Internet temos uma conexão muito forte com os telefones? Na Internet discada, por exemplo, só era possível acessar a grande rede mundial discando para um número de telefone da operadora!

Para responder a essa e outras dúvidas de forma simples e objetiva, estou inaugurando uma nova série no canal chamada Bit Amarelo. A proposta é desmistificar conceitos de informática e entender o passado da tecnologia para compreender melhor como chegamos até aqui.

Se você não viveu essa época ou quer relembrar aquele barulho clássico da conexão discada, assista ao vídeo completo no link abaixo:

O grande desafio dos anos 90

Imagine que estamos no início da década de 1990. A Internet no Brasil ainda não existia para o grande público, e a sua missão fosse conectar todos os computadores do país entre si e com o restante do mundo. Como fazer isso do zero?

Passar cabos por todas as cidades, estados e oceanos exigiria um investimento astronômico. Naquela época, a Internet ainda era uma grande incógnita e nenhuma empresa tinha certeza se o investimento traria retorno.

A solução que já estava pronta: As Linhas Telefônicas

Para resolver esse problema sem gastar fortunas do zero, os criadores da rede utilizaram uma infraestrutura que já cruzava o planeta desde o século XIX: a rede telefônica.

Como as linhas de telefone já chegavam às casas e escritórios em quase todo o mundo, bastou utilizar essa malha existente para transportar os dados entre os computadores. O cabo do telefone era conectado ao modem e, através de um ruído audível de frequências sonoras, a comunicação se estabelecia.

E hoje em dia?

Atualmente temos conexões de fibra ótica, cabos dedicados e redes sem fio de alta velocidade. Isso acontece porque a demanda por Internet cresceu a ponto de justificar investimentos bilionários em infraestrutura própria.

No entanto, sem a infraestrutura prévia dos telefones no início de tudo, a popularização da rede mundial de computadores teria demorado muito mais anos para acontecer.

Participe e Deixe sua Dúvida!

O que você achou dessa explicação? Ficou com alguma dúvida sobre seu computador, celular ou história da tecnologia?
Deixe sua pergunta nos comentários do blog ou no vídeo do YouTube!

quarta-feira, 2 de novembro de 2016

Campainha inteligente com Arduino Nano e módulo DFPlayer Mini / MP3-TF-16

Esse projeto visa criar uma campainha que dá play em sons de forma sequencial e também de forma individual, dependendo do número de cliques no botão da campainha.

Lógica de Funcionamento:

  • 1 clique curto (tempo menor que LONG_PRESS_WINDOW_MS): toca o próximo som;
  • 2 cliques curtos: toca o primeiro som da lista;
  • 3 cliques curtos: toca o segundo som da lista;
  • N cliques curtos: toca o (N-1)º som da lista;
  • 1 clique longo (tempo maior que LONG_PRESS_WINDOW_MS): equivale a 5 cliques curtos.

PINOUT (Arduino Nano → MP3-TF-16P)

BUTTON_PIN   = 2;   // Botão da campainha (PULL_UP)
MP3_NEXT_PIN = 5;   // Conectado ao IO2 do MP3-TF-16P
MP3_BUSY_PIN = 10;  // Conectado ao pino BUSY do MP3-TF-16P
MP3_RX_PIN   = A1;  // Conectado ao pino RX do MP3-TF-16P
MP3_TX_PIN   = A0;  // Conectado ao pino TX do MP3-TF-16P
Dica de Montagem: Se você utilizar a pinagem acima, um Arduino Nano e o módulo MP3-TF-16P, é possível soldar o MP3 diretamente acima do Arduino Nano, sem precisar de fios nem protoboard (talvez precise cortar alguns pinos não usados do MP3 para que não deem contato com o Arduino).
(NOVO) Código disponível para download em: https://github.com/aobatroz/campainha-arduino-mp3