<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Evandro Carvalho</title>
    <description>The latest articles on DEV Community by Evandro Carvalho (@evandro_carvalho_ad7433b6).</description>
    <link>https://dev.to/evandro_carvalho_ad7433b6</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3896837%2F6c62ab48-1718-4150-a342-a399da3c8220.png</url>
      <title>DEV Community: Evandro Carvalho</title>
      <link>https://dev.to/evandro_carvalho_ad7433b6</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/evandro_carvalho_ad7433b6"/>
    <language>en</language>
    <item>
      <title>Acesso Remoto Seguro sem Abrir Portas no Roteador: Implementando Redes Mesh com Tailscale e WireGuard</title>
      <dc:creator>Evandro Carvalho</dc:creator>
      <pubDate>Tue, 27 Oct 2026 21:38:50 +0000</pubDate>
      <link>https://dev.to/evandro_carvalho_ad7433b6/acesso-remoto-seguro-sem-abrir-portas-no-roteador-implementando-redes-mesh-com-tailscale-e-30n5</link>
      <guid>https://dev.to/evandro_carvalho_ad7433b6/acesso-remoto-seguro-sem-abrir-portas-no-roteador-implementando-redes-mesh-com-tailscale-e-30n5</guid>
      <description>&lt;p&gt;Acessar ambientes de desenvolvimento locais, servidores de home lab ou painéis de administração a partir de redes externas (via 4G/5G ou Wi-Fi público) sempre foi um desafio repleto de atritos técnicos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Bloqueio de CGNAT (Carrier-Grade NAT)&lt;/strong&gt;: Provedores de internet não entregam mais endereços IPv4 públicos para residências, impossibilitando o tradicional redirecionamento de portas (&lt;em&gt;Port Forwarding&lt;/em&gt;);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risco de Segurança de Portas Abertas&lt;/strong&gt;: Expor portas TCP/UDP abertas diretamente na WAN atrai enxames de scanners automatizados, ataques de força bruta e tentativas de exploit;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complexidade de VPNs Legadas&lt;/strong&gt;: Configurar OpenVPN tradicional exige gerenciar certificados SSL complexos, servidores dedicados e ajustes manuais de roteamento.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A solução moderna para essa dor de cabeça é a &lt;strong&gt;rede em malha (Mesh VPN)&lt;/strong&gt; baseada no protocolo ultraleve &lt;strong&gt;WireGuard&lt;/strong&gt;, orquestrada pelo &lt;strong&gt;Tailscale&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Neste artigo prático, você aprenderá como subir uma malha segura ponto a ponto em menos de 5 minutos, garantindo acesso direto sem abrir nenhuma porta no roteador.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Como o Tailscale Fura o CGNAT (NAT Traversal)
&lt;/h2&gt;

&lt;p&gt;Diferente de VPNs tradicionais que canalizam todo o tráfego através de um servidor central (hub-and-spoke), o Tailscale implementa uma &lt;strong&gt;topologia em malha ponto a ponto&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌───────────────────────────┐                 ┌───────────────────────────┐
│     NOTEBOOK NA RUA       │                 │     SERVIDOR DE CASA      │
│      (Rede 4G Móvel)      │                 │    (Atrás de CGNAT / Wi-Fi)│
│  IP Tailscale: 100.80.1.5 │                 │  IP Tailscale: 100.80.1.20 │
└─────────────┬─────────────┘                 └─────────────┬─────────────┘
              │                                             │
              │  TÚNEL CRIPTOGRAFADO PONTO A PONTO (WIREGUARD)│
              └─────────────────────────────────────────────┘
                    (Bypass Automático de Firewall via STUN/DERP)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Utilizando técnicas avançadas de &lt;strong&gt;STUN (Session Traversal Utilities for NAT)&lt;/strong&gt; e servidores DERP de apoio temporário, os dois dispositivos negociam chaves públicas e estabelecem uma conexão UDP direta criptografada ponta a ponta sem intermediação de pacotes.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Instalação e Configuração no Servidor Linux
&lt;/h2&gt;

&lt;p&gt;No terminal do seu servidor (Raspberry Pi, Mini PC ou VPS):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Instalação do repositório oficial do Tailscale&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://tailscale.com/install.sh | sh

&lt;span class="c"&gt;# Iniciar autenticação e registrar o nó na sua malha&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tailscale up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O comando exibirá uma URL de login. Abra o link no navegador, faça login com sua conta (GitHub, Google ou Microsoft) e seu servidor receberá instantaneamente um &lt;strong&gt;IP privado fixo na faixa &lt;code&gt;100.x.y.z&lt;/code&gt;&lt;/strong&gt; com nome amigável via &lt;strong&gt;MagicDNS&lt;/strong&gt; (ex: &lt;code&gt;servidor-casa.tailnet.ts.net&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Acessando com MagicDNS sem Decorar IPs
&lt;/h2&gt;

&lt;p&gt;Uma das maiores facilidades é a resolução nativa de nomes DNS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No seu notebook ou celular conectado à sua conta Tailscale, você pode acessar seu servidor simplesmente digitando:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh usuario@servidor-casa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou abrir aplicações web locais no navegador:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://servidor-casa:8080   (Open WebUI)
http://servidor-casa:11434  (Ollama REST API)
http://servidor-casa:3000   (Next.js Dev Server)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Recursos Avançados de Rede
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Subnet Routers (Roteador de Sub-rede)&lt;/strong&gt;: Você pode configurar seu servidor Linux para atuar como gateway, permitindo que você acerte qualquer outro dispositivo da sua casa (inclusive impressoras e TVs que não rodam Tailscale) a partir do seu notebook na rua:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;sudo &lt;/span&gt;tailscale up &lt;span class="nt"&gt;--advertise-routes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;192.168.1.0/24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exit Nodes (Nó de Saída)&lt;/strong&gt;: Transforme seu servidor doméstico no seu gateway de internet, garantindo navegação 100% criptografada ao usar Wi-Fi aberto em cafés e aeroportos.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusão e Recursos
&lt;/h2&gt;

&lt;p&gt;A combinação de criptografia moderna com automação de topologia mesh tornou as VPNs corporativas antigas obsoletas. Você ganha velocidade nativa de WireGuard, zero portas expostas e acesso contínuo a qualquer serviço.&lt;/p&gt;

&lt;p&gt;Confira a análise detalhada sobre roteadores compatíveis com OpenWrt e arquiteturas de borda no meu blog:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://sentinel.vexisone.com/tutoriais/acesso-remoto-seguro-tailscale-wireguard-sem-abrir-portas-2026" rel="noopener noreferrer"&gt;Artigo Completo no Vexis Sentinel&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Você ainda usa redirecionamento de portas tradicional ou já migrou seus serviços para Tailscale / Cloudflare Tunnel? Compartilhe sua experiência!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>networking</category>
      <category>vpn</category>
      <category>linux</category>
      <category>devops</category>
    </item>
    <item>
      <title>PHP2Shell: Como a IA Revelou Vulnerabilidades Críticas no Núcleo do PHP e Acelerou a Defesa de Servidores</title>
      <dc:creator>Evandro Carvalho</dc:creator>
      <pubDate>Sat, 24 Oct 2026 17:16:51 +0000</pubDate>
      <link>https://dev.to/evandro_carvalho_ad7433b6/php2shell-como-a-ia-revelou-vulnerabilidades-criticas-no-nucleo-do-php-e-acelerou-a-defesa-de-38jh</link>
      <guid>https://dev.to/evandro_carvalho_ad7433b6/php2shell-como-a-ia-revelou-vulnerabilidades-criticas-no-nucleo-do-php-e-acelerou-a-defesa-de-38jh</guid>
      <description>&lt;p&gt;Em outubro de 2026, a comunidade global de infraestrutura e cibersegurança foi confrontada com o &lt;strong&gt;PHP2Shell&lt;/strong&gt;: um conjunto de vulnerabilidades críticas no núcleo da linguagem PHP (CVSS 9.2) que permite &lt;strong&gt;Execução Remota de Código (RCE) sem autenticação&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Além do impacto direto em sistemas que sustentam mais de 70% da web (WordPress, Drupal, Joomla, Magento e APIs corporativas), o caso é um marco histórico: a pesquisa conduzida pela &lt;strong&gt;Wiz Research&lt;/strong&gt; e documentada pelo &lt;strong&gt;Google Cloud&lt;/strong&gt; utilizou modelos avançados de IA (Wiz Atlas, Gemini 4 Argon e GPT-5.6 Sol) para identificar falhas de corrupção de memória que permaneceram invisíveis por mais de 10 anos.&lt;/p&gt;

&lt;p&gt;Neste guia técnico, dissecamos os mecanismos das falhas, a terceira CVE divulgada posteriormente e o roteiro prático para proteger servidores em produção.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. As Vulnerabilidades no Núcleo do PHP
&lt;/h2&gt;

&lt;p&gt;Diferente de brechas comuns causadas por plugins desatualizados, as falhas residem na implementação em C do interpretador PHP:&lt;/p&gt;

&lt;h3&gt;
  
  
  CVE-2026-109618 — Corrupção de Memória em Out-of-Memory (OOM)
&lt;/h3&gt;

&lt;p&gt;Quando uma requisição excede os limites de memória configurados, o PHP força a interrupção da execução. Se o gatilho de OOM ocorrer durante a inicialização parcial de estruturas internas, o mecanismo de limpeza (&lt;em&gt;garbage collector / cleanup&lt;/em&gt;) processa blocos de memória incompletos ou desalocados como se estivessem consistentes. Isso gera corrupção arbitrária de ponteiros e viabiliza a execução de código arbitrário sem login.&lt;/p&gt;

&lt;h3&gt;
  
  
  CVE-2026-109619 — Use-After-Free (UAF) e OPcache
&lt;/h3&gt;

&lt;p&gt;Determinados estados internos da requisição não eram completamente zerados após a liberação da memória. Quando o processo trabalhador (&lt;em&gt;worker&lt;/em&gt;) atendia uma requisição subsequente, ele reutilizava referências para estruturas obsoletas. Como o &lt;strong&gt;OPcache&lt;/strong&gt; gerencia scripts pré-compilados compartilhados entre processos, a violação de isolamento abriu portas para injeção remota de código.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. A Terceira Vulnerabilidade: CVE-2026-115560
&lt;/h2&gt;

&lt;p&gt;Dois dias após a publicação das correções iniciais, em 23 de outubro de 2026, o projeto PHP e o CERT-EU emitiram um comunicado urgente sobre a &lt;strong&gt;CVE-2026-115560&lt;/strong&gt;: outra falha de RCE associada ao mecanismo de progresso de upload de sessões.&lt;/p&gt;

&lt;p&gt;Essa falha &lt;strong&gt;não&lt;/strong&gt; foi corrigida pelas versões de manutenção de 21 de outubro. A mitigação emergencial recomendada é desativar o recurso no &lt;code&gt;php.ini&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;; Adicione ou edite no seu php.ini (/etc/php/8.x/fpm/php.ini ou /etc/php.ini)
&lt;/span&gt;&lt;span class="py"&gt;session.upload_progress.enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Versões Corrigidas e Auditoria de Pacotes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Série do PHP&lt;/th&gt;
&lt;th&gt;Versão Mínima Segura&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PHP 8.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8.5.12&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PHP 8.4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8.4.27&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PHP 8.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8.3.36&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PHP 8.2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8.2.35&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PHP 8.1 ou anterior&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Exige &lt;em&gt;backports&lt;/em&gt; fornecidos pela distro Linux&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Verificação do Pacote no Sistema Operacional
&lt;/h3&gt;

&lt;p&gt;Nunca confie apenas em &lt;code&gt;php -v&lt;/code&gt;. Distribuições Linux corporativas aplicam correções mantendo a numeração original do pacote:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Debian / Ubuntu:&lt;/span&gt;
dpkg &lt;span class="nt"&gt;-l&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"php.*(fpm|common|cli)"&lt;/span&gt;

&lt;span class="c"&gt;# RHEL / CentOS / AlmaLinux:&lt;/span&gt;
rpm &lt;span class="nt"&gt;-qa&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"php.*(fpm|common|cli)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Aplicação das Atualizações e Reinício de Serviços
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Debian / Ubuntu&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--only-upgrade&lt;/span&gt; php&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="c"&gt;# RHEL / AlmaLinux&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf upgrade php&lt;span class="se"&gt;\*&lt;/span&gt;

&lt;span class="c"&gt;# Reinício obrigatório dos daemons:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart php8.3-fpm &lt;span class="c"&gt;# Ajuste para sua versão ativa&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx     &lt;span class="c"&gt;# ou apache2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. O Impacto da IA na Dinâmica da Segurança
&lt;/h2&gt;

&lt;p&gt;O PHP2Shell demonstra que a IA alterou definitivamente a pesquisa de segurança ofensiva e defensiva:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fuzzing e Raciocínio Semântico&lt;/strong&gt;: Modelos de IA analisam rapidamente dependências cruzadas em códigos de alta complexidade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Janela Zero de Exploração&lt;/strong&gt;: O intervalo entre o anúncio de uma falha e o desenvolvimento de exploits automatizados encurtou dramaticamente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A defesa moderna exige visibilidade contínua de ativos, postura agressiva de atualização e detecção comportamental no host.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Artigo completo publicado originalmente no blog de cibersegurança:&lt;/em&gt;&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://sentinel.vexisone.com/ciberseguranca/php2shell-ia-vulnerabilidades-criticas-php" rel="noopener noreferrer"&gt;PHP2Shell: Análise Completa no Sentinel Vexis One&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>php</category>
      <category>ai</category>
      <category>devops</category>
    </item>
    <item>
      <title>Investigação OSINT na Prática: Como Extrair Metadados EXIF e Analisar Imagens sem Ferramentas Pagas</title>
      <dc:creator>Evandro Carvalho</dc:creator>
      <pubDate>Thu, 22 Oct 2026 15:31:26 +0000</pubDate>
      <link>https://dev.to/evandro_carvalho_ad7433b6/investigacao-osint-na-pratica-como-extrair-metadados-exif-e-analisar-imagens-sem-ferramentas-pagas-48mk</link>
      <guid>https://dev.to/evandro_carvalho_ad7433b6/investigacao-osint-na-pratica-como-extrair-metadados-exif-e-analisar-imagens-sem-ferramentas-pagas-48mk</guid>
      <description>&lt;p&gt;Na era digital, uma fotografia é muito mais do que uma matriz de pixels coloridos. Cada arquivo capturado por um smartphone ou câmera profissional carrega consigo uma camada invisível de dados chamada &lt;strong&gt;EXIF (Exchangeable Image File Format)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para analistas de segurança, peritos forenses e pesquisadores de &lt;strong&gt;OSINT (Open Source Intelligence)&lt;/strong&gt;, metadados representam uma mina de ouro investigativa. Por outro lado, para desenvolvedores e usuários desprevenidos, o envio inadvertido de arquivos sem sanitização expõe coordenadas geográficas residenciais, números de série e rotinas pessoais.&lt;/p&gt;

&lt;p&gt;Neste artigo prático, veremos como extrair, interpretar e sanitizar metadados de arquivos de imagem utilizando ferramentas de linha de comando (&lt;code&gt;ExifTool&lt;/code&gt;) e scripts em Python.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. O que Fica Gravado no Cabeçalho EXIF?
&lt;/h2&gt;

&lt;p&gt;Ao fotografar uma cena, o sistema do smartphone grava automaticamente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Geolocalização (GPS)&lt;/strong&gt;: Latitude, longitude, altitude e direção da bússola;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identidade do Hardware&lt;/strong&gt;: Fabricante, modelo exato, versão do firmware e número de série da lente;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Condições Técnicas&lt;/strong&gt;: Abertura do diafragma, velocidade do obturador, ISO e se o flash disparou;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timestamp Absoluto&lt;/strong&gt;: Data, hora, minuto e fuso horário da captura.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enquanto plataformas sociais (como Instagram) descartam esses dados na compressão, o compartilhamento direto via &lt;strong&gt;e-mail, Discord, Slack ou envio como arquivo no Telegram/WhatsApp&lt;/strong&gt; preserva 100% dos dados originais.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Extração Rápida com o ExifTool
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;ExifTool&lt;/strong&gt; é o padrão ouro na indústria forense para leitura e manipulação de metadados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Instalação no Linux / Debian&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; libimage-exiftool-perl

&lt;span class="c"&gt;# Extrair todos os metadados com formato legível&lt;/span&gt;
exiftool foto_alvo.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para filtrar especificamente as coordenadas geográficas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;exiftool &lt;span class="nt"&gt;-GPSLatitude&lt;/span&gt; &lt;span class="nt"&gt;-GPSLongitude&lt;/span&gt; &lt;span class="nt"&gt;-GPSPosition&lt;/span&gt; foto_alvo.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A saída entrega os graus decimais exatos (ex: &lt;code&gt;-23.550520, -46.633308&lt;/code&gt;), permitindo plotar a localização diretamente no Google Maps ou OpenStreetMap com precisão métrica.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Automatizando a Extração e Limpeza em Python
&lt;/h2&gt;

&lt;p&gt;Abaixo está um script em Python que faz tanto a leitura forense quanto a sanitização completa (remoção de metadados) antes do upload público:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL.ExifTags&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TAGS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GPSTAGS&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;extract_exif&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;exif_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_getexif&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;exif_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[!] Nenhum metadado EXIF encontrado.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;=== METADADOS ENCONTRADOS: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;image_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; ===&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tag_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;exif_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;tag_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TAGS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tag_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tag_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Oculta dados binários extensos
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tag_name&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MakerNote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tag_name&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sanitize_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Cria uma cópia limpa da imagem sem nenhum metadado EXIF rastreável&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Criar uma nova imagem copiando apenas os pixels RGB
&lt;/span&gt;    &lt;span class="n"&gt;clean_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;clean_image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;putdata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getdata&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
    &lt;span class="n"&gt;clean_image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[✔] Imagem sanitizada salva com sucesso em: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;output_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Uso: python exif_analyzer.py &amp;lt;imagem.jpg&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nf"&gt;extract_exif&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;sanitize_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sanitized_&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Recomendações de OPSEC (Segurança Operacional)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Desative Geotagging na Câmera&lt;/strong&gt;: Nas configurações do app de câmera do seu celular, desative a opção "Salvar localização";&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crie Pipelines de Sanitização&lt;/strong&gt;: Em aplicações web que recebem uploads de usuários (avatares, documentos, fotos de perfil), processe sempre as imagens através de bibliotecas como &lt;code&gt;Pillow&lt;/code&gt; ou &lt;code&gt;sharp&lt;/code&gt; para expurgar metadados antes de armazenar no bucket S3;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atenção a Metadados em PDFs e Documentos Office&lt;/strong&gt;: Arquivos &lt;code&gt;.docx&lt;/code&gt; e &lt;code&gt;.pdf&lt;/code&gt; frequentemente gravam o autor original, caminho de pastas no computador local (&lt;code&gt;C:\Users\nome\...&lt;/code&gt;) e software utilizado.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusão e Recursos
&lt;/h2&gt;

&lt;p&gt;Compreender o poder dos metadados é essencial tanto para investigações defensivas de cibersegurança quanto para garantir a privacidade básica de dados em produtos digitais.&lt;/p&gt;

&lt;p&gt;Confira o guia completo sobre investigação OSINT e armazenamento seguro de dados no meu blog:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://sentinel.vexisone.com/ferramentas/osint-pratica-metadados-exif-rastreamento-pegada-digital-2026" rel="noopener noreferrer"&gt;Artigo Completo no Vexis Sentinel&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Você já utilizou o ExifTool em auditorias de segurança ou para verificar o que seus próprios arquivos expõem? Conte sua experiência!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>osint</category>
      <category>security</category>
      <category>python</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Telemetria de Energia para Home Labs 24/7: Como Medir Consumo e Evitar Sobrecargas com Tomadas Inteligentes</title>
      <dc:creator>Evandro Carvalho</dc:creator>
      <pubDate>Wed, 21 Oct 2026 17:15:21 +0000</pubDate>
      <link>https://dev.to/evandro_carvalho_ad7433b6/telemetria-de-energia-para-home-labs-247-como-medir-consumo-e-evitar-sobrecargas-com-tomadas-81g</link>
      <guid>https://dev.to/evandro_carvalho_ad7433b6/telemetria-de-energia-para-home-labs-247-como-medir-consumo-e-evitar-sobrecargas-com-tomadas-81g</guid>
      <description>&lt;p&gt;Manter servidores domésticos, nós de IA e appliances de rede rodando 24 horas por dia traz uma dúvida comum para qualquer engenheiro ou entusiasta de infraestrutura: &lt;strong&gt;quanto isso realmente custa na conta de luz ao final do mês?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Além do fator financeiro, servidores sem supervisão em ambientes residenciais exigem controle térmico e proteção contra sobrecarga. Se um cooler travar ou um processo entrar em loop infinito de CPU, o consumo elétrico dispara junto com a temperatura dos componentes.&lt;/p&gt;

&lt;p&gt;Neste artigo, veremos como instrumentar um &lt;strong&gt;sistema de telemetria elétrica contínua&lt;/strong&gt; para seu home lab utilizando tomadas inteligentes IoT, automações em Python e regras de desligamento de emergência.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Métricas Essenciais de Telemetria Elétrica
&lt;/h2&gt;

&lt;p&gt;Ao monitorar servidores, precisamos observar 4 grandezas físicas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Potência Ativa (Watts - W)&lt;/strong&gt;: A taxa instantânea de energia consumida pela máquina em determinado segundo;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tensão da Rede (Volts - V)&lt;/strong&gt;: Monitora a estabilidade da concessionária de energia (quedas de tensão podem forçar a fonte);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Corrente (Amperes - A)&lt;/strong&gt;: Ajuda a dimensionar disjuntores e filtros de linha com precisão;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Energia Acumulada (Quilowatt-hora - kWh)&lt;/strong&gt;: A unidade cobrada na fatura de energia elétrica (&lt;code&gt;1 kWh = 1000W consumidos por 1 hora&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  2. A Matemática do Custo Mensal
&lt;/h2&gt;

&lt;p&gt;Para saber o custo exato do seu servidor:&lt;/p&gt;

&lt;p&gt;$$\text{Custo Mensal (R\$)} = \frac{\text{Potência Média (W)} \times 24 \times 30}{1000} \times \text{Tarifa do kWh}$$&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo Real (Mini PC rodando Docker em Idle a 14W):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consumo Diário&lt;/strong&gt;: &lt;code&gt;14W * 24h = 336 Wh = 0.336 kWh/dia&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consumo Mensal&lt;/strong&gt;: &lt;code&gt;0.336 kWh * 30 dias = 10.08 kWh/mês&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custo com Tarifa Média (R$ 0,90 por kWh)&lt;/strong&gt;: &lt;code&gt;10.08 * 0.90 = R$ 9,07 por mês!&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ter 8GB a 16GB de RAM dedicada rodando seus próprios containers locais por menos de R$ 10 mensais é incomparavelmente mais barato do que qualquer instância equivalente em nuvem pública (AWS EC2, DigitalOcean ou Linode).&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Automatizando Alertas de Sobrecarga em Python
&lt;/h2&gt;

&lt;p&gt;Abaixo está um script em Python que consome a telemetria da tomada (via API local ou MQTT) e aciona medidas de proteção caso o consumo ultrapasse o limite de segurança por tempo prolongado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;

&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%(asctime)s [%(levelname)s] %(message)s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PowerTelemetry&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Limites de segurança do servidor
&lt;/span&gt;&lt;span class="n"&gt;MAX_SAFE_WATTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;65.0&lt;/span&gt;
&lt;span class="n"&gt;SUSTAINED_LIMIT_SECONDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt; &lt;span class="c1"&gt;# 5 minutos
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_current_power_watts&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# Consulta endpoint local da tomada inteligente (Tasmota / Tuya Local / Home Assistant)
&lt;/span&gt;    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://192.168.1.180/cm?cmnd=Status%208&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;StatusSNS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ENERGY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Power&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Erro ao consultar sensor de energia: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;emergency_cooldown&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;critical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;⚠️ Consumo excessivo prolongado! Iniciando mitigação térmica...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Para containers pesados de IA para aliviar a carga da CPU
&lt;/span&gt;    &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;docker&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama-gpu-server&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Envia notificação para o administrador (Telegram / Webhook)
&lt;/span&gt;    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Containers pesados congelados com sucesso para resfriamento.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;monitor_loop&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;over_limit_start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Monitor de telemetria elétrica iniciado...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;watts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_current_power_watts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Consumo atual do Home Lab: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;watts&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; W&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;watts&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;MAX_SAFE_WATTS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;over_limit_start&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;over_limit_start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Consumo ultrapassou &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;MAX_SAFE_WATTS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;W! Monitorando sustentação...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;elif &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;over_limit_start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;SUSTAINED_LIMIT_SECONDS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;emergency_cooldown&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="n"&gt;over_limit_start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;over_limit_start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;monitor_loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusão e Recursos
&lt;/h2&gt;

&lt;p&gt;Instrumentar o consumo elétrico traz previsibilidade financeira para seus projetos e protege o hardware físico contra superaquecimento silencioso.&lt;/p&gt;

&lt;p&gt;Confira o guia completo sobre proteção elétrica com nobreaks senoidais e dimensionamento de cargas no meu blog:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://sentinel.vexisone.com/tutoriais/telemetria-energia-home-labs-tomadas-inteligentes-2026" rel="noopener noreferrer"&gt;Artigo Completo no Vexis Sentinel&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Você monitora o consumo dos seus servidores caseiros? Qual a potência média em Watts do seu setup em idle?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hardware</category>
      <category>iot</category>
      <category>linux</category>
      <category>sysadmin</category>
    </item>
    <item>
      <title>Honeypots em Redes Internas: Como Criar Portas Falsas para Detectar Varreduras e Movimentação Lateral</title>
      <dc:creator>Evandro Carvalho</dc:creator>
      <pubDate>Thu, 15 Oct 2026 22:20:48 +0000</pubDate>
      <link>https://dev.to/evandro_carvalho_ad7433b6/honeypots-em-redes-internas-como-criar-portas-falsas-para-detectar-varreduras-e-movimentacao-ih</link>
      <guid>https://dev.to/evandro_carvalho_ad7433b6/honeypots-em-redes-internas-como-criar-portas-falsas-para-detectar-varreduras-e-movimentacao-ih</guid>
      <description>&lt;p&gt;A maior parte dos esforços de segurança corporativa e doméstica foca exclusivamente no perímetro: firewalls bloqueando portas de entrada e filtros de DNS. No entanto, uma vez que um invasor (ou um dispositivo IoT comprometido) obtém acesso à rede Wi-Fi/LAN, ele ganha liberdade quase total para explorar outros hosts.&lt;/p&gt;

&lt;p&gt;É aqui que entram os &lt;strong&gt;Honeypots Internos (ou Sistemas Canário)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Diferente de honeypots públicos que servem para atrair ataques da internet aberta, um honeypot interno serve como um &lt;strong&gt;sensor de alarme silencioso&lt;/strong&gt;: ele escuta em portas de serviços vulneráveis clássicos (Telnet, FTP, SMB) dentro da sua sub-rede privada. Como nenhum usuário legítimo tem motivos para interagir com essas portas, &lt;strong&gt;qualquer tentativa de conexão é com 100% de certeza um sinal de anomalia, varredura (Nmap) ou tentativa de movimentação lateral&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Neste artigo, veremos como construir um honeypot multi-porta ultraleve em Python assíncrono.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. O Conceito: Detectando o Invasor no Primeiro Toque
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                    REDE LOCAL PRIVADA (LAN)                 │
└──────────────────────────────┬──────────────────────────────┘
                               │
            ┌──────────────────┴──────────────────┐
            ▼                                     ▼
     PC de Trabalho                        Dispositivo IoT
    (Tráfego Legítimo)                    (Comprometido / Bot)
                                                  │
                                                  │ Dispara Varredura de Portas (SYN)
                                                  ▼
                                      ┌───────────────────────┐
                                      │   HONEYPOT EM PYTHON  │
                                      │  Portas: 21, 23, 445  │
                                      └───────────┬───────────┘
                                                  │
                                                  ▼ Alerta Imediato
                                      ⚠️ Movimentação Lateral Detectada!
                                      Origem: 192.168.1.145 (TV Box)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Implementando o Honeypot em Python (&lt;code&gt;asyncio&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;O script abaixo simula banners de resposta realistas para induzir o invasor a continuar a interação, enquanto registra o IP de origem e o payload enviado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;

&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%(asctime)s [%(levelname)s] %(message)s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;InternalHoneypot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Portas de alta probabilidade de varredura
&lt;/span&gt;&lt;span class="n"&gt;HONEYPOT_PORTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;220 ProFTPD 1.3.5 Server (Ubuntu) [192.168.1.100]&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Debian GNU/Linux 12&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s"&gt;Login: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;445&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x00\x00\x00\x2f\xff\x53\x4d\x42&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# Assinatura simples SMB
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_probe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;banner&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;client_ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;client_port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_extra_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;peername&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🚨 [ALERTA DE SEGURANÇA] Sonda detectada! IP: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_ip&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; na Porta: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Envia banner simulado
&lt;/span&gt;        &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;banner&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drain&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;# Lê dados que o invasor tentar enviar (ex: credenciais)
&lt;/span&gt;        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait_for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Payload capturado de &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_ip&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; na porta &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;TimeoutError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;ConnectionResetError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;
    &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait_closed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;start_honeypot&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;servers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;banner&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;HONEYPOT_PORTS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start_server&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;banner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;handle_probe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.0.0.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;port&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;servers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Honeypot ativo escutando na porta TCP &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;PermissionError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Permissão negada para porta &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. Execute com sudo ou use capabilities.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;serve_forever&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;servers&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;start_honeypot&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;KeyboardInterrupt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Honeypot desativado.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Rodando com Menor Privilégio no Linux
&lt;/h2&gt;

&lt;p&gt;Para escutar em portas privilegiadas (abaixo de 1024) sem precisar rodar o script como usuário &lt;code&gt;root&lt;/code&gt;, você pode conceder a capacidade &lt;code&gt;CAP_NET_BIND_SERVICE&lt;/code&gt; ao binário do Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;setcap &lt;span class="s1"&gt;'cap_net_bind_service=+ep'&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;readlink&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;which python3&lt;span class="si"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. O que Fazer Após o Alerta?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Identificar o Hardware&lt;/strong&gt;: Use a tabela ARP para descobrir o endereço MAC do IP invasor e consulte o fabricante (IEEE OUI);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolar o Dispositivo&lt;/strong&gt;: Se for um aparelho de TV Box, câmera IP ou sensor inteligente, migre-o imediatamente para uma &lt;strong&gt;VLAN de convidados/IoT&lt;/strong&gt; com isolamento de clientes (&lt;em&gt;Client Isolation&lt;/em&gt;) ativado no ponto de acesso;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bloquear Comunicações WAN&lt;/strong&gt;: Bloqueie requisições de DNS e portas de saída suspeitas no firewall do seu roteador para impedir comandos de C2 (Command &amp;amp; Control).&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusão e Recursos
&lt;/h2&gt;

&lt;p&gt;A melhor segurança não é aquela que tenta prever todos os ataques, mas aquela que detecta a presença do invasor no primeiro segundo em que ele tenta explorar a rede interna.&lt;/p&gt;

&lt;p&gt;Confira o guia completo sobre arquiteturas de defesa em profundidade e automações no meu blog:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://sentinel.vexisone.com/ciberseguranca/honeypots-redes-internas-deteccao-varredura-movimentacao-lateral-2026" rel="noopener noreferrer"&gt;Guia Completo no Vexis Sentinel&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Você já identificou aparelhos na sua rede fazendo requisições ou conexões para IPs estranhos? O que descobriu?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>python</category>
      <category>linux</category>
      <category>networking</category>
    </item>
    <item>
      <title>GitHub Copilot Privado e Gratuito: Como Usar o Continue.dev no VS Code com Modelos Locais</title>
      <dc:creator>Evandro Carvalho</dc:creator>
      <pubDate>Wed, 14 Oct 2026 19:18:45 +0000</pubDate>
      <link>https://dev.to/evandro_carvalho_ad7433b6/github-copilot-privado-e-gratuito-como-usar-o-continuedev-no-vs-code-com-modelos-locais-1him</link>
      <guid>https://dev.to/evandro_carvalho_ad7433b6/github-copilot-privado-e-gratuito-como-usar-o-continuedev-no-vs-code-com-modelos-locais-1him</guid>
      <description>&lt;p&gt;Assinaturas recorrentes de assistentes de IA (como GitHub Copilot, Cursor e Supermaven) pesam no bolso do desenvolvedor e representam um pesadelo de compliance para empresas que lidam com código confidencial, segredos industriais e exigências de LGPD/GDPR.&lt;/p&gt;

&lt;p&gt;Com os saltos recentes nos modelos de código de pesos abertos — em especial a família &lt;strong&gt;Qwen 2.5 Coder&lt;/strong&gt; da Alibaba Cloud —, agora é possível ter uma experiência idêntica de autocompletar e chat dentro do VS Code rodando &lt;strong&gt;100% offline e de graça&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Neste artigo, você aprenderá a configurar a extensão &lt;strong&gt;Continue.dev&lt;/strong&gt; integrada ao &lt;strong&gt;Ollama&lt;/strong&gt; para autocompletar código nativo via tecla &lt;code&gt;Tab&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. A Stack: Continue.dev + Ollama + Qwen 2.5 Coder
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Continue.dev&lt;/strong&gt;: A extensão open-source líder para VS Code e JetBrains que atua como cliente universal para LLMs locais ou em nuvem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt;: O motor de inferência local que gerencia a alocação de GPU/RAM e serve os modelos via API REST local (&lt;code&gt;http://localhost:11434&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qwen 2.5 Coder&lt;/strong&gt;: Considerado atualmente o estado da arte em modelos abertos para programação, superando até modelos maiores em benchmarks como HumanEval e SWE-bench.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Passo 1: Baixando os Modelos no Ollama
&lt;/h2&gt;

&lt;p&gt;No terminal da sua máquina (com Ollama instalado):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Para autocompletar inline ultra-rápido (latência &amp;lt; 100ms)&lt;/span&gt;
ollama pull qwen2.5-coder:1.5b-base

&lt;span class="c"&gt;# Para o chat lateral, refatoração e geração de testes complexos&lt;/span&gt;
ollama pull qwen2.5-coder:7b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Passo 2: Configurando o &lt;code&gt;config.json&lt;/code&gt; do Continue
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;No VS Code, instale a extensão &lt;strong&gt;Continue&lt;/strong&gt; pelo marketplace (&lt;code&gt;Continue.continue&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Clique no ícone de engrenagem ⚙️ no painel do Continue e selecione &lt;strong&gt;Open config.json&lt;/strong&gt; (localizado em &lt;code&gt;~/.continue/config.json&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Insira a configuração abaixo:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"models"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Qwen 2.5 Coder 7B (Local)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ollama"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"qwen2.5-coder:7b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"apiBase"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:11434"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabAutocompleteModel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Qwen 2.5 Coder 1.5B Autocomplete"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ollama"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"qwen2.5-coder:1.5b-base"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"apiBase"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:11434"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customCommands"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"testes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Escreva testes unitários completos com alta cobertura para o código selecionado."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Gerar testes unitários"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"refatorar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Refatore o código selecionado aplicando princípios de Clean Code e tipagem estrita."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Refatorar código"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Salve o arquivo (&lt;code&gt;Ctrl + S&lt;/code&gt;). O Continue recarregará instantaneamente.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Usando no Dia a Dia
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Autocompletar Inline&lt;/strong&gt;: Ao digitar código, o modelo sugere continuações em cinza. Pressione &lt;code&gt;Tab&lt;/code&gt; para aceitar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chat Lateral Contextual&lt;/strong&gt;: Pressione &lt;code&gt;Ctrl + L&lt;/code&gt; para abrir o chat. Use &lt;code&gt;@Files&lt;/code&gt; ou &lt;code&gt;@Code&lt;/code&gt; para referenciar arquivos específicos do seu repositório.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refatoração no Local&lt;/strong&gt;: Selecione um bloco de código e pressione &lt;code&gt;Ctrl + I&lt;/code&gt; para instruir o modelo a alterar as linhas diretamente no editor.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusão e Recursos
&lt;/h2&gt;

&lt;p&gt;Ter um assistente de IA soberano dentro do seu próprio hardware elimina custos recorrentes e garante que nenhuma linha do seu código saia da sua rede privada.&lt;/p&gt;

&lt;p&gt;Confira a análise detalhada de consumo de VRAM e placas de vídeo recomendadas no meu blog:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://sentinel.vexisone.com/ferramentas/copilot-privado-gratuito-continue-dev-vscode-ollama-2026" rel="noopener noreferrer"&gt;Guia Completo no Vexis Sentinel&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Você já experimentou programar com modelos locais? Sentiu diferença na velocidade ou precisão em comparação com os modelos pagos?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>ai</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Hardening de Servidores Linux: Como Blindar o SSH com Chaves Ed25519 e Eliminar Ataques de Força Bruta</title>
      <dc:creator>Evandro Carvalho</dc:creator>
      <pubDate>Mon, 12 Oct 2026 13:27:22 +0000</pubDate>
      <link>https://dev.to/evandro_carvalho_ad7433b6/hardening-de-servidores-linux-como-blindar-o-ssh-com-chaves-ed25519-e-eliminar-ataques-de-forca-218f</link>
      <guid>https://dev.to/evandro_carvalho_ad7433b6/hardening-de-servidores-linux-como-blindar-o-ssh-com-chaves-ed25519-e-eliminar-ataques-de-forca-218f</guid>
      <description>&lt;p&gt;Basta alocar um IP público em qualquer VPS na AWS, DigitalOcean ou Hetzner para que, em questão de minutos, scanners automatizados comecem a bombardear a porta 22 do seu servidor com ataques de dicionário e força bruta.&lt;/p&gt;

&lt;p&gt;Consultar o arquivo &lt;code&gt;/var/log/auth.log&lt;/code&gt; (ou &lt;code&gt;journalctl -u ssh&lt;/code&gt;) em servidores recém-criados revela milhares de tentativas de autenticação para usuários previsíveis como &lt;code&gt;root&lt;/code&gt;, &lt;code&gt;admin&lt;/code&gt;, &lt;code&gt;user&lt;/code&gt; e &lt;code&gt;postgres&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Neste guia prático de engenharia de sistemas, veremos os 4 passos obrigatórios para &lt;strong&gt;blindar o serviço OpenSSH&lt;/strong&gt;, erradicar autenticação por senha e implementar detecção de intrusos com &lt;strong&gt;Fail2ban&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Por que Chaves Ed25519 em vez de RSA?
&lt;/h2&gt;

&lt;p&gt;As chaves &lt;strong&gt;Ed25519&lt;/strong&gt; (baseadas na curva elíptica Curve25519) tornaram-se o padrão da indústria por motivos claros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Segurança Imbatível&lt;/strong&gt;: Oferecem segurança equivalente a chaves RSA de ~3000 bits com uma fração do tamanho do arquivo (apenas 68 caracteres);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Velocidade de Assinatura&lt;/strong&gt;: O handshake SSH e a verificação criptográfica ocorrem em menos da metade do tempo;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resistência a Canais Laterais&lt;/strong&gt;: Menos suscetíveis a ataques baseados em tempo de resposta (timing attacks).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gere sua chave localmente na sua máquina de desenvolvimento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"seu-email@dominio.com"&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ~/.ssh/id_ed25519_servidor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copie a chave pública para o servidor remoto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-copy-id &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/id_ed25519_servidor.pub usuario@&amp;lt;IP-DO-SERVIDOR&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Configurando o &lt;code&gt;/etc/ssh/sshd_config.d/99-hardening.conf&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Em distribuições Linux modernas (Debian 12+, Ubuntu 22.04+), a melhor prática é não alterar o arquivo principal diretamente, mas criar um arquivo de substituição modular em &lt;code&gt;/etc/ssh/sshd_config.d/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/ssh/sshd_config.d/99-hardening.conf
&lt;/span&gt;
&lt;span class="c"&gt;# 1. Proibir login direto como superusuário (root)
&lt;/span&gt;&lt;span class="err"&gt;PermitRootLogin&lt;/span&gt; &lt;span class="err"&gt;no&lt;/span&gt;

&lt;span class="c"&gt;# 2. Desativar completamente autenticação por senha
&lt;/span&gt;&lt;span class="err"&gt;PasswordAuthentication&lt;/span&gt; &lt;span class="err"&gt;no&lt;/span&gt;
&lt;span class="err"&gt;PermitEmptyPasswords&lt;/span&gt; &lt;span class="err"&gt;no&lt;/span&gt;
&lt;span class="err"&gt;ChallengeResponseAuthentication&lt;/span&gt; &lt;span class="err"&gt;no&lt;/span&gt;
&lt;span class="err"&gt;KbdInteractiveAuthentication&lt;/span&gt; &lt;span class="err"&gt;no&lt;/span&gt;

&lt;span class="c"&gt;# 3. Forçar uso estrito de chaves públicas
&lt;/span&gt;&lt;span class="err"&gt;PubkeyAuthentication&lt;/span&gt; &lt;span class="err"&gt;yes&lt;/span&gt;

&lt;span class="c"&gt;# 4. Limitar tentativas consecutivas de autenticação
&lt;/span&gt;&lt;span class="err"&gt;MaxAuthTries&lt;/span&gt; &lt;span class="err"&gt;3&lt;/span&gt;
&lt;span class="err"&gt;MaxSessions&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt;

&lt;span class="c"&gt;# 5. Desativar encaminhamento X11 desnecessário
&lt;/span&gt;&lt;span class="err"&gt;X11Forwarding&lt;/span&gt; &lt;span class="err"&gt;no&lt;/span&gt;

&lt;span class="c"&gt;# 6. Desconectar sessões ociosas automaticamente (após 10 minutos)
&lt;/span&gt;&lt;span class="err"&gt;ClientAliveInterval&lt;/span&gt; &lt;span class="err"&gt;300&lt;/span&gt;
&lt;span class="err"&gt;ClientAliveCountMax&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Valide a sintaxe antes de reiniciar o daemon:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;sshd &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart sshd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Atenção:&lt;/strong&gt; Mantenha uma janela de SSH aberta enquanto testa o login em uma nova janela para evitar ficar trancado fora do servidor!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. Instalando e Ajustando o Fail2ban
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;Fail2ban&lt;/strong&gt; inspeciona os logs do sistema operacional e cria regras dinâmicas de firewall (&lt;code&gt;nftables&lt;/code&gt; ou &lt;code&gt;iptables&lt;/code&gt;) para banir IPs que apresentem comportamento suspeito:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; fail2ban
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crie o arquivo de regras locais em &lt;code&gt;/etc/fail2ban/jail.local&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/fail2ban/jail.local
&lt;/span&gt;&lt;span class="nn"&gt;[DEFAULT]&lt;/span&gt;
&lt;span class="py"&gt;bantime&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;24h&lt;/span&gt;
&lt;span class="py"&gt;findtime&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;10m&lt;/span&gt;
&lt;span class="py"&gt;maxretry&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;3&lt;/span&gt;
&lt;span class="py"&gt;banaction&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;nftables-multiport&lt;/span&gt;

&lt;span class="nn"&gt;[sshd]&lt;/span&gt;
&lt;span class="py"&gt;enabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;port&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;ssh&lt;/span&gt;
&lt;span class="py"&gt;filter&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;sshd&lt;/span&gt;
&lt;span class="py"&gt;logpath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;%(sshd_log)s&lt;/span&gt;
&lt;span class="py"&gt;backend&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;systemd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inicie e habilite o serviço:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; fail2ban
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para verificar o status das jails ativas e a lista de IPs banidos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;fail2ban-client status sshd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusão e Recursos
&lt;/h2&gt;

&lt;p&gt;A segurança de um servidor começa pela superfície de ataque mais exposta. Eliminando o login por senha e aplicando chaves Ed25519 com Fail2ban, você neutraliza mais de 99% dos scanners automatizados da internet.&lt;/p&gt;

&lt;p&gt;Confira o guia aprofundado com auditoria de chaves físicas FIDO2 e cofres criptografados no meu blog:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://sentinel.vexisone.com/ciberseguranca/tutorial-hardening-ssh-chaves-ed25519-fail2ban-2026" rel="noopener noreferrer"&gt;Guia Completo de Hardening no Vexis Sentinel&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Você mantém a porta 22 padrão ou costuma alterar para uma porta alta não padrão? Qual a sua estratégia favorita?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>security</category>
      <category>devops</category>
      <category>sysadmin</category>
    </item>
    <item>
      <title>Reaproveitando Smartphones Antigos como Servidores de IA de Borda com Linux (PostmarketOS / ARM64)</title>
      <dc:creator>Evandro Carvalho</dc:creator>
      <pubDate>Fri, 09 Oct 2026 01:02:13 +0000</pubDate>
      <link>https://dev.to/evandro_carvalho_ad7433b6/reaproveitando-smartphones-antigos-como-servidores-de-ia-de-borda-com-linux-postmarketos-arm64-4ckc</link>
      <guid>https://dev.to/evandro_carvalho_ad7433b6/reaproveitando-smartphones-antigos-como-servidores-de-ia-de-borda-com-linux-postmarketos-arm64-4ckc</guid>
      <description>&lt;p&gt;A maioria dos desenvolvedores e entusiastas de hardware possui algum smartphone antigo esquecido em uma gaveta. Celulares topo de linha de gerações passadas (como os equipados com Snapdragon 845 ou Snapdragon 870) possuem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;6GB a 8GB de memória LPDDR4X rápida;&lt;/li&gt;
&lt;li&gt;SoCs Octa-Core de 64 bits com excelente eficiência por Watt;&lt;/li&gt;
&lt;li&gt;Armazenamento flash UFS veloz;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uma bateria integrada (UPS/No-break nativo)&lt;/strong&gt; que impede o desligamento súbito em caso de queda de energia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enquanto rodar ferramentas no Android via Termux frequentemente sofre com o &lt;em&gt;OOM killer&lt;/em&gt; agressivo do sistema operacional móvel, instalar uma distribuição Linux real como o &lt;strong&gt;postmarketOS&lt;/strong&gt; (baseado no Alpine Linux) transforma o celular em um micro-servidor bare-metal de baixo consumo.&lt;/p&gt;

&lt;p&gt;Neste artigo, veremos como configurar um nó de inferência de IA local (Edge AI) rodando &lt;strong&gt;Ollama&lt;/strong&gt; e Small Language Models (SLMs) diretamente no hardware ARM64.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Por que postmarketOS em vez de Android/Termux?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspecto&lt;/th&gt;
&lt;th&gt;Android + Termux&lt;/th&gt;
&lt;th&gt;postmarketOS (Alpine Linux)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kernel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kernel customizado do fabricante (antigo)&lt;/td&gt;
&lt;td&gt;Kernel Linux mainline upstream&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Overhead de RAM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~2.5GB consumidos pela JVM e serviços Android&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Menos de 200MB de RAM em idle&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gerenciamento de Processos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Android suspende daemons em background&lt;/td&gt;
&lt;td&gt;systemd / OpenRC padrão de servidor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Acesso a Pacotes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Repositórios limitados do Termux&lt;/td&gt;
&lt;td&gt;Repositórios completos Alpine ARM64 (&lt;code&gt;apk&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  2. Preparando o Ambiente Headless
&lt;/h2&gt;

&lt;p&gt;Após flashear o postmarketOS no dispositivo (ex: Xiaomi Pocophone F1, OnePlus 6, etc.), o primeiro passo para maximizar a memória disponível para os modelos de IA é desativar a interface gráfica (Phosh ou Plasma Mobile) e mascarar a suspensão profunda:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Conectado via SSH no aparelho&lt;/span&gt;
&lt;span class="c"&gt;# 1. Desativar suspensão para não derrubar a conexão de rede&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target

&lt;span class="c"&gt;# 2. Desativar interface gráfica no boot (modo servidor puro)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl set-default multi-user.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após reiniciar, o sistema consumirá míseros &lt;strong&gt;150MB a 200MB de RAM&lt;/strong&gt;, deixando mais de 5.5GB livres para carregar pesos de modelos de linguagem diretamente na memória unificada do SoC.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Instalando o Ollama no ARM64
&lt;/h2&gt;

&lt;p&gt;O Ollama possui compilações oficiais compatíveis com a arquitetura &lt;code&gt;aarch64&lt;/code&gt;. A instalação pode ser realizada via script oficial:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://ollama.com/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para garantir que o serviço escute em todas as interfaces da sua rede local privada (ou na malha Tailscale), configure as variáveis de ambiente do serviço:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl edit ollama.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Insira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"OLLAMA_HOST=0.0.0.0:11434"&lt;/span&gt;
&lt;span class="py"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"OLLAMA_KEEP_ALIVE=24h"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reinicie o serviço:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart ollama.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Escolha e Benchmark de Modelos SLM para Edge
&lt;/h2&gt;

&lt;p&gt;Em chips como o Snapdragon 845/870, modelos de 1B a 3B de parâmetros quantizados em 4 bits (GGUF) oferecem um equilíbrio ideal entre velocidade e consumo de memória:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Modelo ultra-rápido para código e raciocínio lógico (consome ~1.2GB de RAM)&lt;/span&gt;
ollama pull qwen2.5-coder:1.5b

&lt;span class="c"&gt;# Modelo excelente para conversação e triagem de tarefas gerais (consome ~2.1GB de RAM)&lt;/span&gt;
ollama pull llama3.2:3b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Resultados de Performance (Snapdragon 845 / 6GB RAM):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Qwen 2.5 Coder 1.5B (Q4_K_M)&lt;/strong&gt;: ~12 a 15 tokens/segundo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Llama 3.2 3B (Q4_K_M)&lt;/strong&gt;: ~7 a 9 tokens/segundo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consumo Energético&lt;/strong&gt;: Menos de 3 Watts sob carga máxima de inferência.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusão e Recursos
&lt;/h2&gt;

&lt;p&gt;Reaproveitar hardware existente reduz lixo eletrônico e oferece uma infraestrutura de IA privada 24/7 sem custos recorrentes em nuvem. Com a bateria interna do smartphone, você ganha ainda tolerância total contra oscilações de energia elétrica.&lt;/p&gt;

&lt;p&gt;Confira o guia aprofundado com comparação de hardware dedicado e mini PCs no meu blog:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://landingfymax.com.br/inteligencia-artificial/edge-ai-smartphones-antigos-linux-postmarketos-2026" rel="noopener noreferrer"&gt;Artigo Completo no Fymax Sentinel&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Você tem algum smartphone antigo encostado? Já considerou rodar serviços locais ou nós de rede nele? Deixe seu comentário!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ai</category>
      <category>hardware</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Como Montar um SIEM Doméstico no Linux com Detecção de Intrusos ARP e Fabricante OUI</title>
      <dc:creator>Evandro Carvalho</dc:creator>
      <pubDate>Fri, 09 Oct 2026 01:01:05 +0000</pubDate>
      <link>https://dev.to/evandro_carvalho_ad7433b6/como-montar-um-siem-domestico-no-linux-com-deteccao-de-intrusos-arp-e-fabricante-oui-4f14</link>
      <guid>https://dev.to/evandro_carvalho_ad7433b6/como-montar-um-siem-domestico-no-linux-com-deteccao-de-intrusos-arp-e-fabricante-oui-4f14</guid>
      <description>&lt;p&gt;Manter a visibilidade sobre o que está conectado na sua rede local (LAN) é o primeiro passo para qualquer postura séria de segurança. Na maioria das residências e pequenos escritórios, confiamos cegamente no roteador da operadora — que raramente oferece logs em tempo real, auditoria ou alertas de novos dispositivos desconhecidos.&lt;/p&gt;

&lt;p&gt;Neste artigo prático, vamos construir um &lt;strong&gt;Sentinela Doméstico (Micro-SIEM)&lt;/strong&gt; em Python que roda em qualquer Linux (Raspberry Pi, Mini PC ou servidor local), capaz de:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ler a tabela ARP do kernel em tempo real;&lt;/li&gt;
&lt;li&gt;Realizar varreduras ativas assíncronas via Ping Sweep em sub-redes &lt;code&gt;/24&lt;/code&gt; em menos de 2 segundos;&lt;/li&gt;
&lt;li&gt;Resolver o fabricante do hardware via prefixo IEEE OUI (Apple, Samsung, Espressif, Intel, etc.) sem depender de APIs externas;&lt;/li&gt;
&lt;li&gt;Disparar alertas de novos nós conectados para quarentena imediata.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Por que a Tabela ARP e não apenas Nmap?
&lt;/h2&gt;

&lt;p&gt;Ferramentas como Nmap são excelentes para auditorias pontuais, mas executar scans pesados continuamente na rede pode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gerar ruído e tráfego desnecessário de broadcast;&lt;/li&gt;
&lt;li&gt;Travar dispositivos IoT sensíveis (lâmpadas, tomadas Tuya/Sonoff);&lt;/li&gt;
&lt;li&gt;Consumir CPU desnecessária no host de monitoramento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No Linux, o próprio kernel já mantém um cache dinâmico de todos os dispositivos que trocaram pacotes recentemente no arquivo pseudo-sistema &lt;code&gt;/proc/net/arp&lt;/code&gt;. Lendo esse arquivo diretamente, a verificação consome praticamente &lt;strong&gt;0% de CPU&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. O Script Sentinela em Python
&lt;/h2&gt;

&lt;p&gt;Abaixo está a implementação base que combina a leitura da tabela ARP com a resolução de fabricantes offline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;

&lt;span class="c1"&gt;# Mapeamento simplificado de prefixos OUI populares (3 primeiros octetos)
&lt;/span&gt;&lt;span class="n"&gt;OUI_DATABASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;00:1A:2B&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ayecom Technology&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DC:A6:32&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Raspberry Pi Trading&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;B8:27:EB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Raspberry Pi Foundation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AC:D1:B8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Apple, Inc.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;F4:F5:DB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Apple, Inc.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;24:4C:E3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Samsung Electronics&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EC:FA:BC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Espressif (Tuya / Sonoff / IoT)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;30:AE:A4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Espressif Systems&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;00:E0:4C&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Realtek Semiconductor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;18:66:DA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Intel Corporate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;resolve_vendor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mac&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mac&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()[:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;OUI_DATABASE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Fabricante Desconhecido&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_kernel_arp_table&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;devices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/proc/net/arp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;devices&lt;/span&gt;

    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/proc/net/arp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readlines&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="c1"&gt;# Pula o cabeçalho
&lt;/span&gt;        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hw_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mac&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="c1"&gt;# Flags 0x2 significa dispositivo resolvido/válido
&lt;/span&gt;                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0x2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;mac&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;00:00:00:00:00:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;devices&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mac&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mac&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;interface&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vendor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;resolve_vendor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mac&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;devices&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ping_sweep_subnet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subnet_base&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Dispara pings assíncronos rápidos para forçar atualização da tabela ARP&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ping_ip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;proc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_subprocess_exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ping&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-c&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-W&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEVNULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEVNULL&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;proc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;ping_ip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;subnet_base&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[*] Atualizando cache ARP com varredura assíncrona...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;ping_sweep_subnet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;192.168.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;[+] Dispositivos Ativos na LAN:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;IP&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MAC&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;INTERFACE&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;FABRICANTE&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;read_kernel_arp_table&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ip&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mac&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;interface&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;vendor&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Criando um Serviço em Segundo Plano (Systemd)
&lt;/h2&gt;

&lt;p&gt;Para que o monitoramento seja ininterrupto, salve o script em &lt;code&gt;/opt/network_sentry.py&lt;/code&gt; e configure o serviço no Linux:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/systemd/system/network-sentry.service
&lt;/span&gt;&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;EVM Network Sentry SIEM Daemon&lt;/span&gt;
&lt;span class="py"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network.target&lt;/span&gt;

&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;simple&lt;/span&gt;
&lt;span class="py"&gt;User&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;root&lt;/span&gt;
&lt;span class="py"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/python3 /opt/network_sentry.py&lt;/span&gt;
&lt;span class="py"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;
&lt;span class="py"&gt;RestartSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;180&lt;/span&gt;

&lt;span class="nn"&gt;[Install]&lt;/span&gt;
&lt;span class="py"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ative o daemon para iniciar no boot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; network-sentry.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. O que Fazer com Dispositivos Desconhecidos?
&lt;/h2&gt;

&lt;p&gt;Quando um MAC que não está na sua lista de nós autorizados é detectado, a melhor prática não é apenas emitir um alerta visual, mas aplicar medidas de contenção:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Isolamento via VLAN&lt;/strong&gt;: Separar dispositivos de automação (IoT) dos computadores pessoais de trabalho;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quarentena no Switch/Roteador&lt;/strong&gt;: Bloquear o encaminhamento de pacotes do IP atribuído via regras de &lt;code&gt;iptables&lt;/code&gt; ou regras de firewall no roteador gerenciável (MikroTik / OpenWrt / pfSense).&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusão e Recursos
&lt;/h2&gt;

&lt;p&gt;Ter visibilidade em nível de camada 2 (Data Link) é a fundação para qualquer ambiente seguro. Com poucas linhas de Python assíncrono, você transforma qualquer servidor Linux comum em uma sentinela permanente contra invasões e nós não autorizados.&lt;/p&gt;

&lt;p&gt;Publiquei a arquitetura completa com integração de eventos e banco de dados SQLite WAL no meu blog:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://landingfymax.com.br/tutoriais/tutorial-montar-siem-domestico-arp-oui-linux-2026" rel="noopener noreferrer"&gt;Artigo Completo no Fymax Sentinel&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Como você monitora a entrada de novos aparelhos na sua rede doméstica hoje? Usa Pi-hole, ARPWatch ou regras no roteador? Compartilhe nos comentários!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>security</category>
      <category>networking</category>
      <category>python</category>
    </item>
    <item>
      <title>Como Rodar Ollama com Docker e Aceleração de GPU NVIDIA (Guia Prático)</title>
      <dc:creator>Evandro Carvalho</dc:creator>
      <pubDate>Tue, 06 Oct 2026 19:32:24 +0000</pubDate>
      <link>https://dev.to/evandro_carvalho_ad7433b6/como-rodar-ollama-com-docker-e-aceleracao-de-gpu-nvidia-guia-pratico-4a43</link>
      <guid>https://dev.to/evandro_carvalho_ad7433b6/como-rodar-ollama-com-docker-e-aceleracao-de-gpu-nvidia-guia-pratico-4a43</guid>
      <description>&lt;p&gt;A demanda por executar &lt;strong&gt;modelos de linguagem locais&lt;/strong&gt; (Llama, DeepSeek, Qwen, Mistral) para garantir soberania de dados, privacidade e zero custos com tokens de API explodiu. &lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Ollama&lt;/strong&gt; tornou-se o padrão mais simples e eficiente para isso. No entanto, instalar o binário ou drivers CUDA diretamente no sistema operacional do servidor muitas vezes gera conflito de dependências, quebra de bibliotecas após atualizações do kernel (&lt;code&gt;apt upgrade&lt;/code&gt;) ou dificuldades para isolar ambientes.&lt;/p&gt;

&lt;p&gt;Neste guia, você vai ver como isolar toda a stack de inferência dentro do &lt;strong&gt;Docker&lt;/strong&gt; utilizando o &lt;strong&gt;NVIDIA Container Toolkit&lt;/strong&gt;, com alocação correta de VRAM e boas práticas de segurança de rede.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Configurando o NVIDIA Container Toolkit (Host)
&lt;/h2&gt;

&lt;p&gt;Para que o daemon do Docker consiga passar as GPUs e capacidades de computação CUDA para os containers, o host (Debian/Ubuntu) precisa do runtime oficial da NVIDIA.&lt;/p&gt;

&lt;p&gt;Execute no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Adicionar o repositório oficial da NVIDIA&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://nvidia.github.io/libnvidia-container/gpgkey | &lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-L&lt;/span&gt; https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/nvidia-container-toolkit.list

&lt;span class="c"&gt;# 2. Instalar o toolkit e configurar o Docker daemon&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nvidia-container-toolkit
&lt;span class="nb"&gt;sudo &lt;/span&gt;nvidia-ctk runtime configure &lt;span class="nt"&gt;--runtime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;docker
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. O &lt;code&gt;compose.yaml&lt;/code&gt; com Aceleração de GPU
&lt;/h2&gt;

&lt;p&gt;Crie um arquivo &lt;code&gt;compose.yaml&lt;/code&gt; (ou &lt;code&gt;docker-compose.yml&lt;/code&gt;) na pasta do seu projeto. &lt;/p&gt;

&lt;p&gt;O ponto crucial está na diretiva &lt;code&gt;deploy.resources.reservations.devices&lt;/code&gt;, onde definimos o driver &lt;code&gt;nvidia&lt;/code&gt; e as capacidades necessárias (&lt;code&gt;gpu&lt;/code&gt;, &lt;code&gt;compute&lt;/code&gt;, &lt;code&gt;utility&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ollama&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ollama/ollama:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ollama-gpu-server&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# Amarre ao localhost para não expor a API sem autenticação na rede externa!&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1:11434:11434"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ollama_models:/root/.ollama&lt;/span&gt;
    &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;reservations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;devices&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nvidia&lt;/span&gt;
              &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;
              &lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;gpu&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;compute&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;utility&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ollama_models&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ollama_models_volume&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Suba o container em background:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Validando se a GPU está ativa dentro do Container
&lt;/h2&gt;

&lt;p&gt;Para confirmar se o container está de fato enxergando a GPU NVIDIA e o CUDA:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; ollama-gpu-server nvidia-smi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se a saída do &lt;code&gt;nvidia-smi&lt;/code&gt; exibir sua GPU (ex: RTX 3060, RTX 4060 Ti, A100, etc.), o passthrough foi configurado com sucesso!&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Baixando e Testando Modelos
&lt;/h2&gt;

&lt;p&gt;Você pode interagir diretamente com a CLI do Ollama dentro do container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Baixar e testar um modelo leve e rápido (ex: Llama 3.2 de 3B)&lt;/span&gt;
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; ollama-gpu-server ollama run llama3.2:3b

&lt;span class="c"&gt;# Ou um modelo focado em código / raciocínio (ex: Qwen 2.5 Coder 7B)&lt;/span&gt;
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; ollama-gpu-server ollama run qwen2.5-coder:7b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para listar os modelos que já estão persistidos no seu volume Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; ollama-gpu-server ollama list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Dica Crítica de Segurança de Rede
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Atenção:&lt;/strong&gt; Por padrão, a API REST do Ollama (&lt;code&gt;http://localhost:11434/api/...&lt;/code&gt;) &lt;strong&gt;não implementa camada de autenticação&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Se você alterar a porta para &lt;code&gt;0.0.0.0:11434&lt;/code&gt;, qualquer usuário na mesma rede local (ou na internet, se houver IP público) poderá:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Submeter prompts e consumir 100% da sua VRAM e CPU;&lt;/li&gt;
&lt;li&gt;Excluir modelos baixados via chamada &lt;code&gt;DELETE&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Fazer download de modelos arbitrários no seu disco.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Como proteger em produção:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Mantenha a porta amarrada estritamente em &lt;code&gt;127.0.0.1:11434&lt;/code&gt; no Compose.&lt;/li&gt;
&lt;li&gt;Utilize um reverse proxy como &lt;strong&gt;Caddy&lt;/strong&gt; ou &lt;strong&gt;Nginx&lt;/strong&gt; com autenticação por cabeçalho (&lt;code&gt;Authorization: Bearer &amp;lt;seu-token&amp;gt;&lt;/code&gt;) e terminação SSL/TLS se precisar expor para outros serviços.&lt;/li&gt;
&lt;li&gt;Se for para acesso remoto privado, utilize um túnel VPN moderno como &lt;strong&gt;Tailscale&lt;/strong&gt; ou &lt;strong&gt;WireGuard&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusão e Recursos
&lt;/h2&gt;

&lt;p&gt;Rodar o Ollama via Docker Compose traz a tranquilidade de atualizar imagens sem medo de quebrar bibliotecas do sistema operacional, além de facilitar a réplica do ambiente em qualquer servidor.&lt;/p&gt;

&lt;p&gt;Publiquei o guia completo com benchmarks de consumo de VRAM (8GB vs 12GB vs 16GB), dicas de dimensionamento de hardware e integrações no meu blog:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://landingfymax.com.br/tutoriais/tutorial-configurar-ollama-docker-gpu-local-2026" rel="noopener noreferrer"&gt;Guia Completo: Ollama com Docker e GPU no Fymax Sentinel&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Como você está rodando LLMs locais na sua infraestrutura hoje? Utiliza Docker, bare-metal ou soluções como vLLM/LocalAI? Deixe nos comentários!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>ai</category>
      <category>linux</category>
      <category>devops</category>
    </item>
    <item>
      <title>AI-Powered Zero-Day Chaining: A Deep Dive into Claude Mythos &amp; Project Glasswing</title>
      <dc:creator>Evandro Carvalho</dc:creator>
      <pubDate>Sun, 03 May 2026 17:23:06 +0000</pubDate>
      <link>https://dev.to/evandro_carvalho_ad7433b6/ai-powered-zero-day-chaining-a-deep-dive-into-claude-mythos-project-glasswing-4f8b</link>
      <guid>https://dev.to/evandro_carvalho_ad7433b6/ai-powered-zero-day-chaining-a-deep-dive-into-claude-mythos-project-glasswing-4f8b</guid>
      <description>&lt;p&gt;The cybersecurity landscape just shifted. Anthropic has confirmed Claude Mythos, a model capable of autonomously identifying and chaining Zero-Day vulnerabilities in under 120 seconds.&lt;/p&gt;

&lt;p&gt;Key Technical Highlights:&lt;/p&gt;

&lt;p&gt;IVD Architecture: Iterative Vulnerability Discovery allows the model to interact with virtualized environments in real-time, finding memory overflows that static analysis misses.&lt;br&gt;
Polymorphic Payloads: Mythos generates code that changes its signature with every execution, making signature-based detection (AV/EDR) 94% less effective.&lt;br&gt;
Attack Graphs: It maps multi-hop attack paths (up to 18 hops) that are virtually invisible to heuristic scanners.&lt;br&gt;
We are officially entering the AI vs AI era. If you're still relying on legacy firewalls, you're defending a castle with a paper door.&lt;/p&gt;

&lt;p&gt;Check out the full technical benchmarks and the performance comparison at Fymax Sentinel: 👉 &lt;a href="https://en.landingfymax.com.br/cybersecurity/claude-mythos-ai-cyber-weapon-2026" rel="noopener noreferrer"&gt;https://en.landingfymax.com.br/cybersecurity/claude-mythos-ai-cyber-weapon-2026&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhc3svsqn8czqzolaqeu1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhc3svsqn8czqzolaqeu1.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How are you preparing your stack for autonomous exploit chaining? Let's discuss in the comments.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>ai</category>
      <category>infosec</category>
      <category>devops</category>
    </item>
    <item>
      <title>Llama 4 and the Rise of Sovereign AI: Why Open Source Won in 2026</title>
      <dc:creator>Evandro Carvalho</dc:creator>
      <pubDate>Sat, 25 Apr 2026 01:13:55 +0000</pubDate>
      <link>https://dev.to/evandro_carvalho_ad7433b6/llama-4-and-the-rise-of-sovereign-ai-why-open-source-won-in-2026-3d3c</link>
      <guid>https://dev.to/evandro_carvalho_ad7433b6/llama-4-and-the-rise-of-sovereign-ai-why-open-source-won-in-2026-3d3c</guid>
      <description>&lt;p&gt;This week in April 2026, the AI landscape shifted. Meta’s Llama 4 release isn't just about higher benchmarks; it's about who owns the intelligence. For the first time, organizations can deploy a top-tier model that matches proprietary performance while keeping 100% data ownership.&lt;/p&gt;

&lt;p&gt;In this article, we explore the technical breakthroughs and the geopolitical impact of Meta’s boldest move yet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.landingfymax.com.br/artificial-intelligence/llama-4-meta-open-source-sovereignty-2026" rel="noopener noreferrer"&gt;https://en.landingfymax.com.br/artificial-intelligence/llama-4-meta-open-source-sovereignty-2026&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzwnnbacjm5sdye2kntgk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzwnnbacjm5sdye2kntgk.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
