Postado originalmente por
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
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