Proteja o MikroTik contra força bruta no SSH e Winbox com address-list em estágios, port knocking, bloqueio de port scan e DNS aberto.
Para que serve
Basta um MikroTik ter IP público para começar a receber, em minutos, tentativas de login no SSH, no Winbox e no Telnet, além de varreduras de portas e consultas DNS usadas em ataques de amplificação. Este artigo mostra como proteger o MikroTik contra força bruta e esses ataques automatizados no RouterOS 7, usando address-lists com tempo de expiração, port knocking para esconder o gerenciamento e regras de detecção de varredura. Ele complementa o artigo «Firewall do MikroTik: regras base de filter e raw comentadas (RouterOS 7)» desta categoria, que deve estar aplicado antes.
Pré-requisitos
- Firewall base aplicado, com a lista de interfaces
WANe a regra raw que descarta alista_negra. - Safe Mode ativo durante as mudanças (
Ctrl+X) e uma rota de recuperação (MAC-Winbox pela LAN ou console da VM no Proxmox). - Exemplo: SSH na porta 22, Winbox na 8291, VPN administrativa em
10.8.0.0/24.
Passo 1: proteger SSH e Winbox com bloqueio em estágios
A ideia é contar novas conexões vindas do mesmo IP em pouco tempo. Cada nova conexão promove o IP para um estágio seguinte; quem passar do terceiro estágio vai para a lista_negra por um dia. Um administrador que erra a senha uma ou duas vezes não é bloqueado. As regras vão na chain input, antes da regra que aceita o serviço:
/ip firewall filter
add chain=input action=add-src-to-address-list address-list=lista_negra address-list-timeout=1d \
connection-state=new protocol=tcp dst-port=22,8291 src-address-list=bf_estagio3 \
in-interface-list=WAN comment="BF: 4a tentativa -> lista negra"
add chain=input action=add-src-to-address-list address-list=bf_estagio3 address-list-timeout=1m \
connection-state=new protocol=tcp dst-port=22,8291 src-address-list=bf_estagio2 in-interface-list=WAN
add chain=input action=add-src-to-address-list address-list=bf_estagio2 address-list-timeout=1m \
connection-state=new protocol=tcp dst-port=22,8291 src-address-list=bf_estagio1 in-interface-list=WAN
add chain=input action=add-src-to-address-list address-list=bf_estagio1 address-list-timeout=1m \
connection-state=new protocol=tcp dst-port=22,8291 in-interface-list=WAN comment="BF: 1a tentativa"
A ordem é proposital: de baixo para cima no fluxo lógico, mas de cima para baixo na tabela, para que um IP só avance um estágio por conexão. Mova o bloco para logo depois da regra established,related com place-before ou arrastando no Winbox. Como o raw descarta quem está na lista_negra, o bloqueio não gasta CPU depois de aplicado.
Inclua os seus IPs fixos e a VPN numa lista de exceção, para nunca bloquear a si mesmo:
/ip firewall address-list add list=admin_permitidos address=10.8.0.0/24
/ip firewall filter add chain=input action=accept src-address-list=admin_permitidos \
place-before=[find comment="BF: 4a tentativa -> lista negra"] comment="admin nunca e bloqueado"
Passo 2: esconder o gerenciamento com port knocking
No port knocking, as portas de gerenciamento ficam fechadas para todos. Só quem "bate" numa sequência secreta de portas, na ordem certa e dentro de um prazo curto, entra numa lista temporária de liberados. Exemplo com a sequência 7001 → 7002 → 7003 (escolha números próprios):
/ip firewall filter
add chain=input action=add-src-to-address-list address-list=knock1 address-list-timeout=15s \
protocol=tcp dst-port=7001 in-interface-list=WAN comment="PK: batida 1"
add chain=input action=add-src-to-address-list address-list=knock2 address-list-timeout=15s \
protocol=tcp dst-port=7002 src-address-list=knock1 in-interface-list=WAN comment="PK: batida 2"
add chain=input action=add-src-to-address-list address-list=admin_liberado address-list-timeout=1h \
protocol=tcp dst-port=7003 src-address-list=knock2 in-interface-list=WAN comment="PK: batida 3 libera por 1h"
add chain=input action=accept protocol=tcp dst-port=22,8291 src-address-list=admin_liberado comment="PK: acesso liberado"
Essas regras precisam ficar antes do drop final da chain input. As batidas em si são descartadas pelo drop final (o cliente não recebe resposta), mas a regra de lista já registrou o IP.
Para bater, do seu computador:
# Linux/macOS (com nmap instalado)
for p in 7001 7002 7003; do nmap -Pn --max-retries 0 -p $p 203.0.113.19; done
# Windows PowerShell
7001,7002,7003 | ForEach-Object { Test-NetConnection 203.0.113.19 -Port $_ -WarningAction SilentlyContinue | Out-Null }
Depois disso, abra o Winbox normalmente pelo IP público durante uma hora. Lembre que o port knocking é "segurança por obscuridade": quem enxerga o seu tráfego pode descobrir a sequência. Use junto com senha forte e, de preferência, só como acesso de emergência.
Passo 3: detectar varredura de portas
O RouterOS tem um detector de port scan (psd) que pontua conexões para muitas portas diferentes em pouco tempo:
/ip firewall filter
add chain=input action=add-src-to-address-list address-list=lista_negra address-list-timeout=1d \
protocol=tcp psd=21,3s,3,1 in-interface-list=WAN comment="SCAN: varredura de portas"
Uma armadilha simples também funciona bem: qualquer conexão a uma porta que você nunca usa, como 23 (Telnet) ou 3389 (RDP no próprio roteador), coloca o IP na lista negra:
add chain=input action=add-src-to-address-list address-list=lista_negra address-list-timeout=1d \
protocol=tcp dst-port=23,3389,445,1433 in-interface-list=WAN comment="ARMADILHA: portas que ninguem deveria tentar"
Cuidado ao aplicar armadilhas a portas que você publica por dst-nat: as regras acima estão na chain input, que só vê tráfego destinado ao roteador, então não interferem nos redirecionamentos.
Passo 4: fechar DNS e outros amplificadores
Se o roteador atende DNS para a LAN, garanta que a porta 53 não responde na WAN. Com o firewall base (drop final na input) isso já acontece; se você ainda não aplicou o drop final, adicione:
/ip firewall filter
add chain=input action=drop protocol=udp dst-port=53 in-interface-list=WAN comment="DNS fechado na WAN"
add chain=input action=drop protocol=tcp dst-port=53 in-interface-list=WAN
Faça o mesmo raciocínio para SNMP (161/udp) e para o servidor de bandwidth-test (2000/tcp) se estiverem ativos.
Passo 5: limitar novas conexões por IP
Para serviços publicados (por exemplo, um site por dst-nat), dá para limitar quantas conexões simultâneas um único IP abre, contendo robôs e pequenos floods:
/ip firewall filter
add chain=forward action=drop protocol=tcp dst-port=443 connection-limit=100,32 \
in-interface-list=WAN comment="limite de 100 conexoes por IP no HTTPS publicado"
Ataques volumétricos de verdade não são resolvidos no roteador: eles são tratados pela proteção AntiDDoS da rede. Veja também o artigo sobre ataques DDoS na categoria de rede.
Como saber se funcionou
/ip firewall address-list print where list=lista_negramostra IPs entrando com tempo restante (coluna timeout)./ip firewall raw print stats: o contador da regra da lista negra sobe, mostrando que o descarte acontece antes da filter.- Teste o port knocking de fora: sem bater,
nmap -Pn -p 8291 IPmostrafiltered; após a sequência, a porta apareceopenpara o seu IP. - Teste o DNS de fora:
dig @IP_PUBLICO exemplo.com.brdeve dar timeout.
Problemas comuns
- Eu mesmo fui bloqueado: entre pelo console ou MAC-Winbox e remova:
/ip firewall address-list remove [find list=lista_negra address=SEU_IP]. Depois, coloque o seu IP emadmin_permitidos. - Port knocking não libera: a sequência demorou mais que o timeout, saiu de outro IP (celular trocando de rede, CGNAT) ou as regras estão depois do drop final.
- Lista negra enorme e roteador lento: confirme que o descarte está na raw, não na filter, e reduza o timeout para algumas horas.
- Usuários de um mesmo escritório bloqueados juntos: todos saem pelo mesmo IP. Coloque esse IP na lista de exceção.
Perguntas frequentes
Trocar a porta do SSH e do Winbox basta contra força bruta?
Diminui o volume de tentativas automáticas, mas um scan completo encontra a porta nova. Combine com as listas acima ou, melhor, feche o acesso pela VPN.
Address-list com timeout some depois de reiniciar?
Sim, entradas dinâmicas (com timeout) são perdidas no reboot. Para bloqueios permanentes, adicione o endereço manualmente, sem timeout.
Posso usar listas públicas de IPs maliciosos?
Pode, importando-as periodicamente por script com /tool fetch. Escolha fontes confiáveis e mantenha o descarte na raw para não pesar na CPU.
Leitura complementar
Precisa de ajuda?
Se suspeitar que o seu MikroTik já foi invadido (usuários desconhecidos, scripts ou agendamentos que você não criou, proxy ativado), abra um ticket na Área do Cliente e veja também o artigo sobre suspeita de invasão na categoria de segurança.
