Em GCNAT eu teria que ter 1 regra de src-nat para cada cliente?
Versão Imprimível
Em GCNAT eu teria que ter 1 regra de src-nat para cada cliente?
Lucas sim tem que fazer uma pra cada IP do seu range é pior que cliente. No meu caso tenho 50 ranges /25. Só tenho 2500 clientes.
Enviado de meu SM-G800H usando Tapatalk
@reirox eu tenho uma regra de log remote, mas poderia ser arquivos rotativos e de madrugada capturar os arquivos.
A regra exata de NAT:
add action=src-nat chain=srcnat comment="NAT RANGE Bairro xxxxx" log=yes log-prefix=138.xx.yy.zz out-interface=BridgeBackbone src-address=10.vv.ww.0/27 \
to-addresses=138.xx.yy.zz
Enviado de meu SM-G800H usando Tapatalk
Eduardo , No seu caso entao , teria 6400 Regras de CGNAT ?
Código :
:global sqrtbin do={ :local count 0 :local value $1 :do { :set count ($count + 1) :set value ($value / 2) } while=($value > 0) :return $count } :global addNatRules do={ :global sqrtbin; :local toAddrCount $toAddr; :local x (1<<(([$sqrtbin ($count)])/2)); :local y ($count / $x); :for j from=$srcStartOct1 to=$srcStopOct1 do={ :for k from=$srcStartOct2 to=$srcStopOct2 do={ :for l from=$srcStartOct3 to=$srcStopOct3 do={ /ip firewall nat add chain=srcnat action=jump jump-target="CGNAT-$($toAddrCount)" \ src-address=(($j.".".$k.".".$l.".".$srcStartOct4)."-".($j.".".$k.".".$l.".".$srcStopOct4)) \ comment="CGNAT" out-interface=LINK :set toAddrCount ($toAddrCount + 1) } } } :set toAddrCount $toAddr; :for j from=$srcStartOct1 to=$srcStopOct1 do={ :for k from=$srcStartOct2 to=$srcStopOct2 do={ :for l from=$srcStartOct3 to=$srcStopOct3 do={ :if ($x * $x = $count) do={ :set y ($x + 1) } :for i from=0 to=($y-1) do={ :local inicio [:toip (($j.".".$k.".".$l.".".$srcStartOct4) + ($x * $i))] :local fim [:toip (($j.".".$k.".".$l.".".$srcStartOct4) + ($x * ($i + 1) - 1))] /ip firewall nat add chain="CGNAT-$($toAddrCount)" action=jump jump-target="CGNAT-$($toAddrCount)-$($i)" \ src-address=([:tostr $inicio]."-".[:tostr $fim]) comment="CGNAT" } :set toAddrCount ($toAddrCount + 1) } } } :set toAddrCount $toAddr :for j from=$srcStartOct1 to=$srcStopOct1 do={ :for k from=$srcStartOct2 to=$srcStopOct2 do={ :for l from=$srcStartOct3 to=$srcStopOct3 do={ :local srcStart [:toip (($j.".".$k.".".$l.".".$srcStartOct4))] :for i from=0 to=($count - 1) do={ :local prange "$($portStart + ($i * $portsPerAddr))-$($portStart + (($i + 1) * $portsPerAddr) - 1)" /ip firewall nat add chain="CGNAT-$($toAddrCount)-$($i / $x)" action=src-nat protocol=tcp src-address=($srcStart + $i) \ to-address=$toAddrCount to-ports=$prange comment="CGNAT" /ip firewall nat add chain="CGNAT-$($toAddrCount)-$($i / $x)" action=src-nat protocol=udp src-address=($srcStart + $i) \ to-address=$toAddrCount to-ports=$prange comment="CGNAT" } :set toAddrCount ($toAddrCount + 1) } } } } $addNatRules count=128 srcStartOct1=10 srcStartOct2=150 srcStartOct3=1 srcStartOct4=0 \ srcStopOct1=10 srcStopOct2=150 srcStopOct3=1 srcStopOct4=127 \ toAddr=138.aa.bb.0 portStart=1500 portsPerAddr=500
Acabei de rodar esse código na minha CCR.
Terminou de executar as 6:54, 14310 regras a minha é CCR1036-12G-4S.Citação:
Acabei de rodar esse código na minha CCR.
O SCRIPT consumia só um núcleo, no final criava uma regra a cada 5s (log memory).
Agora de manhã eu apliquei uma modificação nas primeiras regras para apontar out-interface, demorou 4s cada execução:
Código :
:foreach a in=[find chain=srcnat comment~RANGE] do={:set number=$a out-interface=LINK}
Serio que vocês usam CGNAT desta forma?
Honestamente, eu não acho que precise de log quando usado CGNAT, o CGNAT é estático, cada cliente vai ficar com um grupo de portas, não vai mudar. Então se tem 1000 clientes vai ter apenas 1000 regras de SNAT... Só isso!
Enviado via XT1563 usando UnderLinux App
Mas não tô gerando log. Acontece que hoje uso 2000 amanhã 2001 depois mudo um por outro. Eu deixei estático pra qualquer IP que os clientes peguem um IP que existe a regra dele.
Enviado de meu SM-G800H usando Tapatalk
deu certo seu CGNAT @eduardomazolini ? Como está o desempenho do CCR?
Deu e tá tranquilo
Eu mudei a regra agora uso menos regras uso netmap com 128 IPs. Eu diria que o método anterior seria um NAT "vertical" cada IP usa uma porta e vai subindo a porta e o IP. Agora eu chamei de "horizontal" pois cada regra é para uma rede diferente então o IP 1 sempre está no IP 1 na sequência de porta seguinte e IP 1 de novo mas de outra rede.
Legal, podes mandar o script aí pra gente testar?
Coloquei no Blog pra ficar mais fácil:
http://blog.mazolini.com.br/2017/03/cgnat.html
Fiz o vertical aqui, ficou bacana, obrigado.
O que eu disse que não da pra rastrear CGNAT em cima de CGNAT. Pois não é armazenado a porta de origem original. Então a porta conhecida do primeiro e perdida no segundo CGNAT.
A diferença é o a sequência de IPs.
No vertical o IP final 1 e final 2 saem com o mesmo IP um range de portas acima.
No horizontal o final 1 privado sai no final 1 público e o final 2 privado sai no final 2 público. E todos da mesma rede usam o mesmo range de portas.
Recomendo vertical só pra quem tem muito poucos IPs.
Eu usei assim até hoje pessoal. Ninguém me disse o contrario.
Demorou pra eu sacar o que era CGNAT, só no post #37 consegui kkk.
Eu tava relendo esse tópico aprendi muito aqui.
Tava olhando meus backups da RB e estavam com 3269.4K e um total de 16281 regras de NAT.
Hoje acabou a energia a minha RB voltou corrompida, sem nenhuma regra de NAT, até eu perceber isso perdi 2 horas sem internet, voltei o um backup e tudo voltou ao normal.
Resolvi por em pratica o que eu aprendi no forum da ABRINT e particularmente chamei de NAT Horizontal.
Meu backup agora é de 704.4K total de 503 regras de NAT.
Valeu a todos aqui.
@eduardomazolini, o script não funciona mais na versão 6.39 do routerOS, já tem solução para isso?
Desculpe não pretendo verificar isso, o script estava no site da mikrotik. Como disse o script produz muitas regras, eu to usando nat com netmap agora uso uma planilha pra executar gerar as linhas que preciso.
Não posso confirmar que deixou de funcionar também, não testei.
Mas penso que uma vez que entendeu o conceito não precise necessariamente do script.