#  > Telecomunicações >  > Mikrotik >  >  Script CGNAT

## AndrioPJ

Pessoal,

No Site da Mikrotik existe um script para criação das Regras de CGNAT.
Acontece que ao utilizar esse script, se colocamos para criar as regras para 64 IPs, ele cria uma regra a mais. Se colocamos para 32 IPs, ele cria regra a menos.

Como não achei algum outro script funcional, acabei criando o meu próprio, Baseado no que tem disponível no wiki da Mikrotik e em algumas dicas nos fóruns.

Segue abaixo Script para criação das Regras de CGNAT.

Nesse Script precisamos informar o Network do IP privado (IP/26, /27, /28, /29), quantos IPs queremos por regra/jump, o IP Publico, quantidade de portas alocada para cada IP...
A partir dai, ele calcula automaticamente os IPs disponíveis nesse network configurado, cria 2 Regras (uma TCP e uma UDP) para cada IP, já dividido e alocado a quantidade de Portas especificada para cada IP.
Bem como Para ajudar a diminuir a carga de CPU, ele já cria algumas regras de jump's (Baseado na quantidade de IPs que você configurou/disse que quer por regra).

*Como usar?
*1 - Copie o código abaixo e execute no terminal do seu MK


```
:global addNatRules do={
:global srcStart [:pick $NetworkIP 0 [:find $NetworkIP "/"]]
:global srcStart2 $srcStart
:global QtdRegras 0
:global QtdRegras2 0
:global portStop ($portStart + $portsPerAddr - 1)
  /ip firewall nat add chain=srcnat action=jump jump-target=$NewChain comment="Inicio CGNAT - By Andriopj" src-address="$NetworkIP"
        :log info "O Network é $NetworkIP";
        :log info "Iniciando em $srcStart";
:put "Current IP: $srcStart\r\nTarget: $NetworkIP\r\n"
  :while ($srcStart in $NetworkIP) do={
        :log info "IP atual é $srcStart";
    /ip firewall nat add chain=$NewChain action=jump jump-target="$NewChain-$($QtdRegras)" src-address="$srcStart-$($srcStart + ($IPsPerRule - 1 ))"
        :set QtdRegras ($QtdRegras + 1);
        :set srcStart ($srcStart + $IPsPerRule);
  }
        :log info "Qtd de Regras Jump criadas: $QtdRegras";
  :while ($srcStart2 in $NetworkIP) do={
        :for i from=1 to=$IPsPerRule do={
         /ip firewall nat add chain="$NewChain-$QtdRegras2" action=src-nat comment="CGNAT IP $srcStart2 Porta $portStart - $portStop - By Andriopj" protocol=tcp src-address=$srcStart2 to-address=$toPublicIP to-ports="$portStart-$portStop"
         /ip firewall nat add chain="$NewChain-$QtdRegras2" comment="CGNAT IP $srcStart2 Porta $portStart - $portStop - By Andriopj" action=src-nat protocol=udp src-address=$srcStart2 to-address=$toPublicIP to-ports="$portStart-$portStop"
        :set srcStart2 ($srcStart2 + 1);
        :set $portStart ($portStop + 1);
        :set $portStop ($portStart + $portsPerAddr - 1);
        :set i ($i + 1)
        }
        :set QtdRegras2 ($QtdRegras2 + 1);
  }
}
```

 
2 - Edite o código abaixo, Copie e execute no terminal do seu MK.
Caso precise criar as regras para bastante IPs, basta repetir a Regra abaixo sempre alterando o Network e o IP Publico.


```
$addNatRules NewChain=cgnat NetworkIP=100.64.200.0/27 IPsPerRule=8 toPublicIP=2.2.2.2 portStart=1025 portsPerAddr=2000
```

 
Variáveis:
- NewChain = Nome desejado para o Chain das regras CGNAT, caso for rodar a regra várias vezes no mesmo concentrador, recomendo alterar esse nome tbm. Basta colocar um numero na frente.
- NetworkIP = Bloco (Network /26, /27, /28, /29) Privado que será usado na criação das regras.
- IPsPerRule = Quantidade de IPs (2, 4, 8, 16, 32, 64) desejado por Regra Jump
- toPublicIP = IP Publico que será dividido
- portStart = Inicio das Portas
- portsPerAddr = Quantidade de Portas por IP Privado.


Lembre-se que existem apenas 64536 portas.
Se colocar um Network com 64 IPs e configurar 2000 portas por IP, vai ultrapassar a quantidade de portas disponíveis.

*Fonts:
*https://wiki.mikrotik.com/wiki/Manual:IP/Firewall/NAT
https://wiki.mikrotik.com/wiki/Manua...pting-examples

----------


## andrecarlim

Eita rapaz bom! Você está de parabéns!

----------


## valdineiq

Parabéns pela postagem

----------


## naldo864

> Pessoal,
> 
> No Site da Mikrotik existe um script para criação das Regras de CGNAT.
> Acontece que ao utilizar esse script, se colocamos para criar as regras para 64 IPs, ele cria uma regra a mais. Se colocamos para 32 IPs, ele cria regra a menos.
> 
> Como não achei algum outro script funcional, acabei criando o meu próprio, Baseado no que tem disponível no wiki da Mikrotik e em algumas dicas nos fóruns.
> 
> Segue abaixo Script para criação das Regras de CGNAT.
> 
> ...


isto sim e ajuda em tempos que quem sabe alguma coisa guarda a 7 chaves como se fosse um tesouro ,temos que sempre compartilhar conhecimento.

----------


## AndrioPJ

> isto sim e ajuda em tempos que quem sabe alguma coisa guarda a 7 chaves como se fosse um tesouro ,temos que sempre compartilhar conhecimento.


Sei bem como é.
Antes de literalmente colocar a mão na massa, eu tentei achar algum funcional e que não criasse regras a mais ou a menos.

----------


## bimbo

Funcionou perfeitamente porém icmp não funcionou, tem alguma coisa que pode ser feito pra corrigir isso?

----------


## AndrioPJ

> Funcionou perfeitamente porém icmp não funcionou, tem alguma coisa que pode ser feito pra corrigir isso?


Antes das regras de CGNAT, coloque uma unica regra para o icmp.

Exemplo:
/ip firewall nat
add action=src-nat chain=srcnat comment="NAT ICMP" protocol=icmp src-address=100.64.0.0/10 to-addresses=*X.X.X.X

*onde*X.X.X.X* ​é o seu IP publico.

De qualquer forma, acho que vou incluir essa regra no script.
Para ser adicionar 1 regra de icmp para cada bloco de IP privadodo CGNAT.

----------


## bimbo

> Antes das regras de CGNAT, coloque uma unica regra para o icmp.
> 
> Exemplo:
> /ip firewall nat
> add action=src-nat chain=srcnat comment="NAT ICMP" protocol=icmp src-address=100.64.0.0/10 to-addresses=*X.X.X.X
> 
> *onde*X.X.X.X* ​é o seu IP publico.
> 
> De qualquer forma, acho que vou incluir essa regra no script.
> Para ser adicionar 1 regra de icmp para cada bloco de IP privadodo CGNAT.


Deu certinho, se inserir no icmp vai ficar melhor ainda. Obrigado

----------


## angelino

> Deu certinho, se inserir no icmp vai ficar melhor ainda. Obrigado


Poderia me dar uma ajuda de como configurar cgnat. Whast 55 996859044

----------


## Lupus

Show de bola....  :Wink: 

Parabéns pela iniciativa... Louvável...

----------


## johnwin98

Olá Boa Noite, eu tentei executar esse tutorial aqui em minha ccr1009 e não conseguir, fiz exatamente como esta descrito no texto, tenho um nível mediando em mikrotik, tenho um ip publico que a operadora me forneceu um /29, só que não apareceu nada gostaria de ajuda obrigado

----------


## baixinho930

Voce recomenda uma quantidade de porta por cliente ? 
se no caso tenho apenas 1 ip para direcionar as portas !

Obs: para pegar os logs do cg-nat esse script ja faz ?

----------


## AndrioPJ

> Voce recomenda uma quantidade de porta por cliente ? 
> se no caso tenho apenas 1 ip para direcionar as portas !
> 
> Obs: para pegar os logs do cg-nat esse script ja faz ?


recomendo no minimo, mas minimo mesmo... 1500 portas

Como vc só tem um IP, n tem mto o que possa ser feito.

----------


## leosmendes

Opa Andrio, me tira uma dúvida. Hoje os clientes navegam ou pela 443 ou pela 80 certo, outras portas que eles precisem o roteador vai alocando aleatoriamente. Se meu raciocínio está certo, não teria como criar o cg-nat que oferecesse apenas duas portas por IP uma para http e outra para https e deixar o restante das portas dinâmico?

----------


## AndrioPJ

> Opa Andrio, me tira uma dúvida. Hoje os clientes navegam ou pela 443 ou pela 80 certo, outras portas que eles precisem o roteador vai alocando aleatoriamente. Se meu raciocínio está certo, não teria como criar o cg-nat que oferecesse apenas duas portas por IP uma para http e outra para https e deixar o restante das portas dinâmico?


para navegar ou fazer qualquer coisa na internet, existem 2 portas (ou mais) que são utilizadas na comunicação.
uma porta do lado do cliente (porta de origem) e uma porta do lado do servidor (porta de destino).
Sendo que do lado do servidor geralmente é uma porta fixa (80, 443).
Já do lado do cliente é uma porta aleatoria.

Exemplo:
Cliente porta 37689 -> tentando acessar um site na porta 80

O que o CGNAT faz é reescrever a porta de origem, alocando para cada cliente uma faixa de portas somente para ele.
Exemplo:
Cliente A pode usar as portas da 5000 a 6999
Cliente B pode usar as portas da 7000 a 8999
Cliente C pode usar as portas da 9000 a 10999

Dessa forma, mesmo que 2 ou mais clientes se comunicarem com o mesmo site, se o site registrar a porta de origem, conseguimos identificar qual o cliente que fez #[email protected]%$&*&(

----------


## leosmendes

otimo, bem pensando em casos onde so se tem um ip valido e a quantidade de portas é escassa, o que eu penso e que poderíamos "amarrar" somente as duas portas de navegação e deixar as outras portas que os clientes usam de forma dinâmica mesmo. isto não seria viável? pois tem clientes que acredito que não gastariam nem 300 conexões....

----------


## haroldofreire

Oi,
sou novo no mundo Mikrotik, executei o script mas nao tenho rota pra navegar, preciso adicionar os ips publicos em algum lugar? preciso criar alguma regra a mais? meus ips publicos disponibilizados pelo fornecedor, expl: 2.2.2.0/30 para gateway do link, 2.2.2.128/28 ips para CGNAT e clientes. Alguem sabe o que preciso adicionar ou configurar alem do script???? No mais, muito obrigado.

----------


## infopoint

> para navegar ou fazer qualquer coisa na internet, existem 2 portas (ou mais) que são utilizadas na comunicação.
> uma porta do lado do cliente (porta de origem) e uma porta do lado do servidor (porta de destino).
> Sendo que do lado do servidor geralmente é uma porta fixa (80, 443).
> Já do lado do cliente é uma porta aleatoria.
> 
> Exemplo:
> Cliente porta 37689 -> tentando acessar um site na porta 80
> 
> O que o CGNAT faz é reescrever a porta de origem, alocando para cada cliente uma faixa de portas somente para ele.
> ...


Atualmente repasso um /30 para os meus concentradores e implementei o CGNAT para atender 30 clientes com 2000 portas cada, utilizando apenas 1 ip público que recebo pelo /30.

Caso eu precise repetir a regra para um novo ip público, terei que aumentar a designação do bloco de ip fornecido para esse concentrador com um /29 (por exemplo) e ir repetindo a regra para cada ip público?

----------


## Seraph

Primeiramente muito obrigado por compartilhar a solução!
Gostei do funcionamento e do redirecionamento de portas, funciona bem legal, sem colisões.
Agora estou pensando em um jeito de diminuir a quantidade de regras, pois o NAT ficou bastante poluído. 
Testei essa tradução de um /21 privado para um /26 público, colocando 2k portas para cada host e o resultado foram 4200 regras no NAT rs

----------


## AndrioPJ

> Primeiramente muito obrigado por compartilhar a solução!
> Gostei do funcionamento e do redirecionamento de portas, funciona bem legal, sem colisões.
> Agora estou pensando em um jeito de diminuir a quantidade de regras, pois o NAT ficou bastante poluído. 
> Testei essa tradução de um /21 privado para um /26 público, colocando 2k portas para cada host e o resultado foram 4200 regras no NAT rs


essa é a parte chata,
ele cria 2 regras para cada IP, uma UDP e outra TCP.
Infelizmente não tem como escapar disso.
A menos que faça um NAT global.
exemplo:
NAT 1 IP publico para 32 IPs privados.

nesse caso, para atender um /26, seria apenas 64 regras de NAT.
o problema é que vc não teria como identificar quem desses 32 clientes cometeu o crime.

----------


## Seraph

> essa é a parte chata,
> ele cria 2 regras para cada IP, uma UDP e outra TCP.
> Infelizmente não tem como escapar disso.
> A menos que faça um NAT global.
> exemplo:
> NAT 1 IP publico para 32 IPs privados.
> 
> nesse caso, para atender um /26, seria apenas 64 regras de NAT.
> o problema é que vc não teria como identificar quem desses 32 clientes cometeu o crime.



Não é necessariamente um problema é apenas uma questão de poluição visual mesmo. Em geral o funcionamento está perfeito, pois IP fixo no Radius + as portas bem definidas pra cada IP ficou uma solução bem legal e não é preciso um log muito complexo para identificar usuários em caso de qualquer problema. Vou deixar dessa forma até ativar o IPv6!
Mais uma vez, agradeço bastante!

----------


## andrecarlim

Netmap. Mudei todos os meus cgnat em Mikrotik para cgnat com netmap, de mais de 3100 regras, reduz pra pouco mais de 250.

O cgnat do Andrio tem problema tá, não está 100%...

----------


## AndrioPJ

> Netmap. Mudei todos os meus cgnat em Mikrotik para cgnat com netmap, de mais de 3100 regras, reduz pra pouco mais de 250.
> 
> O cgnat do Andrio tem problema tá, não está 100%...


uso esse mesmo script aqui (com algumas pequenas modificações, tal como adicionar o IP publico na interface e criar o pool automaticamente)

mas diga ai, qual seria o problema?
por favor, aponte para q eu possa corrigir.

----------


## andrecarlim

De cabeça aqui não lembro, amanhã se der um tempo eu testo novamente e retorno aqui.

----------


## AndrioPJ

> De cabeça aqui não lembro, amanhã se der um tempo eu testo novamente e retorno aqui.


Opa, fico no aguardo do feedback.

----------


## andrecarlim

> Opa, fico no aguardo do feedback.


Então Andrio, rodei aqui, e deixa eu me retratar, não é um problema com o cgnat em si, mas como trata as regras, eu queria um que caso não fechasse com TCP/UDP aplicasse o NAT do restante para cada IP Publico daquele bloco privado, e também um que fosse simples de aplicar as regras... Só isso na verdade, ai escrevi um inteiro, que a gente coloca só o bloco privado, o bloco publico e a posição de inicio das regras e ele se vira fazer tudo, bem simples.

----------


## Seraph

Em geral podemos concluir que a diferença entre esse script do CGNAT e o NAT feito com NETMAP seria que nesse script redirecionamos e distribuímos conforme necessário apenas as portas TCP e UDP, enquanto no NETMAP ele redireciona qualquer protocolo, correto?

Há alguma outra diferença relevante entre o src/dst-nat e o netmap?

----------


## andrecarlim

Errado, o esquema que eu faço com cgnat tem o mesmo efeito e muito superior a qualquer outro que não use netmap, e é por range de portas e a principal diferença é, o mesmo efeito produzido pelo script do Andrio, que no fim, gera dezenas de centenas de regras, o meu fica com aproximadamente, 10% das regras, ou seja, se com o "comum" você tem 2000 regras com o meu, pouco mais de 200. E onde isso impacta mais? No processamento!

----------


## AndrioPJ

> Errado, o esquema que eu faço com cgnat tem o mesmo efeito e muito superior a qualquer outro que não use netmap, e é por range de portas e a principal diferença é, o mesmo efeito produzido pelo script do Andrio, que no fim, gera dezenas de centenas de regras, o meu fica com aproximadamente, 10% das regras, ou seja, se com o "comum" você tem 2000 regras com o meu, pouco mais de 200. E onde isso impacta mais? No processamento!


Fiquei curioso.
Esse por netmap que vc refere-se é o CGNAT Horizontal?

Exemplo:


```
add action=jump chain=CGNAT_100_64 jump-target=CGNAT_100_64_0 src-address=100.64.0.0/21
add action=netmap chain=CGNAT_100_64_0 protocol=tcp src-address=100.64.0.0/25 to-addresses=192.0.2.0/25 to-ports=5000-5499
add action=netmap chain=CGNAT_100_64_0 protocol=udp src-address=100.64.0.0/25 to-addresses=192.0.2.0/25 to-ports=5000-5499
add action=netmap chain=CGNAT_100_64_0 protocol=tcp src-address=100.64.0.128/25 to-addresses=192.0.2.0/25 to-ports=5500-5999
add action=netmap chain=CGNAT_100_64_0 protocol=udp src-address=100.64.0.128/25 to-addresses=192.0.2.0/25 to-ports=5500-5999
```

 
Se for esse... então eu Já estudei ele certa vez.
Mas não implementei ele pela dificuldade de identificação sem ter um log.

Logo, gostaria de saber como está fazendo a identificação dos clientes?
Pois diferente do CGNAT Vertical, nesse CGNAT Horizontal é o Netmap que cuida de direcionar um IP publico para um IP privado CGNAT, logo, como você saberia que o IP privado 100.64.0.10 saiu pelo 192.0.2.2 e não pelo 192.0.2.3, já que foi atribuido um bloco /25 de IP publico e o netmap pode atribuir qualquer um desses?

----------


## andrecarlim

Porque, primeiro, ele é do tipo 1:1 quando se usa blocos de mesmo tamanhos, ele não faz sorteio, e segundo não precisa nada de logs, é exatamente o mesmo funcionamento do teu script, só que com muito menos regras.

Cara, esses nomes (vertical e horizontal) é tudo invenção. É tudo CGNAT.

----------


## AndrioPJ

> *Cara, esses nomes (vertical e horizontal) é tudo invenção. É tudo CGNAT.*


né kkkkkkkkkk
O povo coloca esses nomes para diferenciar um do outro.

Enfim,
vou criar o script para esse tipo de CGNAT.
Nos próximos dias posto ele aqui.

----------


## andrecarlim

Boa sorte mano!

----------


## Seraph

> Errado, o esquema que eu faço com cgnat tem o mesmo efeito e muito superior a qualquer outro que não use netmap, e é por range de portas e a principal diferença é, o mesmo efeito produzido pelo script do Andrio, que no fim, gera dezenas de centenas de regras, o meu fica com aproximadamente, 10% das regras, ou seja, se com o "comum" você tem 2000 regras com o meu, pouco mais de 200. E onde isso impacta mais? No processamento!


Eu percebi esse impacto no processamento, estou monitorando essa parte antes de concluir qualquer coisa.

Sobre endereços:
Com um bom radius ou syslog server dá pra achar o cliente fanfarrão, mesmo se o IP público dele for alocado de maneira dinâmica!

----------


## raumaster

> Opa Andrio, me tira uma dúvida. Hoje os clientes navegam ou pela 443 ou pela 80 certo, outras portas que eles precisem o roteador vai alocando aleatoriamente. Se meu raciocínio está certo, não teria como criar o cg-nat que oferecesse apenas duas portas por IP uma para http e outra para https e deixar o restante das portas dinâmico?


Não são apenas essas portas usadas, tem porta 53 de DNS, o cliente pode querer acessar um FTP na internet pela porta 21, vários outros serviços usam portas diferentes da 80 e 443. O cliente pode te requisitar uma porta especifica pra acessar uma câmera por exemplo. O CG-NAT é bom, mas cria várias outras limitações e quem tem só um IP valido, como liberar 1000 portas pra mais de 100 clientes? Não rola... Quem usa Load Balance creio que já era com CG-NAT tb, correto? Quem precisa de liberar portas específicas por cliente...

----------


## brunovalmorbida

Boa Tarde, gostaria de uma ajuda, testei o script aqui, funcionou perfeitamente, só não estou conseguindo pingar quando estou usando um IP que esta rodando sobre a NAT, alguem poderia me ajudar?

OBS: Já tentei fazer aquela regra de ICMP que esta postada aqui no grupo.

----------


## Seraph

> Boa Tarde, gostaria de uma ajuda, testei o script aqui, funcionou perfeitamente, só não estou conseguindo pingar quando estou usando um IP que esta rodando sobre a NAT, alguem poderia me ajudar?
> 
> OBS: Já tentei fazer aquela regra de ICMP que esta postada aqui no grupo.


Colega, também tive esse problema aqui. Você precisa corrigir a rota para o ip privado, você consegue
isso através de políticas de roteamento (policy routing).

Vá em IP > Routes > Rules 
Adicione uma nova política:

Src. Address: endereço da rede que você quer pingar até o cliente
Dst. Address: 100.64.0.0/21 (A rede privada que você usa. Nesse exemplo, coloquei a rede do CGNAT que uso aqui)
Action: Lookup
Table: Main

Essa regra faz o seguinte: quando o endereço de destino for a rede do cgnat, a RB vai olhar primeiramente a tabela MAIN, que é onde está o ip e a rota para os clientes sem passar pelo nat.

Export config:

/ip route rule
add disabled=no dst-address=100.64.0.0/21 table=main


Caso você esteja usando uma faixa de IP diferente do CGNAT, você tem que fazer outra regra.
Por exemplo, suponhamos que além do CGNAT você use uma faixa privada para os hosts no seu escritório,
a regra ficaria mais ou menos assim:

/ip route rule
add disabled=no dst-address=100.64.0.0/21 src-address=192.168.0.0/24 table=main


add disabled=no dst-address=192.168.0.0/24 src-address=100.64.0.0/21 table=main


Lembre-se que o PING é uma ferramenta que manda um pacote e espera por uma resposta,
por isso temos que fazer a rota de IDA e de VOLTA.

----------


## fhayashi

> Porque, primeiro, ele é do tipo 1:1 quando se usa blocos de mesmo tamanhos, ele não faz sorteio, e segundo não precisa nada de logs, é exatamente o mesmo funcionamento do teu script, só que com muito menos regras.
> 
> Cara, esses nomes (vertical e horizontal) é tudo invenção. É tudo CGNAT.


Opa @*andrecarlim*,

vc que é o cara de linux, kkkkkkkk. Sabe dizer se o netmap do iptables tem como fixar as portas de NAT igual ao RouterOS? Estou caçando aqui mas sem sucesso.

----------


## andrecarlim

Então cara, não gastei muito tempo ainda com o netmap do Linux, mas a um tempo atrás tentei fazer isso e não funcionava igual, acho que o pessoal do Mikrotik fez incrementação no netfilter que eles usam.

----------


## fhayashi

Opa. Valeu. 

Eu estava pensando em montar um laboratório para uma caixa de cgnat aqui.

Se for fazer, vou tentar via srcnat mesmo então. 

Valeu

----------


## AndrioPJ

> Opa @*andrecarlim*,
> 
> vc que é o cara de linux, kkkkkkkk. Sabe dizer se o netmap do iptables tem como fixar as portas de NAT igual ao RouterOS? Estou caçando aqui mas sem sucesso.


Faz muito tempo que não mexo com iptables, mas acho que é mais ou menos assim:

iptables -v -t nat -A PREROUTING -p tcp -s 192.168.100.0/24 -j NETMAP --to 10.0.0.0/24:1024-3023
iptables -v -t nat -A PREROUTING -p udp -s 192.168.100.0/24 -j NETMAP --to 10.0.0.0/24:1024-3023

# translations.
192.168.100.0/24 - 10.0.0.0/24
192.168.100.1 - 10.0.0.1 sport 1024-3023
192.168.100.2 - 10.0.0.2 sport 1024-3023
192.168.100.3 - 10.0.0.3 sport 1024-3023
192.168.100.... - 10.0.0.... sport 1024-3023
192.168.100.255 - 10.0.0.255 sport 1024-3023

----------


## fhayashi

@*AndrioPJ*

blz? Já tinha tentado dessa forma mas ele reclama que o argumento não é um CIDR válido.

----------


## AndrioPJ

> @*AndrioPJ*
> 
> blz? Já tinha tentado dessa forma mas ele reclama que o argumento não é um CIDR válido.


Bem estranho.



```
NETMAP
 
This target allows you to statically map a whole network of addresses onto another network of addresses. It can only be used from rules in the nat table.
[B]--to address[/mask][/B]
Network address to map to. The resulting address will be constructed in the following way: All 'one' bits in the mask are filled in from the new 'address'. All bits that are zero in the mask are filled in from the original address.
```

 https://linux.die.net/man/8/iptables

----------


## fhayashi

é por conta das portas, ele não reconhece a rede.

----------


## mauriciodelimaMol

O problema no netmap (CGNAT horizontal) é que quando não se tem ips suficientes para fazer o balanceamento.

----------


## andrecarlim

> O problema no netmap (CGNAT horizontal) é que quando não se tem ips suficientes para fazer o balanceamento.


Nossa, esclareceu tudo! "Parabéns!"

----------


## fhayashi

Kkkkkkkk

----------


## eddgard

Bom dia, eu tenho uma sequencia de ips x.x.x.x/29 dado pela operadora e utilizo ppoe o ip central do sevidor e 10.0.3.1, e os clientes conectam 10.0.3.2, 10.0.3.3. Mas estou tendo problemas com alguns sites como netflix, psn, e de acordo com alguns relatos que vi na internet esse procedimento deve ajudar.
Gostaria de saber se posso utlizar o script e ainda continuar usando meu servidor ppoe nessa sequencia de ips 10.0.3.1

----------


## rooankesley

Bom dia AndrioPJ, teu script me ajudou muito mesmo, mas estou com um problema, acredito que pela enorme quantidade de regras geradas, estou gerando o Script pra um /23 com 4 ips por regra, com Jump e também ICMP, porém foram geradas 5600+ regras na CCR 1036 que usamos, como usamos OSPF adicionamos os IPs Publicos na interface loopback criada, porém o meu problema é que quando temos multiplas desconexões no pppoe a CCR reinicia e quando ela reinicia ela perde a "bridge" loopback ocasionando assim os IPs, deixando os clientes sem acesso, pensamos que poderia ser algo de que a CCR não estivesse aguentando PPPoE e o CGNAT simultaneamente, porém com uma CCR nova e adicionando a mesma quantidade de regras e sem PPPoE server, quando reinicio a CCR o mesmo acontece... minha pergunta é a seguinte, tem alguma luz pra resolver isso ou eu tenho mesmo que ficar alerta sempre que ela reinciar?

----------


## Fernandols

> Bom dia AndrioPJ, teu script me ajudou muito mesmo, mas estou com um problema, acredito que pela enorme quantidade de regras geradas, estou gerando o Script pra um /23 com 4 ips por regra, com Jump e também ICMP, porém foram geradas 5600+ regras na CCR 1036 que usamos, como usamos OSPF adicionamos os IPs Publicos na interface loopback criada, porém o meu problema é que quando temos multiplas desconexões no pppoe a CCR reinicia e quando ela reinicia ela perde a "bridge" loopback ocasionando assim os IPs, deixando os clientes sem acesso, pensamos que poderia ser algo de que a CCR não estivesse aguentando PPPoE e o CGNAT simultaneamente, porém com uma CCR nova e adicionando a mesma quantidade de regras e sem PPPoE server, quando reinicio a CCR o mesmo acontece... minha pergunta é a seguinte, tem alguma luz pra resolver isso ou eu tenho mesmo que ficar alerta sempre que ela reinciar?


Como assim a CCR reinicia e perde a loopback? Vc diz na aba interfaces do ospf? se for esse o caso vc tem que adicionar ela "na mao" e nao esqueça de marcar a opçao passive.

----------


## avatar52

Alguém me dá uma explicação plausível do por que de colocar IP numa interface pra fazer CGNAT?

----------


## George

> Então Andrio, rodei aqui, e deixa eu me retratar, não é um problema com o cgnat em si, mas como trata as regras, eu queria um que caso não fechasse com TCP/UDP aplicasse o NAT do restante para cada IP Publico daquele bloco privado, e também um que fosse simples de aplicar as regras... Só isso na verdade, ai escrevi um inteiro, que a gente coloca só o bloco privado, o bloco publico e a posição de inicio das regras e ele se vira fazer tudo, bem simples.


Prezado, poderia disponibilizar o teu script?

----------


## AndrioPJ

> Bom dia AndrioPJ, teu script me ajudou muito mesmo, mas estou com um problema, acredito que pela enorme quantidade de regras geradas, estou gerando o Script pra um /23 com 4 ips por regra, com Jump e também ICMP, porém foram geradas 5600+ regras na CCR 1036 que usamos, como usamos OSPF adicionamos os IPs Publicos na interface loopback criada, porém o meu problema é que quando temos multiplas desconexões no pppoe a CCR reinicia e quando ela reinicia ela perde a "bridge" loopback ocasionando assim os IPs, deixando os clientes sem acesso, pensamos que poderia ser algo de que a CCR não estivesse aguentando PPPoE e o CGNAT simultaneamente, porém com uma CCR nova e adicionando a mesma quantidade de regras e sem PPPoE server, quando reinicio a CCR o mesmo acontece... minha pergunta é a seguinte, tem alguma luz pra resolver isso ou eu tenho mesmo que ficar alerta sempre que ela reinciar?


Descentralizar, usar varios concentradores
ou uma maquina melhor só para NAT

----------


## AndrioPJ

> Alguém me dá uma explicação plausível do por que de colocar IP numa interface pra fazer CGNAT?


Se você não tem IP publico suficiente para entregar para todos os clientes, logo precisa fazer CGNAT para poder ter a guarda de log dos clientes

----------


## avatar52

> Se você não tem IP publico suficiente para entregar para todos os clientes, logo precisa fazer CGNAT para poder ter a guarda de log dos clientes


Você não respondeu minha pergunta, releia e pense novamente.

Pra que adicionar o IP numa loopback????????

----------


## AndrioPJ

> Você não respondeu minha pergunta, releia e pense novamente.
> 
> Pra que adicionar o IP numa loopback????????


O IP Publico tem que ser adicionado em algum lugar, tem que ter rota para esse IP publico.
Caso contrario, você não consegue fazer os clientes sairem por aquele IP.

Você pode adicionar o IP na interface de saida ou mesmo numa interface virtual.
Como existem administradores que alteram o nome da interface de saida ou mesmo usam em portas diferentes.... afim de evitar que o script gerasse conflito, eu escrevi o script para que o mesmo adicionasse o IP publico em uma interface virtual, pois assim pode-se usar qualquer interface de saida que o IP publico vai funcionar

----------


## Black

boa tarde, como saber por qual ip publico e porta o cliente pppoe esta usando atraves de um cgnat?grato

----------


## avatar52

> O IP Publico tem que ser adicionado em algum lugar, tem que ter rota para esse IP publico.
> Caso contrario, você não consegue fazer os clientes sairem por aquele IP.
> 
> Você pode adicionar o IP na interface de saida ou mesmo numa interface virtual.
> Como existem administradores que alteram o nome da interface de saida ou mesmo usam em portas diferentes.... afim de evitar que o script gerasse conflito, eu escrevi o script para que o mesmo adicionasse o IP publico em uma interface virtual, pois assim pode-se usar qualquer interface de saida que o IP publico vai funcionar


Se você tem rota, não precisa adicionar na interface. Pode até ser uma blackhole. Se quiser ver funcionando ao vivo e em cores, eu te mostro.

----------


## Black

na verdade tenho 5 dias tentando criar um cgnat com um /29 e não estou conseguindo principalmente como configurar esse /29 na interface.
pode me ajudar nesta questão?

----------


## alexbarzotto

Boa tarde senhores, 
Rodei aqui, porém não está resolvendo o reverso e não estou conseguindo encontrar o erro, se retiro o cgnat e faço um masquerade resolve corretamente.
Alguma dica ?

----------


## ory0n

> Se você tem rota, não precisa adicionar na interface. Pode até ser uma blackhole. Se quiser ver funcionando ao vivo e em cores, eu te mostro.


No caso acho que o AndrioPJ disse que tem a rota gerada pela inclusão do ip na interface, ip da rede diretamente conectada, que seria anunciada para outro roteadores. 

Mas só pra saber se eu entendi a questão de não colocar o ip, apenas a rota.

Para que os pacote saibam voltar você só adiciona a rota no concentrador e anuncia?

Na volta do pacote para o concentrador, o concentrador recebe o pacote com destino ao ip publico que não esta no roteador e antes de ser descartado o NAT destroca o destino para o ip privado original e encaminha para o ip privado do cliente? 

é isso?

----------


## fhayashi

Alguém fazendo CGNAT com freebsd?

----------


## brunosamuel

> Pessoal,
> 
> No Site da Mikrotik existe um script para criação das Regras de CGNAT.
> Acontece que ao utilizar esse script, se colocamos para criar as regras para 64 IPs, ele cria uma regra a mais. Se colocamos para 32 IPs, ele cria regra a menos.
> 
> Como não achei algum outro script funcional, acabei criando o meu próprio, Baseado no que tem disponível no wiki da Mikrotik e em algumas dicas nos fóruns.
> 
> Segue abaixo Script para criação das Regras de CGNAT.
> 
> ...


Boa noite. No meu caso. Meus clientes estão assim cada plano criei um pool /24 tenho 5 plano. Quando algum /24 esgota crio outro bloco/24. Tenho um bloco ip publico /29. Como ficaria?

----------


## inquiery

Boa noite pessoal,

Recentemente precisei configurar um CGNAT e, apesar de que o script no MK resolve bastante coisa, o caso que eu queria resolver precisava de uma quantidade meio grande de regras. Baseado nos scripts que achei pela internet, inclusive esse do @*AndrioPJ* (alias, obrigado Andrio), eu criei o meu script para criar as regras da forma que eu queria.

No entanto, desenvolver algo mais complexo no script do MK é difícil, e além disso demora muito tempo para executar. Meu script, gerando 43.000+ regras, demorou quase 20 minutos.

Eu desenvolvi, então, um programinha em FreePascal para gerar script com as regras, para importar diretamente no MK.

Quem quiser usar, está no Github: https://github.com/inquiery/mkcgnat



1: Endereço de IP privado inicial
2: Endereço de IP privado final
(endereços normalmente da rede 100.64.0.0/10)
3: A quantidade de endereços de IP privados que será traduzido para cada endereço de IP público.
4: Define um range de endereços de IP público para adicionar a lista de ranges a ser utilizado. Deve clicar em Adicionar após digitar. Somente os endereços adicionados na lista serão utilizados, se somente digitar no campo e não adicionar, o range não será utiliado.
5: Lista de ranges de endereços públicos que serão utilizados.
6: Basta clicar em Gerar depois de configurar para gerar o script.
7: Salva em um arquivo .rsc para fazer upload para a Routerboard e importar com o comando import Exemplo:


```
import file=cgnat.rsc
```

 
Tenha em mente que, a soma de endereços nos ranges de IPs públicos deve ter no mínimo a quantidade de endereços informada no campo "IPs públicos necessários".

No Github está o código fonte, e na pasta release uma versão já compilada para quem não quer baixar o Lazarus e compilar.

----------


## rafaelmendes

aqui nao sei que fiz de errado nao criou as regra so cria uma

----------


## inquiery

Usando o script ou o programinha?
De mais detalhes que a gente pode tentar ajudar.

----------


## info24hs

> Usando o script ou o programinha?
> De mais detalhes que a gente pode tentar ajudar.



olá, peço ajuda de vcs,

minha dúvida é a seguinte:

eu recebo ex um /29 com o ip final do .42 a .46 para ser usado no cgnat vertical usando script

crio o script usando entao do .42 ao .46 gateway .41 e rede .40

agora o que preciso fazer no /ip address do mikrotik que recebe o link na ether1?

coloca a regra dizendo que o ip 42 é referente a ether1, o ip 43 ref. ether1 e assim com os demais?

não colocar regra nenhuma e somente o gateway apontando a rota padrao?

ou somente criar loopback com cada ip publico?


agradeço desde já

----------


## Bruno

> olá, peço ajuda de vcs,
> 
> minha dúvida é a seguinte:
> 
> eu recebo ex um /29 com o ip final do .42 a .46 para ser usado no cgnat vertical usando script
> 
> crio o script usando entao do .42 ao .46 gateway .41 e rede .40
> 
> agora o que preciso fazer no /ip address do mikrotik que recebe o link na ether1?
> ...


cria os ips 43 até 46 na backhole

----------


## info24hs

> cria os ips 43 até 46 na backhole


e faz oque com o ip 42 ?

e o ip address nao cria nada?

----------


## Bruno

> e faz oque com o ip 42 ?
> 
> e o ip address nao cria nada?


como te falei pelo que entendi o seu provedor lhe fornece somente /29 para sua wan certo 

então o 41. é o seu gateway 42 fica na usa interface 
e o resto joga na blackhole

----------


## info24hs

> como te falei pelo que entendi o seu provedor lhe fornece somente /29 para sua wan certo 
> 
> então o 41. é o seu gateway 42 fica na usa interface 
> e o resto joga na blackhole


entao amigo como ficaria essa regra no /ip route como ficaria a forma certa para criar a blackhole?

----------


## info24hs

> como te falei pelo que entendi o seu provedor lhe fornece somente /29 para sua wan certo 
> 
> então o 41. é o seu gateway 42 fica na usa interface 
> e o resto joga na blackhole


devo criar as loopback para cada ip também?

----------


## Bruno

> entao amigo como ficaria essa regra no /ip route como ficaria a forma certa para criar a blackhole?


procura na wiki do mikrotik a tem

----------


## severino2

> Pessoal,
> 
> No Site da Mikrotik existe um script para criação das Regras de CGNAT.
> Acontece que ao utilizar esse script, se colocamos para criar as regras para 64 IPs, ele cria uma regra a mais. Se colocamos para 32 IPs, ele cria regra a menos.
> 
> Como não achei algum outro script funcional, acabei criando o meu próprio, Baseado no que tem disponível no wiki da Mikrotik e em algumas dicas nos fóruns.
> 
> Segue abaixo Script para criação das Regras de CGNAT.
> 
> ...



Como eu colocaria essa regra em pratica no caso que eu queira um bloco de ip privado 100.64.0.0/20 ou eu queira por /21 ou /22, ( qual o intuito disso, deixa o mikrotik mais enxuto de regras do CGNat ) no caso eu tenho um bloco de ip publico /28 ou /29 e usar 1 ip publico por range e atribuindo 400 portas por cada Range de ips internos privados, que se possível coloca para começa em vez de .0 e .1 começa-se de .2 até 164 !!??

Exemplo: 

2.2.2.2 >> 100.64.0.2-100.64.0.164

2.2.2.3 >> 100.64.1.2-100.64.1.164

----------


## gbovelar

> Boa noite pessoal,
> 
> Recentemente precisei configurar um CGNAT e, apesar de que o script no MK resolve bastante coisa, o caso que eu queria resolver precisava de uma quantidade meio grande de regras. Baseado nos scripts que achei pela internet, inclusive esse do @*AndrioPJ* (alias, obrigado Andrio), eu criei o meu script para criar as regras da forma que eu queria.
> 
> No entanto, desenvolver algo mais complexo no script do MK é difícil, e além disso demora muito tempo para executar. Meu script, gerando 43.000+ regras, demorou quase 20 minutos.
> 
> Eu desenvolvi, então, um programinha em FreePascal para gerar script com as regras, para importar diretamente no MK.
> 
> Quem quiser usar, está no Github: https://github.com/inquiery/mkcgnat
> ...


Neste seu programa seria possivel adicionar 64:1, para quem tenho poucos ip's públicos, gerar um número maior de endereços privados

----------


## inquiery

> Neste seu programa seria possivel adicionar 64:1, para quem tenho poucos ip's públicos, gerar um número maior de endereços privados


Bom dia @*gbovelar*

Adicionei a opção 64:1, e fiz algumas correções.
Inclusive adicionei uma opção de "Mark" nos Ranges públicos, com a possibilidade de adicionar várias marks separadas por ";". Essas Marks criarão regras de roteamento (/ip route rule) para cada bloco com lookup em uma tabela de roteamento com o nome especificado; assim você pode obrigar um range a sair SEMPRE pela mesma rota ou grupo de rotas, ou dar preferência para uma rota ou grupo de rotas sobre outra, bastando para isso adicionar mais de uma Mark no Range.

----------


## filipirocha

> Como eu colocaria essa regra em pratica no caso que eu queira um bloco de ip privado 100.64.0.0/20 ou eu queira por /21 ou /22, ( qual o intuito disso, deixa o mikrotik mais enxuto de regras do CGNat ) no caso eu tenho um bloco de ip publico /28 ou /29 e usar 1 ip publico por range e atribuindo 400 portas por cada Range de ips internos privados, que se possível coloca para começa em vez de .0 e .1 começa-se de .2 até 164 !!??
> 
> Exemplo: 
> 
> 2.2.2.2 >> 100.64.0.2-100.64.0.164
> 
> 2.2.2.3 >> 100.64.1.2-100.64.1.164


Olá, 400 portas por IP privado é muito pouco, terá problema com jogos, o League of Legends por exemplo utiliza +/- 2000 portas, por boas praticas é recomendável no minimo 2000 portas.

----------


## info24hs

> Neste seu programa seria possivel adicionar 64:1, para quem tenho poucos ip's públicos, gerar um número maior de endereços privados


Amigo poderia colocar no seu programa a opção 128:1 acredite é necessário kkk

----------


## info24hs

> Bom dia @*gbovelar*
> 
> Adicionei a opção 64:1, e fiz algumas correções.
> Inclusive adicionei uma opção de "Mark" nos Ranges públicos, com a possibilidade de adicionar várias marks separadas por ";". Essas Marks criarão regras de roteamento (/ip route rule) para cada bloco com lookup em uma tabela de roteamento com o nome especificado; assim você pode obrigar um range a sair SEMPRE pela mesma rota ou grupo de rotas, ou dar preferência para uma rota ou grupo de rotas sobre outra, bastando para isso adicionar mais de uma Mark no Range.


Amigo poderia colocar no seu programa a opção 128:1 acredite é necessário kkk

----------


## brunosamuel

> Deu certinho, se inserir no icmp vai ficar melhor ainda. Obrigado


Bom dia. como vc fez? fiz como ele disse não deu certo. teria como vc me mostrar?

----------


## inquiery

> Amigo poderia colocar no seu programa a opção 128:1 acredite é necessário kkk


Adicionei essa opção, está lá no repositório.

Esse programa desenvolvi para satisfazer uma solução pontual que eu tinha, fiz outro para criar regras "netmap", o que faz com que se reduza bastante a quantidade de regras necessárias. Vou postar também este, porém ainda não testei. Desenvolvi para utilizar no novo roteador CGNAT que vamos colocar aqui.

Segue o repositório: https://github.com/inquiery/mkcgnat_netmap

Uma breve explicação abaixo.

1:
Você pode criar vários perfis de conjunto de regras e deixar gravado com um nome específico. Por exemplo, um perfil para cada roteador que faz CGNAT, com endereços diferentes.
Basta digitar um nome qualquer, e clicar no botão com o ícone de um disco. No botão X você exclui o perfil selecionado.

2:
Aqui você edita as informações da regra que quer adicionar ou alterar.
- Endereço Privado: O endereço de rede do bloco CGNAT a ser usado na regra. A quantidade de blocos usada vai depender do campo Divisão.
- Endereço Público: O endereço de rede do bloco público a ser utilizado.
- Prefixo: O tamanho do bloco a ser utilizado paa a tradução. Os endereços privados e públicos serão recalculados se o endereço de rede informado nos campos "Endereço Privado" e "Endereço Público" estiverem incorretos.
- Divisão: A quantidade de endereços privados em cada endereço público. Será utilizado uma quantidade de blocos dos endereços privados igual o valor do campo "Divisão". Se "Divisão" for 32, serão utilizados 32 blocos de endereços privados para o bloco de endereço público, iniciando pelo endereço indicado no campo "Endereço Privado".

3:
Lista das regras adicionadas. Pode-se adicionar várias regras para cumprir o resultado desejado. Cada item adicionado, porém, resultará num novo conjunto de regras netmap.

4:
Apresenta um sumário da regra selecionada, indicando o primeiro e o último endereço privado e público que será utilizado por essa regra. Facilita na confecção do conjunto de regras caso se vá utilizar mais de uma.

5:
Clicando no botão "Gerar", será gerado o script com o conjunto de regras para importar na routerboard.
O botão "Resumo", se baseia no número a sua esquerda - que é um prefixo de rede - e gera um resumo dos blocos de endereços privados utilizados dentro de cada bloco de endereço público, e cria um sumário resumindo os blocos de rede privada em blocos menos até o prefixo indicado no campo ao lado do botão.

6:
A caixa "Calcular Netmaps" serve para facilitar a tarefa de verificação de tradução de endereços.
Você pode indicar um endereço privado qualquer, que esteja dentro das regras, e ele calculará qual o endereço público aquele endereço privado utilizará.
Também pode-se indicar um endereço público, que esteja dentro das regras, e um número de porta, e será calculado qual o endereço privado que utiliza aquele IP público com a porta específica indicada.

7:
Salva um arquivo de script para importar na routerboard.

----------


## awswallace

> Adicionei essa opção, está lá no repositório.
> 
> Esse programa desenvolvi para satisfazer uma solução pontual que eu tinha, fiz outro para criar regras "netmap", o que faz com que se reduza bastante a quantidade de regras necessárias. Vou postar também este, porém ainda não testei. Desenvolvi para utilizar no novo roteador CGNAT que vamos colocar aqui.
> 
> Segue o repositório: https://github.com/inquiery/mkcgnat_netmap
> 
> Uma breve explicação abaixo.
> Anexo 69736
> 1:
> ...








Amigo caso aconteça um crime cibernético, como irei localizar o cliente, já que esse programa defini as portas por bloco de IP

----------


## inquiery

> Amigo caso aconteça um crime cibernético, como irei localizar o cliente, já que esse programa defini as portas por bloco de IP


Boa noite

Para isso coloquei aquela box lá na direita em cima, "Calcular Netmaps". Se você precisar identificar o cliente, você digita o IP público externo e a porta de origem da conexão, e clica em "Calc", e o programa vai calcular o IP privado que utiliza aquele IP público na porta que vc informou.

Por exemplo, você recebe um e-mail do CERT informando que alguém ta com um malware (comum receber esses e-mails), e o e-mail do CERT ele vai te informar a data e hora, o IP público de origem/destino e a porta de origem/destino.

algo assim:


```
======================================================================
Formato: "asn","ip","timestamp","malware","src_port","dst_ip","dst_port","dst_host","proto"
 
"626262","4.100.200.6","2019-07-25 00:12:07","necurs","2724","181.182.183.184","80","","tcp"
"626262","4.100.200.6","2019-07-28 21:25:14","necurs","2754","181.182.183.184","80","","tcp"
======================================================================
```

 
Você vai colocar ali no programa, na caixa de "Calcular Netmaps", no campo "Público", o IP de origem, que é neste caso 4.100.200.6 e a porta de origem, que neste caso foram as 2724 e 2754 (digite uma porta por vez, pois cada linha é um registro de conexão que tem que ser pesquisado individualmente), e clica em Calc. Logo abaixo, vai aparecer um resumo que vai informar qual o IP privado que utiliza aquele IP público naquela porta de origem.

Com a informação do IP privado e a data e hora da conexão, vc vai pesquisar no seus logs de conexão qual estava utilizando aquele IP privado naquele momento.

----------


## info24hs

> Adicionei essa opção, está lá no repositório.
> 
> Esse programa desenvolvi para satisfazer uma solução pontual que eu tinha, fiz outro para criar regras "netmap", o que faz com que se reduza bastante a quantidade de regras necessárias. Vou postar também este, porém ainda não testei. Desenvolvi para utilizar no novo roteador CGNAT que vamos colocar aqui.
> 
> Segue o repositório: https://github.com/inquiery/mkcgnat_netmap
> 
> Uma breve explicação abaixo.
> Anexo 69736
> 1:
> ...



muito obrigado

----------


## edward

Ainda nai entendi... fiz essa calculadora abaxio. alguem pode me ajudar?? nao funcionaram.

----------


## viniciusmoll

> Boa noite
> 
> Para isso coloquei aquela box lá na direita em cima, "Calcular Netmaps". Se você precisar identificar o cliente, você digita o IP público externo e a porta de origem da conexão, e clica em "Calc", e o programa vai calcular o IP privado que utiliza aquele IP público na porta que vc informou.
> 
> Por exemplo, você recebe um e-mail do CERT informando que alguém ta com um malware (comum receber esses e-mails), e o e-mail do CERT ele vai te informar a data e hora, o IP público de origem/destino e a porta de origem/destino.
> 
> algo assim:
> 
> 
> ...



Boa tarde.

Como funciona a lógica deste cálculo?

É algo como: Os primeiro ipv4 privado, para as primeiras portas dos primeiro ipv4 público?

----------


## inquiery

> Boa tarde.
> 
> Como funciona a lógica deste cálculo?
> 
> É algo como: Os primeiro ipv4 privado, para as primeiras portas dos primeiro ipv4 público?


Bom dia,

A lógica é a do netmap mesmo, considerando que ele vai fazer isso em um range de portas.
Por exemplo, pegamos varios IPs privados, e traduzimos sempre no mesmo IP público, mas em ranges de portas diferentes.

100.64.0.0/24 traduzido para xxx.yyy.zzz.0/24

Neste caso, são 256 endereços privados, traduzidos nos respectivos endereços de rede no bloco público, de forma "binária", ou seja:
100.64.0.0 = xxx.yyy.zzz.0
100.64.0.1 = xxx.yyy.zzz.1
100.64.0.2 = xxx.yyy.zzz.2
100.64.0.3 = xxx.yyy.zzz.3
e assim por diante.

Claro que essa é uma forma facil de vizualizar, mas por exemplo:

100.64.0.128/25 traduzido para xxx.yyy.zzz.0/25. É a mesma coisa, o primeiro endereço da rede 100.64.0.128/25 será traduzido para o primeiro endereço da rede xxx.yyy.zzz.0/25, o segundo endereço de 100.64.0.128/25 para o segundo de xxx.yyy.zzz.0/25, e assim por diante:

100.64.0.128 = xxx.yyy.zzz.0
100.64.0.129 = xxx.yyy.zzz.1
100.64.0.130 = xxx.yyy.zzz.2
100.64.0.131 = xxx.yyy.zzz.3
e assim por diante.

Então, em resumo, o primeiro endereço da rede de origem é traduzido para o primeiro endereço da rede de destino (o to-address), o segundo endereço da rede de origem, para o segundo endereço da rede de destino.

No final das contas, é ainda um pouco mais complicado que isso, porque na realidade o netmap traduz um "conjunto de ip" para outro, e esse conjunto de IP pode ser um range, por exemplo 100.64.0.20-100.64.0.147, que no caso são 128 endereços, e você poderia usar netmap para traduzir esse range para um bloco /25, no nat 1:1 do netmap (primeiro da origem no primeiro do destino, segundo da origem no segundo do destino, etc).


Então, utilizando esse esquema, você traduz uma lista de redes privadas, para uma única rede pública. Só que, somente desta forma, você não teria como identificar o usuário do IP público num log de acesso, consultando seu log de conexão (como exige a legislação), pois se você decidiu traduzir, por exemplo, 32 redes privadas, para uma rede pública, ao tentar identificar um usuário de um log de acesso qualquer, consultando o seu log de conexão, você teria 32 possíveis usuários. Para poder fazer essa consulta de forma específica, você então traduz a porta de origem de cada um dos blocos de origem, para um range novo e diferente para cada bloco. Assim, no log de acesso você terá a informação da porta de origem da conexão, como no exemplo dos logs do CERT que ele envia por e-mail. E a porta de origem, vai estar então restrita dentro de um bloco específico de rede private, dentro do qual você pode buscar o usuário específico daquele acesso.

Por exemplo:

100.64.0.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 2001-7000
100.64.1.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 7001-12000
100.64.2.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 12001-17000
100.64.3.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 17001-22000
100.64.4.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 22001-27000
100.64.5.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 27001-32000
100.64.6.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 32001-37000
100.64.7.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 37001-42000
100.64.8.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 42001-47000
100.64.9.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 47001-52000
100.64.10.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 52001-57000
100.64.11.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 57001-62000

Neste caso, você está traduzindo além do endereço de origem, a porta de origem também, porém. Como pode observar, cada grupo de endereço privado, vai ter a porta de origem traduzida em um range de 5000 portas, e o range é diferente para cada rede privada, mas todas vão ter o endereço de IP traduzido para o mesmo IP público. Por exemplo:

100.64.0.1 = xxx.yyy.0.1
100.64.1.1 = xxx.yyy.0.1
100.64.2.1 = xxx.yyy.0.1
e assim por diante.

Ou seja, cada um daqueles blocos privados /24 vai ser traduzido para o mesmo bloco público /24, o que vai fazer que (neste exemplo) 12 clientes (um de cada rede privada) utilize o mesmo endereço público, porém, em um range de portas diferente.
E, considerando que você liberou 5000 portas neste caso, para cada range, isso quer dizer que o usuário vai ter 5000 conexões simultâneas disponíveis, o que é o suficiente para um usuário residencial.

No final das contas, esse exemplo utilizei 5000 portas por usuário, você pode utilizar 2000 por exemplo, para economizar endereços públicos. Com 2000 portas por usuário, da para colocar 32 usuários por IP público. Com 1000 portas, você pode colocar até 64 usuários por IP público. Esse calculo do range de portas o programinha vai fazer sozinho, baseado na Divisão que você escolher.

O calculo é esse, depois que a gene consegue dar a volta ao redor dele, não parece tão complexo.

----------


## leviferreira

> Bom dia,
> 
> A lógica é a do netmap mesmo, considerando que ele vai fazer isso em um range de portas.
> Por exemplo, pegamos varios IPs privados, e traduzimos sempre no mesmo IP público, mas em ranges de portas diferentes.
> 
> 100.64.0.0/24 traduzido para xxx.yyy.zzz.0/24
> 
> Neste caso, são 256 endereços privados, traduzidos nos respectivos endereços de rede no bloco público, de forma "binária", ou seja:
> 100.64.0.0 = xxx.yyy.zzz.0
> ...



*Amigo primeiramente parabéns pelo tópico, me diz uma coisa, consegue colocar no aplicado opção de colocar nome da interface, assim podemos setar a interface de saida, fazendo com que o nat fique apenas pra rede externa.
Se possivel inclui nos 2 aplicativos.*

----------


## amaurybrito

Amigos meu cenário é o seguinte eu tenho 3 Link do mesmo provedor que compro Link e faço um load balance:

LINK 1: IP FIXO (PUBLICO)
LINK 2: IP REDE
LINK 3: IP REDE

SEGUE ABAIXO IMAGEM ANEXA.
O modo de autenticação é PPPOE, só tenho uma RB3011, que é onde chega link e autentica clientes e nela que faço balance tbm.



Nesse caso como eu deveria, proceder para fazer meu CGNAT

----------


## inquiery

> *Amigo primeiramente parabéns pelo tópico, me diz uma coisa, consegue colocar no aplicado opção de colocar nome da interface, assim podemos setar a interface de saida, fazendo com que o nat fique apenas pra rede externa.
> Se possivel inclui nos 2 aplicativos.*


Boa tarde,

Adicionei essas opções. Obrigado.

----------


## inquiery

> Amigos meu cenário é o seguinte eu tenho 3 Link do mesmo provedor que compro Link e faço um load balance:
> 
> 
> LINK 1: IP FIXO
> LINK 2: IP PRIVADO
> LINK 3: IP PRIVADO
> 
> 
> Nesse caso como eu deveria, proceder para fazer meu CGNAT



Se você não tem AS, e vai usar blocos de IPs fornecidos pelos operadoras/provedores que te fornecem o link, você vai precisar fazer de uma forma m pouco mais complexa mesmo, com marcações em cada link para entrar num conjunto de regras de CGNAT somente para aquele link.

Neste caso, não seria mais interessante você contratar um suporte se você não consegue fazer?

----------


## amaurybrito

sim creio que terei que contratar suporte atualizei o post coloquei uma img

----------


## ajack

Olá pessoal,

Ja usei o script desse post com sucesso (aproveito para parabenizar os amigos que contribuíram com o código).

Usei fazendo PPPoE+CGNAT na mesma RB.
E se for usar RBs separadas? Uma para PPPoE e outra pra CGNAT?

Funciona também? ou seja, ligo as duas via OSPF e na segunda RB depois do PPPoE subo as regras de CGNAT ?

----------


## brunocemeru

Como adicionar esta regra para adicionar um /20(4096 ips) privados para /25(128 ips) público?
Preciso adicionar regra por regra manualmente ou tem como a por de uma única vez ?

----------


## inquiery

> Olá pessoal,
> 
> 
> Ja usei o script desse post com sucesso (aproveito para parabenizar os amigos que contribuíram com o código).
> 
> 
> Usei fazendo PPPoE+CGNAT na mesma RB.
> E se for usar RBs separadas? Uma para PPPoE e outra pra CGNAT?
> 
> ...



Não precisa nem usar OSPF neste caso, a não ser que você tenha uma rede muito grande que precise. O mais fácil seria só configurar uma rota padrão na RB PPPoE usando a RB CGNAT como gateway (cria uma rede /30 entre as duas para esse fim).

No pool que você usar para o PPPoE, cria uma rota na RB CGNAT para a RB PPPoE.

----------


## inquiery

> Como adicionar esta regra para adicionar um /20(4096 ips) privados para /25(128 ips) público?
> Preciso adicionar regra por regra manualmente ou tem como a por de uma única vez ?


Usando o programinha de CGNAT netmap, você poderia considerar 16 blocos /24. Por exemplo, digamos que seu bloco é 200.100.0.0/20, neste caso você tem os seguintes blocos /24 dentro desse /20:

200.100.0.0/24
200.100.1.0/24
200.100.2.0/24
200.100.3.0/24
200.100.4.0/24
200.100.5.0/24
200.100.6.0/24
200.100.7.0/24
200.100.8.0/24
200.100.9.0/24
200.100.10.0/24
200.100.11.0/24
200.100.12.0/24
200.100.13.0/24
200.100.14.0/24
200.100.15.0/24

Então você adicionaria 16 regras no programa. Se por exemplo, você escolher uma divisão de 1:32 (o que da 2015 portas por regra), cada bloco /24 de IP públicos serão direcionados a 32 blocos /24 de IPs privados, ficando assim:

200.100.0.0/24 -> 100.64.0.0 (vai usar 100.64.0.0 até 100.64.31.255)
200.100.1.0/24 -> 100.64.32.0 (vai usar 100.64.32.0 até 100.64.63.255)
200.100.2.0/24 -> 100.64.64.0 (vai usar 100.64.64.0 até 100.64.95.255)
200.100.3.0/24 -> 100.64.96.0 (vai usar 100.64.96.0 até 100.64.127.255)
200.100.4.0/24 -> 100.64.128.0 (vai usar 100.64.128.0 até 100.64.159.255)
200.100.5.0/24 -> 100.64.160.0 (vai usar 100.64.160.0 até 100.64.191.255)
200.100.6.0/24 -> 100.64.192.0 (vai usar 100.64.192.0 até 100.64.223.255)
200.100.7.0/24 -> 100.64.224.0 (vai usar 100.64.224.0 até 100.64.255.255)
200.100.8.0/24 -> 100.65.0.0 (vai usar 100.65.0.0 até 100.65.31.255)
200.100.9.0/24 -> 100.65.32.0 (vai usar 100.65.32.0 até 100.65.63.255)
200.100.10.0/24 -> 100.65.64.0 (vai usar 100.65.64.0 até 100.65.95.255)
200.100.11.0/24 -> 100.65.96.0 (vai usar 100.65.96.0 até 100.65.127.255)
200.100.12.0/24 -> 100.65.128.0 (vai usar 100.65.128.0 até 100.65.159.255)
200.100.13.0/24 -> 100.65.160.0 (vai usar 100.65.160.0 até 100.65.191.255)
200.100.14.0/24 -> 100.65.192.0 (vai usar 100.65.192.0 até 100.65.223.255)
200.100.15.0/24 -> 100.65.224.0 (vai usar 100.65.224.0 até 100.65.255.255)


Depois, só clicar para gerar as regras, e aplicar pelo terminal na RB CGNAT.


Você pode também adicionar só 1 item, com o bloco /20 inteiro

200.100.0.0/20 -> 100.64.0.0 (vai usar 100.64.0.0 até 100.64.255.255).



Neste caso, você terá menos regras, porém vale a pena comparar o desempenho (o uso de CPU) dos dois casos, pois não sei a diferença de performance do netmap quando utiliza blocos menores e maiores.

----------


## brunocemeru

Fico grato pela resposta.
Eu não consegui usar o programa.
É não quis insistir porque imagino que as regras em netmap não atendam minha necessidade caso receba uma futura notificação e tente localizar um possível cliente infrator.
Talvez possa está entendendo errado,mas queria usar a regra do script ,essa sei que atende.

----------


## inquiery

> Fico grato pela resposta.
> Eu não consegui usar o programa.
> É não quis insistir porque imagino que as regras em netmap não atendam minha necessidade caso receba uma futura notificação e tente localizar um possível cliente infrator.
> Talvez possa está entendendo errado,mas queria usar a regra do script ,essa sei que atende.


Ah sim. Mas o netmap atende sim, para isso serve aquele campo lá em cima de "Calcular netmap". Inclusive aumenta o desempenho de modo geral comparado com o modelo de src-nat.

Vou dar uma olhada no script depois pra ver como usar com os parametros que vc quer.

----------


## brunocemeru

Obrigado pela ajuda amigo.
Apliquei as configurações em um mk de teste e pude ver como funciona.
Consegui entender a lógica.

----------


## vmm

Estou precisando ajuda para usar cgnat em minha rede porem tentando o script eo programa sem sucesso venho pedir aos amigos que posam me ajudar a colocar para funcionar minha rede em cgnat meu cenario eo seguinte
tenho o ip dos clientes 100.64.0.0/24
tenho o mkauth com ip 72.31.255.2
tenho uma rede interna em minha casa e escritorio 170.0.0.0/24
e um bloco de ip xxx.xxx.xxx.50/28 gw xxx.xxx.xxx.49
como ficaria essa rede desculpem minha iguinorancia mais pfv to quabrando a cabeça aqui tanto no script como no programa e nada desde ja agradeço aos amigos.

----------


## adilsoncamargo

> Pessoal,
> 
> No Site da Mikrotik existe um script para criação das Regras de CGNAT.
> Acontece que ao utilizar esse script, se colocamos para criar as regras para 64 IPs, ele cria uma regra a mais. Se colocamos para 32 IPs, ele cria regra a menos.
> 
> Como não achei algum outro script funcional, acabei criando o meu próprio, Baseado no que tem disponível no wiki da Mikrotik e em algumas dicas nos fóruns.
> 
> Segue abaixo Script para criação das Regras de CGNAT.
> 
> ...


Estou tentando aplica em um bloco de ip/29 mas não estou conseguindo estou seguindo como estar no script vou mostrar as alteração que diz no script onde pode estar errado? 

:global addNatRules do={
:global srcStart [ :Stick Out Tongue: ick $NetworkIP 0 [:find $NetworkIP "128.201.97.216/29"]]
:global srcStart2 $srcStart
:global QtdRegras 30
:global QtdRegras2 30
:global portStop ($portStart + $portsPerAddr - 4000)
/ip firewall nat add chain=srcnat action=jump jump-target=$NewChain comment="Inicio CGNAT - By Andriopj" src-address="$NetworkIP"
:log info "O Network é $NetworkIP";
:log info "Iniciando em $srcStart";
 :Stick Out Tongue: ut "Current IP: $srcStart\r\nTarget: $NetworkIP\r\n"
:while ($srcStart in $NetworkIP) do={
:log info "IP atual é $srcStart";
/ip firewall nat add chain=$NewChain action=jump jump-target="$NewChain-$($QtdRegras)" src-address="$srcStart-$($srcStart + ($IPsPerRule - 8 ))"
:set QtdRegras ($QtdRegras + 1);
:set srcStart ($srcStart + $IPsPerRule);
}
:log info "64000: $QtdRegras";
:while ($srcStart2 in $NetworkIP) do={
:for i from=1 to=$IPsPerRule do={
/ip firewall nat add chain="$NewChain-$QtdRegras2" action=src-nat comment="CGNAT IP $srcStart2 Porta $portStart - $portStop - By Andriopj" protocol=tcp src-address=$srcStart2 to-address=$toPublicIP to-ports="$portStart-$portStop"
/ip firewall nat add chain="$NewChain-$QtdRegras2" comment="CGNAT IP $srcStart2 Porta $portStart - $portStop - By Andriopj" action=src-nat protocol=udp src-address=$srcStart2 to-address=$toPublicIP to-ports="$portStart-$portStop"
:set srcStart2 ($srcStart2 + 1);
:set $portStart ($portStop + 1);
:set $portStop ($portStart + $portsPerAddr - 4000);
:set i ($i + 1)
}
:set QtdRegras2 ($QtdRegras2 + 1);
}
}

----------

