CGNAT no Mikrotik com Script para configurar tudo.

Créditos

Script para cgnat desenvolvido e cedido pelos parceiros da OPHICINA DA NET. Por isso quero antes de tudo deixar os meus agradecimentos pelo apoio.

Eles fornecem consultoria técnica e podem te ajudar com sua rede mikrotik. Se precisar pode chamar o Rodrigo, que o pessoal lá são tranquilos e eficientes. Além de terem um bom preço também.

Contato via whatsapp, ou via telegram.

Como as regras do CGNAT Mikrotik funcionam.

Nateando ip privado para portas de origem especificas.

Se não sabe o que é um nat e como funciona, este artigo explica.

O CGnat estático ( CGNAT Determinístico ), funciona utilizando portas TCP/UDP especificas para cada ip privado. Dessa forma, se for necessário identificar um cliente que estava “atrás” do nat, basta verificar pela porta de origem.

Ao utilizar CGNAT Determinístico, não há necessidade de um servidor de log para armazenar informação sobre o nateamento. É possivel identificar facilmente o ip privado responsavel por alguma solicitação apenas analizando a porta de origem.

Para identificar qual ip privado originou determinado trafego, basta comparar no “to ports” qual se encaixa com a porta de origem da solicitação.

Arquitetura e sequencia de regras. Como jump funciona.

Configurar CGNAT no mikrotik requer criar muitas regras de NAT. É importante uma arquitetura das regras de firewal para economizar recursos como cpu e memória. Sendo assim, é necessário criar “sub chains”. O tráfego total que passa pelo equipamento é processado apenas nas regras dos chains padrão (srcnat, dstnat).

Para direcionar o tráfego para outro chain, esse script adicona regras com ação jump. Com isso, essas regras tratam um tráfego com origem específica e envia para o “sub-chain” desejado.

Hierarquia das regras de cgnat par ao mikrotik.

O N1 (nível 1) é o tráfego total que passa pelo Chain padrão (srcnat). Para cada /24 privado, haverá uma regra no chain srcnat com ação jump para o próximo chain. O trafego total só “passa” pelas regras do N1, dessa forma apesar de milhares de regras, apenas algumas poucas regras realmente serão processadas. por exemplo se for natear um /29 inteiro, apenas 32 regras no N1.

Já no N2 (nível 2) terá 8 regras, que fazem um jump para o N3. Assim, a partir do N2 o trafego total não é processado, e apenas o trafego do /24 especifico encaminhado pela regra anterior “passará” por essas regras.

O N3 é onde estão as regras que são realmente responsáveis por natear os ips privados para ips públicos. E também são processadas apenas pelo /27 especifico, que foi direcionado ao chain pela regra do nivel anterior. Nesse chain será 1 regra para ICMP para todos os ips do /27, além de uma regra TCP e outra UDP para cada ip privado. Sendo assim o nível 3 terá 65 regras no total. E ainda para cada IP privado é reservado 2 mil portas TCP/UDP.

Script para adicionar todas as regras do CGNAT no Mikrotik.

                        ###############################################################
                        # #########  ##########  ##      ##                           #
                        # ##     ##  ##      ##  ##      ##                           #
                        # ##     ##  ##      ##  ##      ##      ##    # ####  #####  #
                        # ##     ##  ##########  ##########      # #   # #       #    #
                        # ##     ##  ##          ##      ##      #  #  # ####    #    #
                        # ##     ##  ##          ##      ##      #   # # #       #    #
                        # #########  ##          ##      ##      #    ## ####    #    #
                        ###############################################################
                        # Script para configuração de regras cgnat com portas fixas.  #
                        # Esse script foi desenvolvido pela equipe da ophicinadanet   #
                        #  O uso desse script é liberado incondicionalmente, porem:   #
                        #               Seja justo e mantenha os creditos             #
                        ###############################################################
########################################################################################################
 # Esse script usa 2000 portas para natear cada ip privado,  
 # então para natear um /24 privado será nescessario ao menos um /29 publico 24=>29, 23=>28, 22=>27, 21=>26, 20=>25, 19=>24.
 
 # coloque o network / mascara da faixa privada a ser nateada
:global FaixaPrivada "100.64.0.0/23";
 #Informe a faixa publica / mascara que será usada para natear
:global FaixaPublica "200.0.0.0/25";
 # escolha a porta inicial deve ser um valor entre 1025 a 1534
:global PortaInicial 1025;
 ########################################################################################################
 # Check se porta inicial menor ou = 1024
:if (($PortaInicial <= 1024) || (($PortaInicial + (2000 * 32)) > 65535)) do={ :set PortaInicial 1025; }

 # Check se a quantidade de Portas Por Endereco excede o maximo de portas
:if ((($PortaInicial + (2000 * 32)) > 65535)) do={:set PortasPorEndereco 2000; }

########################################################################################################
 # Removendo a mascara dos enderecos, e pegando a mascara privada
:global ipRedePriv ([:pick $FaixaPrivada 0 [:find $FaixaPrivada "/"]]);
:global ipRedePub ([:pick $FaixaPublica 0 [:find $FaixaPublica "/"]]);
:global MASK ( [:pick $FaixaPrivada ([:find $FaixaPrivada "/"] + 1) [:len $FaixaPrivada]])

########################################################################################################
 # dividindo ip privado em octetos
:global privDecimalPos "0"; :global privOctet1; :global privOctet2; :global privOctet3; :global privOctet4;

:set privDecimalPos [:find $ipRedePriv "."]; 
:set privOctet1 [:pick $ipRedePriv 0 $privDecimalPos ];

:set privDecimalPos ( $privDecimalPos+1 );
:set privOctet2  [:pick $ipRedePriv $privDecimalPos [:find $ipRedePriv "." $privDecimalPos ]];
    
:set privDecimalPos ([:find $ipRedePriv "." $privDecimalPos]+1 );
:set privOctet3  [:pick $ipRedePriv $privDecimalPos [:find $ipRedePriv "." $privDecimalPos ]];

:set privDecimalPos ([:find $ipRedePriv "." $privDecimalPos]+1 );
:set privOctet4 [:pick $ipRedePriv $privDecimalPos [:len $ipRedePriv ]];

########################################################################################################
 #dividindo ip publico em octeto
:global pubDecimalPos "0"; :global pubOctet1; :global pubOctet2; :global pubOctet3; :global pubOctet4;

:set pubDecimalPos [:find $ipRedePub "."];
:set pubOctet1 [:pick $ipRedePub 0 $pubDecimalPos];

:set pubDecimalPos ($pubDecimalPos+1);
:set pubOctet2  [:pick $ipRedePub $pubDecimalPos [:find $ipRedePub "." $pubDecimalPos]];
    
:set pubDecimalPos ([:find $ipRedePub "." $pubDecimalPos]+1);
:set pubOctet3  [:pick $ipRedePub $pubDecimalPos [:find $ipRedePub "." $pubDecimalPos]];

:set pubDecimalPos ([:find $ipRedePub "." $pubDecimalPos]+1);
:set pubOctet4 [:pick $ipRedePub $pubDecimalPos [:len $ipRedePub]];
 ########################################################################################################
  # Calculando tamanho do loop para toda a faixa de ips privados
  
 : if ($MASK = 24) do={ :global Redes24 "0"}; : if ($MASK = 23) do={ :global Redes24 "1"}; : if ($MASK = 22) do={ :global Redes24 "3"};
 : if ($MASK = 21) do={ :global Redes24 "7"}; : if ($MASK = 20) do={ :global Redes24 "15"}; : if ($MASK = 19) do={ :global Redes24 "31"}

########################################################################################################
 # Inserindo as regras para o CGNAT. Mapa a partir da mascara inicial para o /24, para /27 ja com ICMP, para /32 TCP, UDP 

:global pubIp $pubOctet4;
:global firstPort;
:global lastPort;
:global privIp 0;

for i from=$privOctet3 to=($privOctet3 + $Redes24 ) do={

    /ip firewall nat add chain=srcnat src-address="$privOctet1.$privOctet2.$i.0/24" dst-address-list=!Interno action=jump jump-target="CGNAT_OPH.NET_$privOctet1-$privOctet2-$i-24" comment="CGNAT_OPH.NET_$privOctet1-$privOctet2-$i-24"
    
    for j from=0 to=224 step=32 do={
        /ip firewall nat add chain="CGNAT_OPH.NET_$privOctet1-$privOctet2-$i-24" src-address="$privOctet1.$privOctet2.$i.$j/27" action=jump jump-target="CGNAT_OPH.NET_$privOctet1-$privOctet2-$i-$j"
        :set firstPort $PortaInicial;
        :set lastPort ($firstPort + (2000 - 1));
    
        /ip firewall nat add chain="CGNAT_OPH.NET_$privOctet1-$privOctet2-$i-$j" action=src-nat protocol=icmp to-address="$pubOctet1.$pubOctet2.$pubOctet3.$pubIp"
        
        for k from=0 to=31 do={
            /ip firewall nat add chain="CGNAT_OPH.NET_$privOctet1-$privOctet2-$i-$j" action=src-nat protocol=tcp src-address="$privOctet1.$privOctet2.$i.$privIp" to-address="$pubOctet1.$pubOctet2.$pubOctet3.$pubIp" to-ports="$firstPort-$lastPort"
            /ip firewall nat add chain="CGNAT_OPH.NET_$privOctet1-$privOctet2-$i-$j" action=src-nat protocol=udp src-address="$privOctet1.$privOctet2.$i.$privIp" to-address="$pubOctet1.$pubOctet2.$pubOctet3.$pubIp" to-ports="$firstPort-$lastPort"
    
            :set firstPort ($firstPort + 2000);
            :set lastPort ($firstPort + (2000 - 1));
            :set privIp ($privIp + 1);
        }

        :set pubIp ($pubIp + 1);
    }

    :set privIp 0;
}
########################################################################################################
 # OBS: Não esqueça de adicionar proteções para os endereços publicos adicionados nas configuracos do MIKROIK

Como utilizar o script.

Copiar do site para o notepad ++

Copie o script do site para um bloco de notas.
Eu pessoalmente gosto muito do notepad++, mas pode ser qualquer bloco de notas.

Editar variaveis do script

Depois, edite as variáveis FaixaPrivada, e FaixaPublica.
Informe Os endereços das redes que serão utilizadas, informando a mascara, tudo entre as aspas.
Agora basta selecionar e copiar tudo.

Colar no terminal do mikrotik

1: Depois de ter acessado o mikrotik via winbox, clique sobre “New Terminal”.
2: Clique com o lado direito do mause em qualquer area da tela do terminal.
3: Agora clique sobre a opção “Paste” para colar os comandos.
OBS: Não usar ctrl+v no terminal mikrotik.

Após colar, basta aguardar o script finalizar, e depois apenas testar se esta funcionando como esperado..

Detalhes importantes.

1- O script aceita redes privadas entre /19 e /24. Basta preencher a variável corretamente.
Deve ficar atento quanto aos ips públicos necessários: para um /24 privado gasta um /29 público, para um 23 privado um /28 público. O cálculo já está no topo do script 24=>29, 23=>28, 22=>27…
2- A quantidade de 2000 portas é bem mais que o necessário para residências e pequenas empresas. Porem para empresas grandes ou locais com inúmeros acessos simultâneos, vai limitar a 2000 conexões ativas simultâneas e pode gerar problemas, porém, também evita que utilizem o link para revenda de internet.
3- Nunca utilize qualquer script em equipamentos em produção sem antes testar. Sempre teste em laboratório.

Inscreva-se no nosso canal do YouTube e fique por dentro das melhores dicas de segurança na internet! Aproveite para melhorar a sua conexão e ficar mais seguro na web.
Duvidas criticas ou sugestões, nos envie uma mensagem clicando aqui.

Outros artigos que podem interessar.