Prezado, poderia disponibilizar o teu script?
Versão Imprimível
O IP Publico tem que ser adicionado em algum lugar, tem que ter rota para esse IP publico.
Caso contrario, você não consegue fazer os clientes sairem por aquele IP.
Você pode adicionar o IP na interface de saida ou mesmo numa interface virtual.
Como existem administradores que alteram o nome da interface de saida ou mesmo usam em portas diferentes.... afim de evitar que o script gerasse conflito, eu escrevi o script para que o mesmo adicionasse o IP publico em uma interface virtual, pois assim pode-se usar qualquer interface de saida que o IP publico vai funcionar
boa tarde, como saber por qual ip publico e porta o cliente pppoe esta usando atraves de um cgnat?grato
na verdade tenho 5 dias tentando criar um cgnat com um /29 e não estou conseguindo principalmente como configurar esse /29 na interface.
pode me ajudar nesta questão?
Boa tarde senhores,
Rodei aqui, porém não está resolvendo o reverso e não estou conseguindo encontrar o erro, se retiro o cgnat e faço um masquerade resolve corretamente.
Alguma dica ?
No caso acho que o AndrioPJ disse que tem a rota gerada pela inclusão do ip na interface, ip da rede diretamente conectada, que seria anunciada para outro roteadores.
Mas só pra saber se eu entendi a questão de não colocar o ip, apenas a rota.
Para que os pacote saibam voltar você só adiciona a rota no concentrador e anuncia?
Na volta do pacote para o concentrador, o concentrador recebe o pacote com destino ao ip publico que não esta no roteador e antes de ser descartado o NAT destroca o destino para o ip privado original e encaminha para o ip privado do cliente?
é isso?
Alguém fazendo CGNAT com freebsd?
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
Anexo 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.
aqui nao sei que fiz de errado nao criou as regra so cria uma
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á
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
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.
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.
Anexo 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.
Boa noite
Para isso coloquei aquela box lá na direita em cima, "Calcular Netmaps". Se você precisar identificar o cliente, você digita o IP público externo e a porta de origem da conexão, e clica em "Calc", e o programa vai calcular o IP privado que utiliza aquele IP público na porta que vc informou.
Por exemplo, você recebe um e-mail do CERT informando que alguém ta com um malware (comum receber esses e-mails), e o e-mail do CERT ele vai te informar a data e hora, o IP público de origem/destino e a porta de origem/destino.
algo assim:
Código :
====================================================================== Formato: "asn","ip","timestamp","malware","src_port","dst_ip","dst_port","dst_host","proto" "626262","4.100.200.6","2019-07-25 00:12:07","necurs","2724","181.182.183.184","80","","tcp" "626262","4.100.200.6","2019-07-28 21:25:14","necurs","2754","181.182.183.184","80","","tcp" ======================================================================
Você vai colocar ali no programa, na caixa de "Calcular Netmaps", no campo "Público", o IP de origem, que é neste caso 4.100.200.6 e a porta de origem, que neste caso foram as 2724 e 2754 (digite uma porta por vez, pois cada linha é um registro de conexão que tem que ser pesquisado individualmente), e clica em Calc. Logo abaixo, vai aparecer um resumo que vai informar qual o IP privado que utiliza aquele IP público naquela porta de origem.
Com a informação do IP privado e a data e hora da conexão, vc vai pesquisar no seus logs de conexão qual estava utilizando aquele IP privado naquele momento.
Ainda nai entendi... fiz essa calculadora abaxio. alguem pode me ajudar?? nao funcionaram.
Bom dia,
A lógica é a do netmap mesmo, considerando que ele vai fazer isso em um range de portas.
Por exemplo, pegamos varios IPs privados, e traduzimos sempre no mesmo IP público, mas em ranges de portas diferentes.
100.64.0.0/24 traduzido para xxx.yyy.zzz.0/24
Neste caso, são 256 endereços privados, traduzidos nos respectivos endereços de rede no bloco público, de forma "binária", ou seja:
100.64.0.0 = xxx.yyy.zzz.0
100.64.0.1 = xxx.yyy.zzz.1
100.64.0.2 = xxx.yyy.zzz.2
100.64.0.3 = xxx.yyy.zzz.3
e assim por diante.
Claro que essa é uma forma facil de vizualizar, mas por exemplo:
100.64.0.128/25 traduzido para xxx.yyy.zzz.0/25. É a mesma coisa, o primeiro endereço da rede 100.64.0.128/25 será traduzido para o primeiro endereço da rede xxx.yyy.zzz.0/25, o segundo endereço de 100.64.0.128/25 para o segundo de xxx.yyy.zzz.0/25, e assim por diante:
100.64.0.128 = xxx.yyy.zzz.0
100.64.0.129 = xxx.yyy.zzz.1
100.64.0.130 = xxx.yyy.zzz.2
100.64.0.131 = xxx.yyy.zzz.3
e assim por diante.
Então, em resumo, o primeiro endereço da rede de origem é traduzido para o primeiro endereço da rede de destino (o to-address), o segundo endereço da rede de origem, para o segundo endereço da rede de destino.
No final das contas, é ainda um pouco mais complicado que isso, porque na realidade o netmap traduz um "conjunto de ip" para outro, e esse conjunto de IP pode ser um range, por exemplo 100.64.0.20-100.64.0.147, que no caso são 128 endereços, e você poderia usar netmap para traduzir esse range para um bloco /25, no nat 1:1 do netmap (primeiro da origem no primeiro do destino, segundo da origem no segundo do destino, etc).
Então, utilizando esse esquema, você traduz uma lista de redes privadas, para uma única rede pública. Só que, somente desta forma, você não teria como identificar o usuário do IP público num log de acesso, consultando seu log de conexão (como exige a legislação), pois se você decidiu traduzir, por exemplo, 32 redes privadas, para uma rede pública, ao tentar identificar um usuário de um log de acesso qualquer, consultando o seu log de conexão, você teria 32 possíveis usuários. Para poder fazer essa consulta de forma específica, você então traduz a porta de origem de cada um dos blocos de origem, para um range novo e diferente para cada bloco. Assim, no log de acesso você terá a informação da porta de origem da conexão, como no exemplo dos logs do CERT que ele envia por e-mail. E a porta de origem, vai estar então restrita dentro de um bloco específico de rede private, dentro do qual você pode buscar o usuário específico daquele acesso.
Por exemplo:
100.64.0.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 2001-7000
100.64.1.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 7001-12000
100.64.2.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 12001-17000
100.64.3.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 17001-22000
100.64.4.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 22001-27000
100.64.5.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 27001-32000
100.64.6.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 32001-37000
100.64.7.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 37001-42000
100.64.8.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 42001-47000
100.64.9.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 47001-52000
100.64.10.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 52001-57000
100.64.11.0/24 qualquer porta de origem - traduz para xxx.yyy.0.0/24 e porta de origem 57001-62000
Neste caso, você está traduzindo além do endereço de origem, a porta de origem também, porém. Como pode observar, cada grupo de endereço privado, vai ter a porta de origem traduzida em um range de 5000 portas, e o range é diferente para cada rede privada, mas todas vão ter o endereço de IP traduzido para o mesmo IP público. Por exemplo:
100.64.0.1 = xxx.yyy.0.1
100.64.1.1 = xxx.yyy.0.1
100.64.2.1 = xxx.yyy.0.1
e assim por diante.
Ou seja, cada um daqueles blocos privados /24 vai ser traduzido para o mesmo bloco público /24, o que vai fazer que (neste exemplo) 12 clientes (um de cada rede privada) utilize o mesmo endereço público, porém, em um range de portas diferente.
E, considerando que você liberou 5000 portas neste caso, para cada range, isso quer dizer que o usuário vai ter 5000 conexões simultâneas disponíveis, o que é o suficiente para um usuário residencial.
No final das contas, esse exemplo utilizei 5000 portas por usuário, você pode utilizar 2000 por exemplo, para economizar endereços públicos. Com 2000 portas por usuário, da para colocar 32 usuários por IP público. Com 1000 portas, você pode colocar até 64 usuários por IP público. Esse calculo do range de portas o programinha vai fazer sozinho, baseado na Divisão que você escolher.
O calculo é esse, depois que a gene consegue dar a volta ao redor dele, não parece tão complexo.
Amigo primeiramente parabéns pelo tópico, me diz uma coisa, consegue colocar no aplicado opção de colocar nome da interface, assim podemos setar a interface de saida, fazendo com que o nat fique apenas pra rede externa.
Se possivel inclui nos 2 aplicativos.
Amigos meu cenário é o seguinte eu tenho 3 Link do mesmo provedor que compro Link e faço um load balance:
LINK 1: IP FIXO (PUBLICO)
LINK 2: IP REDE
LINK 3: IP REDE
SEGUE ABAIXO IMAGEM ANEXA.
O modo de autenticação é PPPOE, só tenho uma RB3011, que é onde chega link e autentica clientes e nela que faço balance tbm.
Anexo 69791
Nesse caso como eu deveria, proceder para fazer meu CGNAT
Se você não tem AS, e vai usar blocos de IPs fornecidos pelos operadoras/provedores que te fornecem o link, você vai precisar fazer de uma forma m pouco mais complexa mesmo, com marcações em cada link para entrar num conjunto de regras de CGNAT somente para aquele link.
Neste caso, não seria mais interessante você contratar um suporte se você não consegue fazer?
sim creio que terei que contratar suporte atualizei o post coloquei uma img
Olá pessoal,
Ja usei o script desse post com sucesso (aproveito para parabenizar os amigos que contribuíram com o código).
Usei fazendo PPPoE+CGNAT na mesma RB.
E se for usar RBs separadas? Uma para PPPoE e outra pra CGNAT?
Funciona também? ou seja, ligo as duas via OSPF e na segunda RB depois do PPPoE subo as regras de CGNAT ?
Como adicionar esta regra para adicionar um /20(4096 ips) privados para /25(128 ips) público?
Preciso adicionar regra por regra manualmente ou tem como a por de uma única vez ?
Não precisa nem usar OSPF neste caso, a não ser que você tenha uma rede muito grande que precise. O mais fácil seria só configurar uma rota padrão na RB PPPoE usando a RB CGNAT como gateway (cria uma rede /30 entre as duas para esse fim).
No pool que você usar para o PPPoE, cria uma rota na RB CGNAT para a RB PPPoE.
Usando o programinha de CGNAT netmap, você poderia considerar 16 blocos /24. Por exemplo, digamos que seu bloco é 200.100.0.0/20, neste caso você tem os seguintes blocos /24 dentro desse /20:
200.100.0.0/24
200.100.1.0/24
200.100.2.0/24
200.100.3.0/24
200.100.4.0/24
200.100.5.0/24
200.100.6.0/24
200.100.7.0/24
200.100.8.0/24
200.100.9.0/24
200.100.10.0/24
200.100.11.0/24
200.100.12.0/24
200.100.13.0/24
200.100.14.0/24
200.100.15.0/24
Então você adicionaria 16 regras no programa. Se por exemplo, você escolher uma divisão de 1:32 (o que da 2015 portas por regra), cada bloco /24 de IP públicos serão direcionados a 32 blocos /24 de IPs privados, ficando assim:
200.100.0.0/24 -> 100.64.0.0 (vai usar 100.64.0.0 até 100.64.31.255)
200.100.1.0/24 -> 100.64.32.0 (vai usar 100.64.32.0 até 100.64.63.255)
200.100.2.0/24 -> 100.64.64.0 (vai usar 100.64.64.0 até 100.64.95.255)
200.100.3.0/24 -> 100.64.96.0 (vai usar 100.64.96.0 até 100.64.127.255)
200.100.4.0/24 -> 100.64.128.0 (vai usar 100.64.128.0 até 100.64.159.255)
200.100.5.0/24 -> 100.64.160.0 (vai usar 100.64.160.0 até 100.64.191.255)
200.100.6.0/24 -> 100.64.192.0 (vai usar 100.64.192.0 até 100.64.223.255)
200.100.7.0/24 -> 100.64.224.0 (vai usar 100.64.224.0 até 100.64.255.255)
200.100.8.0/24 -> 100.65.0.0 (vai usar 100.65.0.0 até 100.65.31.255)
200.100.9.0/24 -> 100.65.32.0 (vai usar 100.65.32.0 até 100.65.63.255)
200.100.10.0/24 -> 100.65.64.0 (vai usar 100.65.64.0 até 100.65.95.255)
200.100.11.0/24 -> 100.65.96.0 (vai usar 100.65.96.0 até 100.65.127.255)
200.100.12.0/24 -> 100.65.128.0 (vai usar 100.65.128.0 até 100.65.159.255)
200.100.13.0/24 -> 100.65.160.0 (vai usar 100.65.160.0 até 100.65.191.255)
200.100.14.0/24 -> 100.65.192.0 (vai usar 100.65.192.0 até 100.65.223.255)
200.100.15.0/24 -> 100.65.224.0 (vai usar 100.65.224.0 até 100.65.255.255)
Anexo 70064
Depois, só clicar para gerar as regras, e aplicar pelo terminal na RB CGNAT.
Você pode também adicionar só 1 item, com o bloco /20 inteiro
200.100.0.0/20 -> 100.64.0.0 (vai usar 100.64.0.0 até 100.64.255.255).
Anexo 70065
Neste caso, você terá menos regras, porém vale a pena comparar o desempenho (o uso de CPU) dos dois casos, pois não sei a diferença de performance do netmap quando utiliza blocos menores e maiores.
Fico grato pela resposta.
Eu não consegui usar o programa.
É não quis insistir porque imagino que as regras em netmap não atendam minha necessidade caso receba uma futura notificação e tente localizar um possível cliente infrator.
Talvez possa está entendendo errado,mas queria usar a regra do script ,essa sei que atende.
Ah sim. Mas o netmap atende sim, para isso serve aquele campo lá em cima de "Calcular netmap". Inclusive aumenta o desempenho de modo geral comparado com o modelo de src-nat.
Vou dar uma olhada no script depois pra ver como usar com os parametros que vc quer.
Obrigado pela ajuda amigo.
Apliquei as configurações em um mk de teste e pude ver como funciona.
Consegui entender a lógica.
Estou precisando ajuda para usar cgnat em minha rede porem tentando o script eo programa sem sucesso venho pedir aos amigos que posam me ajudar a colocar para funcionar minha rede em cgnat meu cenario eo seguinte
tenho o ip dos clientes 100.64.0.0/24
tenho o mkauth com ip 72.31.255.2
tenho uma rede interna em minha casa e escritorio 170.0.0.0/24
e um bloco de ip xxx.xxx.xxx.50/28 gw xxx.xxx.xxx.49
como ficaria essa rede desculpem minha iguinorancia mais pfv to quabrando a cabeça aqui tanto no script como no programa e nada desde ja agradeço aos amigos.
Estou tentando aplica em um bloco de ip/29 mas não estou conseguindo estou seguindo como estar no script vou mostrar as alteração que diz no script onde pode estar errado?
:global addNatRules do={
:global srcStart [:pick $NetworkIP 0 [:find $NetworkIP "128.201.97.216/29"]]
:global srcStart2 $srcStart
:global QtdRegras 30
:global QtdRegras2 30
:global portStop ($portStart + $portsPerAddr - 4000)
/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 - 8 ))"
:set QtdRegras ($QtdRegras + 1);
:set srcStart ($srcStart + $IPsPerRule);
}
:log info "64000: $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 - 4000);
:set i ($i + 1)
}
:set QtdRegras2 ($QtdRegras2 + 1);
}
}