+ Responder ao Tópico



  1. #61

    Padrão Re: Script CGNAT

    Alguém fazendo CGNAT com freebsd?

  2. #62

    Padrão Re: Script CGNAT

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

  3. #63

    Padrão

    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

    Clique na imagem para uma versão maior

Nome:	         cgnat_rules.jpg
Visualizações:	613
Tamanho: 	75,9 KB
ID:      	69573

    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:
    Código :
    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.

  4. #64

    Padrão Re: Script CGNAT

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

  5. #65

    Padrão Re: Script CGNAT

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

  6. #66

    Padrão

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

  7. #67
    Moderador Avatar de Bruno
    Ingresso
    Nov 2002
    Localização
    Guarapuava-PR
    Posts
    4.180
    Posts de Blog
    1

    Padrão Re: Script CGNAT

    Citação Postado originalmente por info24hs Ver Post
    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á
    cria os ips 43 até 46 na backhole

  8. #68

    Padrão Re: Script CGNAT

    Citação Postado originalmente por Bruno Ver Post
    cria os ips 43 até 46 na backhole
    e faz oque com o ip 42 ?

    e o ip address nao cria nada?

  9. #69
    Moderador Avatar de Bruno
    Ingresso
    Nov 2002
    Localização
    Guarapuava-PR
    Posts
    4.180
    Posts de Blog
    1

    Padrão Re: Script CGNAT

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

  10. #70

    Padrão Re: Script CGNAT

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

  11. #71

    Padrão Re: Script CGNAT

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

  12. #72
    Moderador Avatar de Bruno
    Ingresso
    Nov 2002
    Localização
    Guarapuava-PR
    Posts
    4.180
    Posts de Blog
    1

    Padrão Re: Script CGNAT

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

  13. #73

    Padrão Re: Script CGNAT

    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

    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
    Última edição por severino2; 29-05-2019 às 02:46. Razão: acresentar

  14. #74

    Padrão

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

    Clique na imagem para uma versão maior

Nome:	         cgnat_rules.jpg
Visualizações:	613
Tamanho: 	75,9 KB
ID:      	69573

    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:
    Código :
    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.
    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

  15. #75

    Padrão Re: Script CGNAT

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

  16. #76

    Padrão Re: Script CGNAT

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

  17. #77

    Padrão

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

  18. #78

    Padrão Re: Script CGNAT

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

  19. #79

    Padrão

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

  20. #80

    Padrão

    Citação Postado originalmente por info24hs Ver Post
    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.
    Clique na imagem para uma versão maior

Nome:	         bitmap.png
Visualizações:	556
Tamanho: 	45,9 KB
ID:      	69736
    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.