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