O que é CGNAT:

Para combater o esgotamento do endereço IPv4, o RFC 6598 foi implantado.

A ideia é usar o espaço de endereço 100.64.0.0/10 compartilhado dentro da rede da operadora e executar o NAT no roteador de borda da operadora para um IP público ou intervalo de IP público.

Devido à natureza dessa configuração, também é chamada de NAT444.

https://wiki.mikrotik.com/wiki/Manual:IP/Firewall/NAT#Carrier-Grade_NAT_.28CGNAT.29_or_NAT444

Detalhes do CGNAT:

  • É feita à distribuição de portas, para cada cliente (ip privado) você reserva 1000 (mil) portas para ele navegar de uma forma minimamente satisfatória.
  • Como um IP suporta cerca de 65 mil conexões (portas), assim atribuímos 64 clientes (as primeiras 1000 portas ficam reservadas por serem portas baixas)
  • Se você colocar mais de 64 clientes por ip certamente terá problemas com a navegação dos clientes, sendo que alguns podem vir a usar mais portas que outros.
  • Quantos menos clientes por IP melhor será a conexão dos clientes.
  • Só é possível fazer CGNAT com no mínimo um IP fixo.

Esse “mapeamento de portas” também é usado como base para fazer o LOG, ou seja:

– Você define que aquele IP sempre saia por aquele range de portas, sabendo assim qual ip foi quando solicitarem a identificação de algum usuário (se passarem a porta).

Porém essa identificação depende de muitos fatores que costumam dar problema, exemplo:
– ip dinâmico no pppoe
– troca de regras
– ips públicos
– sistema gestão

Tem um sistema bem legal que resolve este problema, conheça ele aqui.

Desvantagens do CGNAT:

A vantagem do NAT444 é óbvia: menos endereços IPv4 públicos são usados. Mas essa técnica apresenta desvantagens:

  • O roteador do provedor que executa o CGNAT precisa manter uma tabela de estado para todas as traduções de endereços: isso requer muitos recursos de memória e CPU.
  • Problemas de jogos de console. Alguns jogos falham quando dois assinantes usando o mesmo endereço IPv4 público externo tentam se conectar.
  • O rastreamento de usuários por motivos legais significa registro extra, já que várias famílias ficam atrás de um endereço público.
  • Qualquer coisa que requeira conexões de entrada é interrompida.
  • Alguns servidores da web permitem apenas um número máximo de conexões do mesmo endereço IP público, como um meio de conter ataques DoS como inundações de SYN. Com o CGNAT, esse limite é atingido com mais frequência e alguns serviços podem ser de baixa qualidade

Duplo NAT:

Outro problema muito comum em provedores é a Aplicação Dupla de NAT, ou até tripla ou mesmo quadrupla (4 Nats), isso é comum mas pode ser evitado ou minimizado da seguinte maneira:

  • Deixar o roteador da operadora ou provedor que te fornece o link em bridge fazendo a autenticação direto no mikrotik.
  • Desativar NAT de outros concentradores mikrotiks, deixando o NAT somente no roteador mikrotik da borda
  • Colocar a autenticação do seu cliente no roteador dele, não deixar na ONU ou antena.

Ainda sim sempre terá um NAT duplo caso você não entregue um ip público para o cliente, mas evitará nat adicionais.

Script Nat Mikrotik:

Adicione o código abaixo no terminal, ele irá criar um script:

:global sqrt do={
  :for i from=0 to=$1 do={
    :if (i * i > $1) do={ :return ($i - 1) }
  }
}

:global addNatRules do={
  /ip firewall nat add chain=srcnat action=jump jump-target=xxx \
    src-address="$($srcStart)-$($srcStart + $count - 1)"

  :local x [$sqrt $count]
  :local y $x
  :if ($x * $x = $count) do={ :set y ($x + 1) }
  :for i from=0 to=$x do={
    /ip firewall nat add chain=xxx action=jump jump-target="xxx-$($i)" \
     src-address="$($srcStart + ($x * $i))-$($srcStart + ($x * ($i + 1) - 1))"
  }

  :for i from=0 to=($count - 1) do={
    :local prange "$($portStart + ($i * $portsPerAddr))-$($portStart + (($i + 1) * $portsPerAddr) - 1)"
    /ip firewall nat add chain="xxx-$($i / $x)" action=src-nat protocol=tcp src-address=($srcStart + $i) \
     to-address=$toAddr to-ports=$prange
    /ip firewall nat add chain="xxx-$($i / $x)" action=src-nat protocol=udp src-address=($srcStart + $i) \
     to-address=$toAddr to-ports=$prange
  }
}

Depois de colar o script acima na função do terminal “addNatRules” está disponível.

Se pegarmos nosso exemplo, precisamos mapear 6 endereços de rede compartilhados para serem mapeados para 2.2.2.2 e cada endereço usa um intervalo de 100 portas a partir de 2000. Então, executamos nossa função:

$addNatRules count=6 srcStart=100.64.1.1 toAddr=2.2.2.2 portStart=2000 portsPerAddr=100

Vídeo tutorial prático: