Cgnat
Com o fim dos IPv4 as operadoras precisam fazer NAT conhecido também com CGNAT (Carrier-grade NAT) ou em uma tradução livre NAT no nível do provedor. Pra isso foi designado o range de IPs 100.64.0.0/10 conforme a RFC6598. Mas vamos ser práticos, se você já entrega um IP privado comum pro cliente não tem por que você mudar para o IP do range 100.64.x.x só pra melhorar seu NAT para CGNAT. E se você é provedor e tem um cliente que vai registrar a entrega dos IPs do Hotspot de forma eficiente pode entregar um IP fixo pra ele e fazer CGNAT no roteador dele usando IP Privado entregue ao cliente.
Não da pra rastrear CGNAT em cima de CGNAT.
Mas qual a diferença do NAT normal para o CGNAT?
NAT
O NAT comum você coloca vários IPs privados usando o mesmo IP publico e não altera a porta de origem. EX: O Navegador do cliente exemplo 192.168.30.10 usa aleatoriamente uma porta alta exemplo 63021 e fala com o IP do site exemplo 216.58.222.9 do blogger na porta 443 se for HTTPs. Então temos uma conexão: 192.168.30.10:63021 –> 216.58.222.9:443 é alterada para 192.0.2.1:63021 –> 216.58.222.9:443
Um segundo cliente pode escolher a mesma porta ou uma outra porta imediatamente acima ou abaixo ou qualquer outra ficando impossível identificar qual cliente estava em que porta de origem e dizer qual cliente acessou o site.
CGNAT
Com CGNAT faz o que o NAT normalmente faz e também altera a porta de origem. Então especificamos por exemplo que o cliente 192.168.30.10 usa portas de 10000-a 10999 e o cliente 192.168.30.11 usa portas de 11000 a 11999. 192.168.30.11:63021 –> 216.58.222.9:443 é alterada para 192.0.2.1:10021 –> 216.58.222.9:443 192.168.30.10:57851 –> 216.58.222.9:443 é alterada para 192.0.2.1:11850 –> 216.58.222.9:443
Assim quando precisar identificar o cliente basta saber a porta de origem pois a porta identifica o IP de origem.
A grande sacada do CGNAT é controlar a porta de origem.
Como implantar?
Para fins didáticos eu vou dar nomes pra 2 métodos, só eu chamo assim, vou chamar de CGNAT Vertical e CGNAT Horizontal
CGNAT Vertical
Aprendi sobre esse método no WIKI da MIKROTIK. Como ele exige a criação de muitas regras tem até um script pra facilitar a implantação.
Quando e Como usar:
Casos de hotspots públicos;
Provedores sem AS com muito poucos IPs;
Para dividir as portas tem que pensar quantos IPs privados vai colocar em cada IP público.
Vantagem:
- Colocar vários “Range de IPs Privados” em 1 único IP público;
- O Range de IPs Privados ficando dentro de 1 IP público a contagem de portas não se perde. A cada Range de IPs Privado novo uso um novo IP público.
Desvantagem:
- Muitas regras, pois são 2 (TCP, UDP) pra cada IP interno mais os jumps pra otimizar;
- Como são tantas regras o ICMP com certeza você vai escolher um IP qualquer para todos os clientes usarem, mesmo que seja diferente do IP que o cliente normalmente usa.
Exemplo de implementação com mikrotik:
` /ip firewall nat add action=jump chain=srcnat comment=CGNAT jump-target=CGNAT-192.0.2.160 out-interface=BridgeBackbone src-address=100.64.0.0/25 add action=jump chain=CGNAT-192.0.2.160 comment=CGNAT jump-target=CGNAT-192.0.2.160-0 src-address=100.64.0.0/28 add action=jump chain=CGNAT-192.0.2.160 comment=CGNAT jump-target=CGNAT-192.0.2.160-1 src-address=100.64.0.16/28 add action=jump chain=CGNAT-192.0.2.160 comment=CGNAT jump-target=CGNAT-192.0.2.160-2 src-address=100.64.0.32/28 add action=jump chain=CGNAT-192.0.2.160 comment=CGNAT jump-target=CGNAT-192.0.2.160-3 src-address=100.64.0.48/28 add action=jump chain=CGNAT-192.0.2.160 comment=CGNAT jump-target=CGNAT-192.0.2.160-4 src-address=100.64.0.64/28 add action=jump chain=CGNAT-192.0.2.160 comment=CGNAT jump-target=CGNAT-192.0.2.160-5 src-address=100.64.0.80/28 add action=jump chain=CGNAT-192.0.2.160 comment=CGNAT jump-target=CGNAT-192.0.2.160-6 src-address=100.64.0.96/28 add action=jump chain=CGNAT-192.0.2.160 comment=CGNAT jump-target=CGNAT-192.0.2.160-7 src-address=100.64.0.112/28 add action=src-nat chain=CGNAT-192.0.2.160-0 comment=CGNAT protocol=tcp src-address=100.64.0.0 to-addresses=192.0.2.160 to-ports=1500-1999 add action=src-nat chain=CGNAT-192.0.2.160-0 comment=CGNAT protocol=udp src-address=100.64.0.0 to-addresses=192.0.2.160 to-ports=1500-1999 add action=src-nat chain=CGNAT-192.0.2.160-0 comment=CGNAT protocol=tcp src-address=100.64.0.1 to-addresses=192.0.2.160 to-ports=2000-2499 add action=src-nat chain=CGNAT-192.0.2.160-0 comment=CGNAT protocol=udp src-address=100.64.0.1 to-addresses=192.0.2.160 to-ports=2000-2499 … … … add action=src-nat chain=CGNAT-192.0.2.160-7 comment=CGNAT protocol=tcp src-address=100.64.0.126 to-addresses=192.0.2.160 to-ports=64500-64999 add action=src-nat chain=CGNAT-192.0.2.160-7 comment=CGNAT protocol=udp src-address=100.64.0.126 to-addresses=192.0.2.160 to-ports=64500-64999 add action=src-nat chain=CGNAT-192.0.2.160-7 comment=CGNAT protocol=tcp src-address=100.64.0.127 to-addresses=192.0.2.160 to-ports=65000-65499 add action=src-nat chain=CGNAT-192.0.2.160-7 comment=CGNAT protocol=udp src-address=100.64.0.127 to-addresses=192.0.2.160 to-ports=65000-65499`
CGNAT Horizontal
Aprendi esse método com um colega provedor. A grande sacada é diminuir o número de regras usando netmap. Como o netmap funciona? Ele altera os bits que fazem parte da rede. O ideal então é que a mascara usada para selecionar os IPs que vão usar a regra seja igual a da rede assim teremos o NAT 1:1. Vejam que no caso do ICMP que permite o cliente enviar ping pra internet eu não me preocupei com o NAT não ser 1:1 usei mascara /10 para /25.
Quando e Como usar:
- Provedores com AS mas menos IPs que clientes;
- Para dividir os “Ranges de IPs Privados” preciso saber quantos IPs públicos posso usar;
- Para dividir as portas tem que pensar quantos “Ranges de IPs Privados” vai precisar.
Vantagem: - Quanto mais IP públicos, maior pode ser considerado o “Range de IPs Privados”; - Quanto mais IP públicos, menor o número de regras usadas; 1 regra pra 128 ou 1 pra 64
Desvantagem:
- Não da pra usar só 1 IP público;
- Tem que manter o controle de todos os Ranges usados pois a contagem de porta não zera. Assim se for criar uma nova regra precisa iniciar na ultima porta utilizada anteriormente.
Exemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/ip firewall nat
add action=jump chain=srcnat jump-target=CGNAT out-interface="ether-LINK" src-address-list=!CLIENTES_FIXOS
add action=netmap chain=CGNAT protocol=icmp src-address=100.64.0.0/10 \
to-addresses=192.0.2.0/25
add action=jump chain=CGNAT jump-target=CGNAT_100_64 src-address=100.64.0.0/16
add action=jump chain=CGNAT jump-target=CGNAT_100_65 src-address=100.65.0.0/16
add action=jump chain=CGNAT_100_64 jump-target=CGNAT_100_64_0-7 src-address=\
100.64.0.0/21
add action=jump chain=CGNAT_100_64 jump-target=CGNAT_100_64_8-15 src-address=\
100.64.8.0/21
add action=jump chain=CGNAT_100_64 jump-target=CGNAT_100_64_16-23 src-address=\
100.64.16.0/21
add action=jump chain=CGNAT_100_64 jump-target=CGNAT_100_64_24-31 src-address=\
100.64.24.0/21
add action=jump chain=CGNAT_100_64 jump-target=CGNAT_100_64_32-39 src-address=\
100.64.32.0/21
add action=jump chain=CGNAT_100_64 jump-target=CGNAT_100_64_40-47 src-address=\
100.64.40.0/21
add action=jump chain=CGNAT_100_64 jump-target=CGNAT_100_64_48-56 src-address=\
100.64.48.0/21
...
...
...
add action=netmap chain=CGNAT_100_64_8-15 protocol=tcp src-address=\
100.64.9.0/25 to-addresses=192.0.2.0/25 to-ports=5000-5499
add action=netmap chain=CGNAT_100_64_8-15 protocol=udp src-address=\
100.64.9.0/25 to-addresses=192.0.2.0/25 to-ports=5000-5499
add action=netmap chain=CGNAT_100_64_8-15 protocol=tcp src-address=\
100.64.10.0/25 to-addresses=192.0.2.0/25 to-ports=5500-5999
add action=netmap chain=CGNAT_100_64_8-15 protocol=udp src-address=\
100.64.10.0/25 to-addresses=192.0.2.0/25 to-ports=5500-5999
...
...
...
add action=netmap chain=CGNAT_100_64_48-56 protocol=tcp src-address=\
100.64.53.0/25 to-addresses=192.0.2.0/25 to-ports=17500-17999
add action=netmap chain=CGNAT_100_64_48-56 protocol=udp src-address=\
100.64.53.0/25 to-addresses=192.0.2.0/25 to-ports=17500-179
add action=netmap chain=CGNAT_100_64_48-56 protocol=tcp src-address=\
100.64.54.0/25 to-addresses=192.0.2.0/25 to-ports=18000-18499
add action=netmap chain=CGNAT_100_64_48-56 protocol=udp src-address=\
100.64.54.0/25 to-addresses=192.0.2.0/25 to-ports=18000-18499
...
...
...
Por que separei a questão dos “Ranges de IPs Privados”, pois independente da utilização (rotas, localização, agregações) IPs podem ser agrupados ou divididos pela mascara.
Exemplo: Se eu tenho na minha pra funcionamento 2 /25 posso dizer que tenho 1 /24 como posso dizer que tenho 64 /30
Se for usar 255 IPs públicos, posso usar ranges /24 Se for usar 128 IPs públicos, posso usar ranges /25 Se for usar 64 IPs públicos, posso usar ranges /26 Se for usar 4 IPs públicos, posso usar ranges /30

