Por que firewall no CCR e obrigatorio
Muito ISP brasileiro ainda opera CCR de borda com firewall padrao de fabrica — porque acha que BGP full-table ja “se protege”. Isso e um erro caro:
- Sem
chain=inputfiltrado, qualquer bot na internet tenta 24/7 abrir Winbox na porta 8291, SSH na 22 e API na 8728. - Sem
raw table, um SYN-flood de 2 Gbps derruba o conntrack e trava o router, mesmo que a CPU aguente. - Sem
address-listpara pacotes bogon, voce propaga lixo para upstream e recebe pacotes com IPs privados na borda. - Sem
fasttrack, o CCR consome ate 3x mais CPU porque todos os pacotes passam por conntrack.
As 10 regras abaixo sao um minimo defensavel, testado em dezenas de ISPs. Copie, adapte para o seu range, teste em lab e aplique.
Chain input: acesso e anti-brute-force
Deixe o conntrack fazer o trabalho pesado. Pacotes de sessoes ja aceitas entram direto, sem reavaliar.
Pacotes com estado invalid (fora de sequencia, SYN para conn fechada) nunca tem caso de uso legitimo. Dropar cedo.
Ping e util para voce, mas flood ICMP e abuso. Aceite ICMP com limit de 10 pps.
Winbox, SSH e API aceitos apenas de uma address-list chamada mgmt. Tentativas de fora caem em address-list progressivo ssh-bruteforce-stage1 -> stage2 -> stage3 -> blacklist.
Chain forward: fasttrack, conntrack, anti-bogons
A regra mais importante para performance. Marcar conexoes estabelecidas com action=fasttrack-connection pula conntrack nos pacotes seguintes — ganho de 2-3x em throughput no mesmo hardware.
Pacotes com IPs privados chegando da WAN (bogons) sao sempre ataques ou erros de configuracao. Address-list estatica com as RFC1918 + TEST-NET + multicast + carrier-grade NAT, dropada em forward.
Se voce opera um range publico proprio (ex: 203.0.113.0/24), libere esse range saindo e dropando todo o resto. Simples e efetivo para evitar IP spoofing.
Chain NAT: masquerade e port-forward seguro
Evite o classico out-interface=ether1 action=masquerade generico. Filtre por source para nao mascarar trafego publico de clientes ja com IP valido.
Se expuser um servico (ex: servidor radius), restrinja src-address-list ao publico autorizado. DST-NAT sem filtro de origem e um conviteara scan massivo.
Raw table: protecao contra DDoS
A joia da coroa. Em /ip firewall raw, drope bogons, SYN-flood detectado, fragments e pacotes de UDP amplification (DNS, NTP, memcached) vindo de fora para destinos nao-autorizados. Isso nao passa por conntrack, protegendo o CCR em DDoS volumetrico.
Exemplos praticos de regras raw:
action=drop src-address-list=bogons— dropa IPs privados/reservados chegando da WAN.action=drop protocol=icmp in-interface-list=WAN limit=10000/1s,10000,packet— limita ICMP para nao servir de amplification.action=drop protocol=udp src-port=53,123,11211 in-interface-list=WAN— dropa refletores conhecidos de amplification.
Address-list: geo-blocking simples
Se o seu ISP so atende cliente brasileiro, nao faz sentido aceitar trafego de entrada de paises que sao origem recorrente de ataques. Mantenha uma address-list atualizada via script /tool fetch que baixa um feed publico de paises bloqueados e aplica em raw:
# Atualiza address-list "geoblock-cn" com prefixos da CN # Use um feed confiavel do seu IX ou do proprio RIPE :local feed "https://www.ipdeny.com/ipblocks/data/countries/cn.zone" /ip firewall address-list remove [find where list="geoblock-cn"] /tool fetch url=$feed dst-path=cn.zone :local content [/file get cn.zone contents] # (implementacao simplificada; para producao use /import em loop) :foreach cidr in=[:toarray $content] do={ :if ([:len $cidr] > 0) do={ /ip firewall address-list add list="geoblock-cn" address=$cidr comment="CN auto-update" } } :log info "[GEO] Address-list geoblock-cn atualizada"
Script .rsc completo
O script abaixo monta as 10 regras descritas + bogon list + address-list de management. Edite as duas variaveis no topo antes de importar:
# ==================================================================== # firewall-isp-padrao.rsc - 10 regras essenciais para CCR de ISP # Mevlox Distribuidora - distribuidora.mevlox.com.br # ==================================================================== # === EDITE AQUI antes de importar === :local mgmtNet "10.100.0.0/24" # Rede de management (Winbox/SSH/API) :local meuRange "203.0.113.0/24" # Seu bloco publico (anti-spoof) # === Interface lists === /interface list add name=WAN /interface list add name=LAN /interface list add name=MGMT # (Adicione membros com /interface list member add ...) # === Address-lists estaticas === /ip firewall address-list add list=mgmt address=$mgmtNet comment="Management authorized" add list=bogons address=0.0.0.0/8 comment="Current network" add list=bogons address=10.0.0.0/8 comment="RFC1918" add list=bogons address=100.64.0.0/10 comment="CGN RFC6598" add list=bogons address=127.0.0.0/8 comment="Loopback" add list=bogons address=169.254.0.0/16 comment="Link-local" add list=bogons address=172.16.0.0/12 comment="RFC1918" add list=bogons address=192.0.0.0/24 comment="IETF" add list=bogons address=192.0.2.0/24 comment="TEST-NET-1" add list=bogons address=192.168.0.0/16 comment="RFC1918" add list=bogons address=198.18.0.0/15 comment="Benchmark" add list=bogons address=198.51.100.0/24 comment="TEST-NET-2" add list=bogons address=203.0.113.0/24 comment="TEST-NET-3" add list=bogons address=224.0.0.0/4 comment="Multicast" add list=bogons address=240.0.0.0/4 comment="Reserved" # ==================================================================== # CHAIN INPUT (trafego destinado ao proprio router) # ==================================================================== /ip firewall filter # REGRA 1: accept established/related add chain=input action=accept connection-state=established,related \ comment="[01] Established/Related" # REGRA 2: drop invalid add chain=input action=drop connection-state=invalid \ comment="[02] Drop invalid" # REGRA 3: accept ICMP com rate-limit add chain=input action=accept protocol=icmp limit=10,5:packet \ comment="[03] ICMP rate-limited" # REGRA 4a: Anti-brute-force (escalonamento progressivo em address-list) add chain=input action=drop src-address-list=ssh-blacklist protocol=tcp \ dst-port=22,8291,8728 comment="[04a] Drop blacklisted" add chain=input action=add-src-to-address-list address-list=ssh-blacklist \ address-list-timeout=1w src-address-list=ssh-stage3 \ protocol=tcp dst-port=22,8291,8728 connection-state=new \ comment="[04b] Stage3 -> blacklist" add chain=input action=add-src-to-address-list address-list=ssh-stage3 \ address-list-timeout=1m src-address-list=ssh-stage2 \ protocol=tcp dst-port=22,8291,8728 connection-state=new \ comment="[04c] Stage2 -> stage3" add chain=input action=add-src-to-address-list address-list=ssh-stage2 \ address-list-timeout=1m src-address-list=ssh-stage1 \ protocol=tcp dst-port=22,8291,8728 connection-state=new \ comment="[04d] Stage1 -> stage2" add chain=input action=add-src-to-address-list address-list=ssh-stage1 \ address-list-timeout=1m protocol=tcp dst-port=22,8291,8728 \ connection-state=new comment="[04e] Novo -> stage1" # REGRA 4: accept management de mgmt list add chain=input action=accept src-address-list=mgmt \ comment="[04] Accept management" # Drop tudo restante da WAN add chain=input action=drop in-interface-list=WAN \ comment="[INPUT] Drop others from WAN" # ==================================================================== # CHAIN FORWARD (trafego passando pelo router) # ==================================================================== # REGRA 5: fasttrack para conexoes established add chain=forward action=fasttrack-connection connection-state=established,related \ comment="[05] FastTrack" # accept established,related (mesmo com fasttrack) add chain=forward action=accept connection-state=established,related \ comment="[FWD] Established/Related" # REGRA 6: drop invalid e bogons add chain=forward action=drop connection-state=invalid \ comment="[06a] Drop invalid" add chain=forward action=drop src-address-list=bogons in-interface-list=WAN \ comment="[06b] Drop bogons from WAN" # REGRA 7: anti-spoof (so meu range pode sair) add chain=forward action=drop src-address=$meuRange in-interface-list=WAN \ comment="[07a] Anti-spoof meu range na WAN" # ==================================================================== # CHAIN NAT # ==================================================================== /ip firewall nat # REGRA 8: masquerade so para faixas privadas add chain=srcnat action=masquerade out-interface-list=WAN \ src-address-list=bogons comment="[08] Masquerade only private" # REGRA 9: port-forward com address-list restritiva (exemplo RADIUS) # add chain=dstnat action=dst-nat to-addresses=10.0.0.10 to-ports=1812 \ # protocol=udp dst-port=1812 src-address-list=radius-authorized \ # comment="[09] RADIUS port-forward" # ==================================================================== # RAW TABLE (antes do conntrack - antiDDoS pesado) # ==================================================================== /ip firewall raw # REGRA 10: drop bogons no prerouting (antes do conntrack) add chain=prerouting action=drop src-address-list=bogons in-interface-list=WAN \ comment="[10a] Raw drop bogons from WAN" # Rate-limit ICMP externo add chain=prerouting action=drop protocol=icmp in-interface-list=WAN \ limit=10000,5000:packet comment="[10b] Raw limit ICMP" # Drop refletores UDP conhecidos (DNS, NTP, memcached, chargen) add chain=prerouting action=drop protocol=udp in-interface-list=WAN \ dst-port=19,53,123,161,389,1900,11211 \ comment="[10c] Raw drop UDP amplifiers" # Drop fragmented packets pequenos (TCP ataque classico) add chain=prerouting action=drop protocol=tcp tcp-flags=fin,syn \ comment="[10d] Raw drop invalid TCP flags" add chain=prerouting action=drop protocol=tcp tcp-flags=syn,rst \ comment="[10e] Raw drop invalid TCP flags" :log info "[FIREWALL] Regras padrao ISP aplicadas com sucesso" # === FIM ===
Para baixar esse script pronto e outros para PPPoE, WireGuard, IPsec e mais, visite nossa biblioteca de scripts.
