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));})();

quinta-feira, 17 de dezembro de 2015

WhatsApp bloqueado e agora?

WhatsApp bloqueado e agora?
Antes de continuar, vamos lembrar que isso era apenas por 48 horas (iniciando dia 17/12/2015 as 00:00), e já foi suspenso.
A decisão judicial foi porque o WhatsApp não atendeu à solicitação de entregar informações sobre um crime de pedofilia.
Impossibilidade de cumprir a ordem, ou desprezo a justiça brasileira? Não sei a resposta, minha opinião pessoal, sem conhecer os fatos, é que foi desprezo.
Apesar das operadoras, realmente, estarem apavoradas com o tipo de serviço prestado pelo WhatsApp, elas não são as responsáveis.
Até onde li, somente a Oi entrou com pedido pra não precisar cumprir a ordem. As Operadoras não estão achando ruim o resultado da ordem judicial.
Mas importante é saber que não foram as operadoras, o problema é a não cooperação em resolver um crime de pedofilia.
Aqui eu pretendo apresentar 2 soluções para nos comunicarmos, vou apresentar argumentos pra que você tome sua decisão.
Se você acha que ignorar a ordem judicial é errado, a solução é usar outro serviço. Vamos todos juntos escolher outro aplicativo pra usar e vamos continuar com ele depois das 48horas.
Eu vou sugerir o Telegram, por que eu já tenho a bandeira do software livre e o Telegram esta alinhado comigo nesta.
Eu vou sugerir o Telegram, por que ele oferece condições de integrar  os meus sistemas com os dele,  através do que é conhecido como API.
Empresas como a Jovem Pan tiveram de escolher outro aplicativo, devido a impossibilidade de integração e interesses comerciais.
Hoje foi dado um passo muito perigoso, pois foi feito o bloqueio a um serviço de internet. Isto é censura, como ocorre na China, por exemplo.
Por esse motivo do bloqueio, eu vou sugerir que você use um serviço de VPN.

O que é VPN (Virtual Private Network)? De forma simples: você pega todos os dados que saem do seu celular, entrega pra um servidor, que esta liberado e fora do país e esse servidor manda seus dados pra onde eles iriam inicialmente.
Ótimo, mas quem é o responsável por esse servidor? Será que ele vai cuidar do seu sigilo?
O que eles podem saber?
Eles conseguem saber o o volume de dados é para quem de dados foram enviados. Se não acessarmos páginas HTTPS, somente HTTP e outros serviços não protegidos, até o que foi enviado (o texto, a foto)  eles podem pegar e guardar. 
Mas sua invasão de privacidade não acaba aqui.Para usar o VPN, de forma simples, você vai instalar um aplicativo no seu celular. Eu testei um que está sendo muito divulgado hoje.
Ele pediu acesso:
- a todos os arquivos, incluindo as fotos e videos do meu celular;
- pediu pra saber quais outros aplicativos estão rodando no meu celular.
Eles precisam ganhar pra manter o serviço gratuito e então também mandaram muita propaganda.

OK, agora temos duas soluções e sabemos os riscos de usar uma VPN, o que você vai fazer?
https://play.google.com/store/apps/details?id=org.telegram.messenger

sexta-feira, 5 de setembro de 2014

Zycoo com rota de menor custo

O PABX Zycoo especialmente o ZX20 possui um shell (ash) muito limitado.
Então para fazer a consulta tive que fazer todo o AGI.

O que eu fiz está no GitHub:
https://github.com/eduardomazolini/Zycoo-TeleIn

O arquivo extension_general.conf que não é alterado automaticamente portanto é um bom ponto para efetuar alterações.
Na macro macro-trunkdial-failover faço o seguinte:
 - verifico se a rota a primeira rota (variável ARG1) é o meu tronco MAGICO.
 - ajusto o telefone para colocar o DDD sem o 0
 - Aciono o TeleIn.agi.
 - Substituo a variável Substituo o ARG1 usando a variavél Operadora, retornada pela AGI, que propositadamente é igual as constantes de troncos criadas pelo Zycoo.

Bom proveito!

terça-feira, 11 de março de 2014

QR Call - Direto no Operador

Pessoal, to feliz de dizer que publiquei o meu primeiro app o QR Call.
A versão gratuita vai sair em breve só preciso finalizar a exibição de propagandas, você não paga o anunciante paga.
O preço atual é o menor permitido U$0,99 é que não é possível alterar de gratuito pra pago.
Esse é o primeiro de pelo menos 3 que estou elaborando.

sexta-feira, 14 de fevereiro de 2014

ls -R

Diversas vezes quis gerar uma lista de arquivos com o caminho completo.
Gostei muito da resposta que encontrei no Stackoverflow em http://stackoverflow.com/a/1767559/3310382.

ls -R /path | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }'
Autor: ghostdog74

domingo, 2 de fevereiro de 2014

Mikrotik - Lease Script para adicionar DNS e Queue

No mikrotik o DHCP Server não adiciona o hostname no DNS, melhor dizendo o DNS não tem reconhece a solicitação para publicar um nome.
Bom eu em casa tenho alguns equipamentos com ip fixo, uns fixo no servidor outros por amarração de mac, seja como for eu precisei adicionar os hostnames manualmente no DNS.
Hoje precisei acessar um PC sem ip fixo, pelo nome dns e ai surgiu esse post.
Em uma empresa também surgiu a necessidade de criar uns gráficos de consumo de banda e a função de gráficos de queue me serve perfeitamente, até pela restrição de acesso a informação, já que pode restringir somente ao target visualizar o gráfico.

Para solucionar isso o melhor foi usar a opção de script dentro da configuração do DHCP Server, o campo "lease script".
Quando é registrado um novo host adiciona o hostname com domínio no DNS e cria uma fila.
Quando o registro é removido do lease remove a entrada do DNS e desativa a fila.
Por que desativar a fila? Para não perder o histórico da maquina. Quando o pc volta com outro ip só é atualizado o target.
Se mudar o ip do host vai ter target duplicado? Sim, mas a fila vai estar inativa.
Se o hostname for nulo? Eu checo isso(xx=xx), no caso optei não fazer nada.

O Script está abaixo:



terça-feira, 31 de dezembro de 2013

Lembretes sobre BAT

@echo off
TITLE NAO FECHAR EXECUTANDO
cd /d %~dp0
SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION
start /w notepad.exe
:: Comentario
rem Comentario
timeout /t 10 /nobreak
goto label
echo nao vai executar
:label
call :wait 5
exit /b 0
:wait
ping 127.0.0.1 -n %1
goto :EOF

Gravando prompt com a Raquel

Hoje precisei gravar alguns prompt para um Asterisk e lembrei que o os-x possui a voz da Raquel.
A Raquel é uma das vozes para TTS em português mais antigas, nativa no mac.

Basta abrir um terminal e digitar:

echo 'Um dois três testando' | say -o teste
sox teste.aiff --encoding signed-integer --endian little --bits 16 --channels 1 --rate 8k teste-pcm.wav

Eu sei que o say pode formatar direto, mas não funciona com Asterisk.
O pcm tem que ter 128kbps e neste caso fica com 150kbps, já alaw e ulaw tem que ser raw não wav.
Tem um outro produto que trabalho que precisa do ulaw... ou melhor no Brasil precisa do alaw como wav, neste caso deve funcionar bem não testei.

echo 'Um dois três testando' | say  --data-format=ulaw@8000 -o teste-ulaw.wav
echo 'Um dois três testando' | say  --data-format=alaw@8000 -o teste-alaw.wav
echo 'Um dois três testando' | say  --data-format=I16@8000 -o teste-pcm.wav