quarta-feira, 29 de março de 2017

CGNAT

Com o fim dos IPv4 as operadoras precisam fazer NAT conhecido também com CGNAT (Carrier-grade NAT) ou em uma tradução livre NAT no nível do provedor.
Pra isso foi designado o range de IPs 100.64.0.0/10 conforme a RFC6598.
Mas vamos ser práticos, se você já entrega um IP privado comum pro cliente não tem por que você mudar para o IP do range 100.64.x.x só pra melhorar seu NAT para CGNAT.
E se você é provedor e tem um cliente que vai registrar a entrega dos IPs do Hotspot de forma eficiente pode entregar um IP fixo pra ele e fazer CGNAT no roteador dele usando IP Privado entregue ao cliente.

Não da pra rastrear CGNAT em cima de CGNAT. 

Mas qual a diferença do NAT normal para o CGNAT?

NAT

O NAT comum você coloca vários IPs privados usando o mesmo IP publico e não altera a porta de origem.
EX: O Navegador do cliente exemplo 192.168.30.10 usa aleatoriamente uma porta alta exemplo 63021 e fala com o IP do site exemplo 216.58.222.9 do blogger na porta 443 se for HTTPs.
Então temos uma conexão:
192.168.30.10:63021 --> 216.58.222.9:443 é alterada para 192.0.2.1:63021 --> 216.58.222.9:443

Um segundo cliente pode escolher a mesma porta ou uma outra porta imediatamente acima ou abaixo ou qualquer outra ficando impossível identificar qual cliente estava em que porta de origem e dizer qual cliente acessou o site.

CGNAT

Com CGNAT faz o que o NAT normalmente faz e também altera a porta de origem.
Então especificamos por exemplo que o cliente 192.168.30.10 usa portas de 10000-a 10999 e o
cliente 192.168.30.11 usa portas de 11000 a 11999.
192.168.30.11:63021 --> 216.58.222.9:443 é alterada para 192.0.2.1:10021 --> 216.58.222.9:443
192.168.30.10:57851 --> 216.58.222.9:443 é alterada para 192.0.2.1:11850 --> 216.58.222.9:443

Assim quando precisar identificar o cliente basta saber a porta de origem pois a porta identifica o IP de origem.

A grande sacada do CGNAT é controlar a porta de origem.

Como implantar?

Para fins didáticos eu vou dar nomes pra 2 métodos, só eu chamo assim, vou chamar de CGNAT Vertical e CGNAT Horizontal

CGNAT Vertical

Aprendi sobre esse método no WIKI da MIKROTIK. Como ele exige a criação de muitas regras tem até um script pra facilitar a implantação.


Quando e Como usar:
- Casos de hotspots públicos;
- Provedores sem AS com muito poucos IPs;
- Para dividir as portas tem que pensar quantos IPs privados vai colocar em cada IP público.

Vantagem:
- Colocar vários "Range de IPs Privados" em 1 único IP público;
- O Range de IPs Privados ficando dentro de 1 IP público a contagem de portas não se perde. A cada Range de IPs Privado novo uso um novo IP público.

Desvantagem:
- Muitas regras, pois são 2 (TCP, UDP) pra cada IP interno mais os jumps pra otimizar;
- Como são tantas regras o ICMP com certeza você vai escolher um IP qualquer para todos os clientes usarem, mesmo que seja diferente do IP que o cliente normalmente usa.




Exemplo de implementação com mikrotik:
/ip firewall nat
add action=jump chain=srcnat comment=CGNAT jump-target=CGNAT-192.0.2.160 out-interface=BridgeBackbone src-address=100.64.0.0/25
add action=jump chain=CGNAT-192.0.2.160 comment=CGNAT jump-target=CGNAT-192.0.2.160-0 src-address=100.64.0.0/28
add action=jump chain=CGNAT-192.0.2.160 comment=CGNAT jump-target=CGNAT-192.0.2.160-1 src-address=100.64.0.16/28
add action=jump chain=CGNAT-192.0.2.160 comment=CGNAT jump-target=CGNAT-192.0.2.160-2 src-address=100.64.0.32/28
add action=jump chain=CGNAT-192.0.2.160 comment=CGNAT jump-target=CGNAT-192.0.2.160-3 src-address=100.64.0.48/28
add action=jump chain=CGNAT-192.0.2.160 comment=CGNAT jump-target=CGNAT-192.0.2.160-4 src-address=100.64.0.64/28
add action=jump chain=CGNAT-192.0.2.160 comment=CGNAT jump-target=CGNAT-192.0.2.160-5 src-address=100.64.0.80/28
add action=jump chain=CGNAT-192.0.2.160 comment=CGNAT jump-target=CGNAT-192.0.2.160-6 src-address=100.64.0.96/28
add action=jump chain=CGNAT-192.0.2.160 comment=CGNAT jump-target=CGNAT-192.0.2.160-7 src-address=100.64.0.112/28
add action=src-nat chain=CGNAT-192.0.2.160-0 comment=CGNAT protocol=tcp src-address=100.64.0.0 to-addresses=192.0.2.160 to-ports=1500-1999
add action=src-nat chain=CGNAT-192.0.2.160-0 comment=CGNAT protocol=udp src-address=100.64.0.0 to-addresses=192.0.2.160 to-ports=1500-1999
add action=src-nat chain=CGNAT-192.0.2.160-0 comment=CGNAT protocol=tcp src-address=100.64.0.1 to-addresses=192.0.2.160 to-ports=2000-2499
add action=src-nat chain=CGNAT-192.0.2.160-0 comment=CGNAT protocol=udp src-address=100.64.0.1 to-addresses=192.0.2.160 to-ports=2000-2499
...
...
...
add action=src-nat chain=CGNAT-192.0.2.160-7 comment=CGNAT protocol=tcp src-address=100.64.0.126 to-addresses=192.0.2.160 to-ports=64500-64999
add action=src-nat chain=CGNAT-192.0.2.160-7 comment=CGNAT protocol=udp src-address=100.64.0.126 to-addresses=192.0.2.160 to-ports=64500-64999
add action=src-nat chain=CGNAT-192.0.2.160-7 comment=CGNAT protocol=tcp src-address=100.64.0.127 to-addresses=192.0.2.160 to-ports=65000-65499
add action=src-nat chain=CGNAT-192.0.2.160-7 comment=CGNAT protocol=udp src-address=100.64.0.127 to-addresses=192.0.2.160 to-ports=65000-65499

CGNAT Horizontal

Aprendi esse método com um colega provedor. A grande sacada é diminuir o número de regras usando netmap.
Como o netmap funciona? Ele altera os bits que fazem parte da rede.
O ideal então é que a mascara usada para selecionar os IPs que vão usar a regra seja igual a da rede assim teremos o NAT 1:1.
Vejam que no caso do ICMP que permite o cliente enviar ping pra internet eu não me preocupei com o NAT não ser 1:1 usei mascara /10 para /25.

Quando e Como usar:
- Provedores com AS mas menos IPs que clientes;
- Para dividir os "Ranges de IPs Privados" preciso saber quantos IPs públicos posso usar;
- Para dividir as portas tem que pensar quantos "Ranges de IPs Privados" vai precisar.

Vantagem:
- Quanto mais IP públicos, maior pode ser considerado o "Range de IPs Privados";
- Quanto mais IP públicos, menor o número de regras usadas; 1 regra pra 128 ou 1 pra 64

Desvantagem:


- Não da pra usar só 1 IP público;
- Tem que manter o controle de todos os Ranges usados pois a contagem de porta não zera. Assim se for criar uma nova regra precisa iniciar na ultima porta utilizada anteriormente.




Exemplo:

/ip firewall nat
add action=jump chain=srcnat jump-target=CGNAT out-interface="ether-LINK" src-address-list=!CLIENTES_FIXOS
add action=netmap chain=CGNAT protocol=icmp src-address=100.64.0.0/10 \
    to-addresses=192.0.2.0/25
add action=jump chain=CGNAT jump-target=CGNAT_100_64 src-address=100.64.0.0/16
add action=jump chain=CGNAT jump-target=CGNAT_100_65 src-address=100.65.0.0/16

add action=jump chain=CGNAT_100_64 jump-target=CGNAT_100_64_0-7 src-address=\
    100.64.0.0/21
add action=jump chain=CGNAT_100_64 jump-target=CGNAT_100_64_8-15 src-address=\
    100.64.8.0/21
add action=jump chain=CGNAT_100_64 jump-target=CGNAT_100_64_16-23 src-address=\
    100.64.16.0/21
add action=jump chain=CGNAT_100_64 jump-target=CGNAT_100_64_24-31 src-address=\
    100.64.24.0/21
add action=jump chain=CGNAT_100_64 jump-target=CGNAT_100_64_32-39 src-address=\
    100.64.32.0/21
add action=jump chain=CGNAT_100_64 jump-target=CGNAT_100_64_40-47 src-address=\
    100.64.40.0/21
add action=jump chain=CGNAT_100_64 jump-target=CGNAT_100_64_48-56 src-address=\
    100.64.48.0/21
...
...
...
add action=netmap chain=CGNAT_100_64_8-15 protocol=tcp src-address=\
    100.64.9.0/25 to-addresses=192.0.2.0/25 to-ports=5000-5499
add action=netmap chain=CGNAT_100_64_8-15 protocol=udp src-address=\
    100.64.9.0/25 to-addresses=192.0.2.0/25 to-ports=5000-5499
add action=netmap chain=CGNAT_100_64_8-15 protocol=tcp src-address=\
    100.64.10.0/25 to-addresses=192.0.2.0/25 to-ports=5500-5999
add action=netmap chain=CGNAT_100_64_8-15 protocol=udp src-address=\
    100.64.10.0/25 to-addresses=192.0.2.0/25 to-ports=5500-5999
...
...
...
add action=netmap chain=CGNAT_100_64_48-56 protocol=tcp src-address=\
    100.64.53.0/25 to-addresses=192.0.2.0/25 to-ports=17500-17999
add action=netmap chain=CGNAT_100_64_48-56 protocol=udp src-address=\
    100.64.53.0/25 to-addresses=192.0.2.0/25 to-ports=17500-17999
add action=netmap chain=CGNAT_100_64_48-56 protocol=tcp src-address=\
    100.64.54.0/25 to-addresses=192.0.2.0/25 to-ports=18000-18499
add action=netmap chain=CGNAT_100_64_48-56 protocol=udp src-address=\
    100.64.54.0/25 to-addresses=192.0.2.0/25 to-ports=18000-18499
...
...
...


Por que separei a questão dos "Ranges de IPs Privados", pois independente da utilização  (rotas, localização, agregações) IPs podem ser agrupados ou divididos pela mascara.
Exemplo: Se eu tenho na minha pra funcionamento 2 /25 posso dizer que tenho 1 /24 como posso dizer que tenho 64 /30

Se for usar 255 IPs públicos, posso usar ranges /24
Se for usar 128 IPs públicos, posso usar ranges /25
Se for usar 64 IPs públicos, posso usar ranges /26
Se for usar 4 IPs públicos, posso usar ranges /30

terça-feira, 7 de março de 2017

Enviar Localização no WhasApp Web

Todos os dias eu preciso enviar a latitude e longitude para os técnicos que vão abrir esta localização em seus celulares.

Eu sei que enviando o link abaixo do google maps funciona, mas tinha que ficar copiando concatenando e colando.

http://maps.google.com/maps?saddr=Current+Location&daddr=-22.5951525,-46.5446545

Então resolvi facilitar a minha vida.

Já uso inserir javascript em outras paginas, o conceito básico é:

1) escreva um código


message="http://maps.google.com/maps?saddr=Current+Location&daddr=";
coord = window.prompt("Entre: Lat, lon");
function sendMessage(message) {
    InputEvent = Event || InputEvent;
    var evt = new InputEvent('input', {
        bubbles: true
    });
    var input = document.querySelector("div.input");
    input.innerHTML = message;
    input.dispatchEvent(evt);
    document.querySelector(".btn-icon").click();
}
if (coord != null) {
    message=message+coord
    sendMessage(message);
}

2) Reduza ao máximo


Como vou salvar na barra de favoritos o legal é minificar:
https://jscompress.com/

3) Acione a chamada

Então coloque o código dentro do seguinte texto:
javascript:(function(){blablabla})();
javascript:void(blablabla)


Resultado:

javascript:(function(){function sendMessage(a){InputEvent=Event||InputEvent;var b=new InputEvent("input",{bubbles:!0}),c=document.querySelector("div.input");c.innerHTML=a,c.dispatchEvent(b),document.querySelector(".btn-icon").click()}message="http://maps.google.com/maps?saddr=Current+Location&daddr=",coord=window.prompt("Entre: Lat, Lon"),null!=coord&&(message+=coord,sendMessage(message));})();