Página 1 de 5 12345 ÚltimoÚltimo
+ Responder ao Tópico



  1. #1

    Padrão Script CGNAT

    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
    Código :
    :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.
    Código :
    $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
    Última edição por AndrioPJ; 22-02-2018 às 20:30.

  2. #2

    Padrão Re: Script CGNAT

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

  3. #3

    Padrão Re: Script CGNAT

    Parabéns pela postagem

  4. #4
    tecnico chefe Avatar de naldo864
    Ingresso
    May 2010
    Localização
    Carapicuíba, Brazil, Brazil
    Posts
    3.131
    Posts de Blog
    1

    Padrão

    Citação Postado originalmente por AndrioPJ Ver Post
    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
    Código :
    :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.
    Código :
    $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
    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.

  5. #5

    Padrão Re: Script CGNAT

    Citação Postado originalmente por naldo864 Ver Post
    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.

  6. #6

    Padrão Re: Script CGNAT

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

  7. #7

    Padrão Re: Script CGNAT

    Citação Postado originalmente por bimbo Ver Post
    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

    ondeX.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.

  8. #8

    Padrão Re: Script CGNAT

    Citação Postado originalmente por AndrioPJ Ver Post
    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

    ondeX.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

  9. #9

    Padrão Re: Script CGNAT

    Citação Postado originalmente por bimbo Ver Post
    Deu certinho, se inserir no icmp vai ficar melhor ainda. Obrigado
    Poderia me dar uma ajuda de como configurar cgnat. Whast 55 996859044

  10. #10

    Padrão Re: Script CGNAT

    Show de bola....

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

  11. #11

    Padrão Re: Script CGNAT

    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

  12. #12

    Padrão Re: Script CGNAT

    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 ?

  13. #13

    Padrão Re: Script CGNAT

    Citação Postado originalmente por baixinho930 Ver Post
    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.

  14. #14

    Padrão Re: Script CGNAT

    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?

  15. #15

    Padrão Re: Script CGNAT

    Citação Postado originalmente por leosmendes Ver Post
    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 #!@%$&*&(

  16. #16

    Padrão Re: Script CGNAT

    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....

  17. #17

    Padrão Re: Script CGNAT

    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.

  18. #18

    Padrão Re: Script CGNAT

    Citação Postado originalmente por AndrioPJ Ver Post
    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 #!@%$&*&(
    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?

  19. #19

    Padrão Re: Script CGNAT

    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

  20. #20

    Padrão Re: Script CGNAT

    Citação Postado originalmente por Seraph Ver Post
    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.