quarta-feira, 23 de setembro de 2020

Usando TCPDUMP para disgnósticos do protocolo SIP


TCPdump
é um analisador de pacotes de linha de comando poderoso, que pode ser usado para sniffing/analyzing das mensagens SIP. O TCPdump está pré-instalado em muitas distribuições do Linux ou pode ser instalado diretamente do repositório Debian, Red Hat e seus forks:

# apt-get install tcpdump
ou 
# yum install tcpdump

TCPdump permite gravar o SNIFF em um arquivo ou exibi-lo em tempo real. Seu uso para análise de mensagens do protocolo SIP pode ser parecido com: 

1) Exibir em tempo real em um console
# tcpdump -nqt -s 0 -A -i eth0 port 5060
Onde:
-n não converte o endereço IP em nomes DNS;
-q seja tranquilo, imprime menos informações de saída; 
- não imprime carimbos de data/hora; 
-s captura o número de bytes de um pacote, 0 = opções padrão que é no máximo 65535, ou simplesmente um pacote inteiro; 
-A imprime cada pacote em ASCII; 
-vvv verbose bem alto; 
-i usar a interface para capturar a porta 5060, o tráfego da porta 5060 (origem e destino). 

Exemplo de saída de detecção usando as configurações descritas acima:
IP 158.193.139.51.5060 > 85.248.145.114.28444: UDP, length 252
E.......@......3U..r..o....uOPTIONS sip:85.248.145.114:28444 SIP/2.0
Via: SIP/2.0/UDP 158.193.139.51:5060;branch=0
From: sip:pinger@kamailio.org;tag=532c3365
To: sip:85.248.145.114:28444
Call-ID: 085dfe91-025420f2-2812823@158.193.139.51
CSeq: 1 OPTIONS
Content-Length: 0


IP 85.248.145.114.28444 > 158.193.139.51.5060: UDP, length 455
E.......u.!'U..r...3o.......SIP/2.0 200 OK
Via: SIP/2.0/UDP 158.193.139.51:5060;branch=0
Contact: <sip:192.168.1.103:28444>
To: <sip:85.248.145.114:28444>;tag=771cf100
From: <sip:pinger@kamailio.org>;tag=532c3365
Call-ID: 085dfe91-025420f2-2812823@158.193.139.51
CSeq: 1 OPTIONS
Accept: application/sdp
Accept-Language: en
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
User-Agent: eyeBeam release 1102q stamp 51814
Content-Length: 0
ou deve ser usado com extensões verbosas, que imprimem alguns detalhes do protocolo da camada, como somas de verificação, comprimentos de cabeçalho...
# tcpdump -nqt -s 0 -A -vvv -i eth0 port 5060
2) A segunda opção para usar o TCPdump é capturar os dados e gravá-los em um arquivo PCAP e, em seguida, fazer a pós-análise, usando o WIRESHARK por exemplo.
# tcpdump -nq -s 0 -i eth0 -w /tmp/dump.pcap port 5060
A página inicial da ferramenta tcpdump está localizada aqui:

URL: http://www.tcpdump.org/tcpdump_man.html

Bom tutorial disponível em:
URL: http://danielmiessler.com/study/tcpdump/
Algumas informações que julgo importante, extraída da pagina do manual do TCPdump:
Usage: tcpdump [-aAdDeflLnNOpqRStuUvxX] [-c count] [ -C file_size ]
               [ -E algo:secret ] [ -F file ] [ -i interface ] [ -M secret ]
               [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
               [ -W filecount ] [ -y datalinktype ] [ -Z user ]
               [ expression ]

OPÇÕES: 
-A => Imprima cada pacote (sem seu cabeçalho de nível de link) em ASCII. Útil para capturar páginas da web. 

-B => Defina o tamanho do buffer de captura do sistema operacional como buffer_size. 

-c => Saia após receber pacotes de contagem. 

-C => Antes de gravar um pacote bruto em um savefile, verifique se o arquivo é atualmente maior do que file_size e, se for, feche o savefile atual e abra um novo. Os arquivos salvos após o primeiro arquivo salvo terão o nome especificado com o sinalizador -w, com um número depois dele, começando em 1 e continuando para cima. As unidades de file_size são milhões de bytes (1.000.000 bytes, não 1.048.576 bytes). 

-d => Despeje o código de correspondência de pacote compilado em uma forma legível por humanos para a saída padrão e pare. 

-dd => Despeje o código de correspondência de pacote como um fragmento de programa C. 

-ddd => Despeje o código de correspondência de pacote como números decimais (precedidos por uma contagem). 

-D => Imprima a lista das interfaces de rede disponíveis no sistema e nas quais TCPdump pode capturar pacotes. Para cada interface de rede, um número e um nome de interface, possivelmente seguido por uma descrição de texto da interface, são impressos. O nome da interface ou o número pode ser fornecido ao sinalizador -i para especificar uma interface na qual capturar. Isso pode ser útil em sistemas que não possuem um comando para listá-los (por exemplo, sistemas Windows ou sistemas UNIX sem ifconfig -a ); o número pode ser útil no Windows 2000 e sistemas posteriores, onde o nome da interface é uma string um tanto complexa. O sinalizador -D não será suportado se tcpdump foi construído com uma versão mais antiga de libpcap que não possui a função pcap_findalldevs( ). 

-e => Imprima o cabeçalho de nível de link em cada linha de despejo. 

-E => Use spi @ ipaddr (algo:secret) para descriptografar pacotes IPsec ESP endereçados a addr e que contêm o valor spi do Índice de parâmetro de segurança . Esta combinação pode ser repetida com separação por vírgula ou nova linha. Observe que a configuração do segredo para pacotes IPv4 ESP é suportada no momento. Podem os algoritmos des-cbc, 3des-cbc, blowfish-cbc, rc3-cbc, cast128-cbc ou none (nenhum). O padrão é des-cbc . A capacidade de descriptografar pacotes está presente apenas se TCPdump foi compilado com criptografia habilitada. O segredo é o texto ASCII para a chave secreta ESP. Se precedido por 0x, então um valor hexadecimal será lido. A opção assume RFC2406 ESP, não RFC1827 ESP. A opção é apenas para fins de depuração, e o uso desta opção com uma verdadeira chave secreta é desencorajado. Ao apresentar a chave secreta IPsec na linha de comando, você a torna visível para outras pessoas, via ps(1) e outras ocasiões. Além da sintaxe acima, o nome do arquivo de sintaxe pode ser usado para que o TCPdump leia o arquivo fornecido. O arquivo é aberto ao receber o primeiro pacote ESP, portanto, quaisquer permissões especiais que o TCPdump possa ter recebido já deveriam ter sido desistidas. 

-f => Imprime endereços IPv4 FOREIGN (estrangeiros) numericamente ao invés de simbolicamente (esta opção tem como objetivo contornar sérios danos cerebrais no servidor NIS da Sun - normalmente ele trava para sempre traduzindo números não locais da Internet). O teste para endereços IPv4 FOREIGN (estrangeiros) é feito usando o endereço IPv4 e a máscara de rede da interface na qual a captura está sendo feita. Se esse endereço ou máscara de rede não estiverem disponíveis, ou disponível, seja porque a interface na qual a captura está sendo feita não possui endereço ou máscara de rede ou porque a captura está sendo feita na interface Linux qualquer, que pode capturar em mais de uma interface, Esta opção não irá funcionar corretamente. 

-F => Use o arquivo como entrada para a expressão do filtro. Uma expressão adicional fornecida na linha de comando é ignorada. 

-G => Se especificado, gira o arquivo de despejo especificado com a opção -w a cada rotate_seconds segundos. Os arquivos salvos terão o nome especificado por -w, que deve incluir um formato de hora conforme definido por STRFTIME(3). Se nenhum formato de hora for especificado, cada novo arquivo substituirá o anterior. Se usado em conjunto com a opção -C , os nomes dos arquivos terão a forma de "FILE<COUNT>". 

-i => Ouça na interface . Se não for especificado, o tcpdump procura na lista de interfaces do sistema a interface configurada com a numeração mais baixa (excluindo loopback). Os empates são quebrados ao escolher a primeira correspondência. Em sistemas Linux com kernels 2.2 ou posteriores, um argumento de interface “any” pode ser usado para capturar pacotes de todas as interfaces. Observe que as capturas no dispositivo “qualquer” não serão feitas no modo promíscuo. Se o sinalizador -D for suportado, um número de interface impresso por esse sinalizador pode ser usado como o argumento de interface. 

-I => Coloque a interface em “monitor mode”; isso é compatível apenas com interfaces IEEE 802.11 Wi-Fi e apenas com alguns sistemas operacionais. Observe que, no modo monitor (monitor mode), o adaptador pode se desassociar da rede à qual está associado, de forma que você não poderá usar nenhuma rede sem fio com esse adaptador. Isso pode impedir o acesso a arquivos em um servidor de rede ou a resolução de nomes de host ou endereços de rede, se você estiver capturando no modo monitor e não estiver conectado a outra rede com outro adaptador. Este sinalizador afetará a saída do sinalizador -L. Se -I não for especificado, apenas os tipos de camada de link disponíveis quando não estão no modo monitor serão mostrados; se -I for especificado, apenas os tipos de camada de link disponíveis no modo monitor serão mostrados. 

-K => Não tente verificar as somas de verificação IP, TCP ou UDP . Isso é útil para interfaces que executam alguns ou todos os cálculos de checksum no hardware; caso contrário, todas as somas de verificação TCP de saída serão marcadas como ruins. 

-l => Faça a linha stdout em buffer. Útil se você quiser ver os dados enquanto os captura. Por exemplo:  “tcpdump -l | tee dat "ou" tcpdump -l> dat & tail -f dat". 

-L => Liste os tipos de link de dados conhecidos para a interface, no modo especificado, e saia. A lista de tipos de link de dados conhecidos pode depender do modo especificado; por exemplo, em algumas plataformas, uma interface Wi-Fi pode suportar um conjunto de tipos de link de dados quando não estiver no modo monitor (por exemplo, pode suportar apenas cabeçalhos Ethernet falsos ou pode suportar cabeçalhos 802.11, mas não suportar cabeçalhos 802.11 com informações de rádio) e outro conjunto de tipos de link de dados quando no modo monitor (por exemplo, ele pode suportar cabeçalhos 802.11 ou cabeçalhos 802.11 com informações de rádio, apenas no modo monitor). 

-m => Carregue as definições do módulo SMI MIB do módulo de arquivo . Esta opção pode ser usada várias vezes para carregar vários módulos MIB no TCPdump. 

-M => Use o segredo como um segredo compartilhado para validar os resumos encontrados nos segmentos TCP com a opção TCP-MD5 (RFC 2385), se houver. 

-n => Não converta endereços (ou seja, endereços de host, números de porta, etc.) em nomes.

-N => Não imprima a qualificação de nome de domínio de nomes de host. Por exemplo, se você fornecer este sinalizador, o TCPdump imprimirá “nic” ​​em vez de “nic.ddn.mil”. 

-O => Não execute o otimizador de código de correspondência de pacote. Isso é útil apenas se você suspeitar de um bug no otimizador. 

-p => Não coloque a interface em modo promíscuo. Observe que a interface pode estar em modo promíscuo por algum outro motivo; portanto, "-p" não pode ser usado como uma abreviatura para "ether host {local-hw-addr} ou ether broadcast". 

-q => Saída rápida (silenciosa?). Imprima menos informações de protocolo para que as linhas de saída sejam mais curtas. 

-R => Suponha que os pacotes ESP/AH sejam baseados em especificações antigas (RFC1825 a RFC1829). Se especificado, TCPdump não imprimirá o campo de prevenção de repetição. Como não há campo de versão de protocolo na especificação ESP/AH, TCPdump não pode deduzir a versão do protocolo ESP/AH. 

-r => Lê os pacotes do arquivo (que foi criado com a opção -w). A entrada padrão é usada se o arquivo for “-”. 

-S => Imprime números de sequência TCP absolutos, em vez de relativos. 

-s => Snarf snaplen bytes de dados de cada pacote em vez do padrão de 65535 bytes. Os pacotes truncados devido a um instantâneo limitado são indicados na saída com “[|proto ]”, onde proto é o nome do nível de protocolo no qual o truncamento ocorreu. Observe que tirar instantâneos maiores aumenta a quantidade de tempo que leva para processar os pacotes e, efetivamente, diminui a quantidade de buffer de pacote. Isso pode causar a perda de pacotes. Você deve limitar o snaplen ao menor número que irá capturar as informações de protocolo de seu interesse. Definir snaplen como "0" define para o padrão de 65535, para compatibilidade com versões anteriores mais recentes do TCPdump . 

-T => Força os pacotes selecionados por “expressão” a serem interpretados do tipo especificado. Os tipos atualmente conhecidos são aodv (Ad-hoc On-demand Distance Vector protocol), cnfp (Cisco NetFlow protocol), rpc (Remote Procedure Call), rtp (Real-Time Applications protocol), rtcp (Real-Time Applications control protocol), snmp (Simple Network Management Protocol), tftp (Trivial File Transfer Protocol), vat (Visual Audio Tool) e wb (distributed White Board). 

-t => Não imprima um carimbo de data/hora (TIMESTAMP) em cada linha de despejo. 

-tt => Imprima um carimbo de data/hora (TIMESTAMP) não formatado em cada linha de despejo. 

-ttt => Imprima um delta (resolução de microssegundos) entre a linha atual e a anterior em cada linha de despejo. 

-tttt => Imprime um carimbo de data/hora (TIMESTAMP) no formato padrão seguido por data em cada linha de despejo. 

-ttttt => Imprima um delta (resolução de microssegundos) entre a linha atual e a primeira em cada linha de despejo. 

-u => Imprimir identificadores NFS não decodificados. 

-U => Faça a saída salva através da opção -w “buffer de pacote”; ou seja, à medida que cada pacote é salvo, ele será gravado no arquivo de saída, em vez de ser gravado apenas quando o buffer de saída for preenchido. O sinalizador -U não será suportado se TCPdump foi construído com uma versão mais antiga de libpcap que não possui a função pcap_dump_flush( ).

-v => Ao analisar e imprimir, produza uma saída detalhada (um pouco mais). Por exemplo, o tempo de vida, identificação, comprimento total e opções em um pacote IP são impressos. Também permite verificações de integridade de pacote adicionais, como verificar a soma de verificação do cabeçalho IP e ICMP. Ao gravar em um arquivo com a opção -w, relata, a cada 10 segundos, o número de pacotes capturados. 

-vv => Saída ainda mais detalhada. Por exemplo, campos adicionais são impressos a partir de pacotes de resposta NFS e os pacotes SMB são totalmente decodificados. 

-vvv => Saída ainda mais detalhada. Por exemplo, as opções telnet SB ... SE são impressas por completo. Com -X, as opções de Telnet também são impressas em hexadecimal. 

-w => Grave os pacotes brutos em um arquivo em vez de analisá-los e imprimi-los. Eles podem ser impressos posteriormente com a opção -r. A saída padrão é usada se o arquivo for “-”. Veja pcap-savefile(5) para uma descrição do formato do arquivo. 

-W => Usado em conjunto com a opção -C, isso limitará o número de arquivos criados ao número especificado e começará a sobrescrever os arquivos desde o início, criando assim um buffer 'giratório' (rotating). Além disso, ele nomeará os arquivos com "0s" iniciais suficientes para suportar o número máximo de arquivos, permitindo que sejam classificados corretamente. Usado em conjunto com a opção -G, isso limitará o número de arquivos de despejo girados que são criados, saindo com status 0 ao atingir o limite. Se usado com -C também, o comportamento resultará em arquivos cíclicos por timeslice. 

-x => Ao analisar e imprimir, além de imprimir os cabeçalhos de cada pacote, imprima os dados de cada pacote (menos seu cabeçalho de nível de link) em hexadecimal. O menor de todo o pacote ou bytes snaplen será impresso. Observe que este é o pacote de camada de link inteiro, portanto, para camadas de link que preenchem (por exemplo, Ethernet), os bytes de preenchimento também serão impressos quando o pacote da camada superior for menor do que o preenchimento necessário. 

-xx => Ao analisar e imprimir, além de imprimir os cabeçalhos de cada pacote, imprima os dados de cada pacote, incluindo seu cabeçalho de nível de link, em hexadecimal. 

-X => Ao analisar e imprimir, além de imprimir os cabeçalhos de cada pacote, imprima os dados de cada pacote (menos seu cabeçalho de nível de link) em hexadecimal e ASCII. Isso é muito útil para analisar novos protocolos. 

-XX => Ao analisar e imprimir, além de imprimir os cabeçalhos de cada pacote, imprima os dados de cada pacote, incluindo seu cabeçalho de nível de link, em hexadecimal e ASCII. 

-y => Defina o tipo de link de dados a ser usado durante a captura de pacotes para datalinktype. 

-z => Usado em conjunto com as opções -C ou -G, isso fará com que o TCPdump execute o ”arquivo de comando”, onde o arquivo é o savefile sendo fechado após cada rotação. Por exemplo, especificar -z gzip ou -z bzip2 compactará cada arquivo de salvamento usando gzip ou bzip2. Observe que o TCPdump executará o comando em paralelo à captura, usando a prioridade mais baixa para que isso não atrapalhe o processo de captura. E no caso de você desejar usar um comando que receba sinalizadores ou argumentos diferentes, você sempre pode escrever um script de shell que terá o nome do savefile como o único argumento, faça os arranjos de sinalizadores e argumentos e execute o comando que você deseja. 

-Z => Descarta privilégios (se root) e altera o ID do usuário para usuário e o ID do grupo para o grupo primário de usuários . Esse comportamento também pode ser habilitado por padrão em tempo de compilação. 

expression (expressão) => seleciona quais pacotes serão despejados. Se nenhuma expressão for fornecida, todos os pacotes na rede serão despejados. Caso contrário, apenas os pacotes para os quais a expressão é "verdadeira" serão despejados. Para a sintaxe da expressão , consulte pcap-filter(7). Os argumentos de expressão podem ser passados ​​para TCPdump como um único argumento ou como vários argumentos, o que for mais conveniente. Geralmente, se a expressão contiver metacaracteres Shell, é mais fácil passá-la como um argumento simples entre aspas. Vários argumentos são concatenados com espaços antes de serem analisados. 

Thats All FOLKS! (Isso é tudo, pessoal!)

terça-feira, 1 de setembro de 2020

Fatores que revolucionaram o Voice Over IP

Fonte: Internet wallpaperaccess.com

Como na maioria das disciplinas tecnológicas, a indústria de comunicações de voz está avançando a uma velocidade vertiginosa de tal forma que testemunhamos mudanças dramáticas nos últimos anos que “expulsaram” muitos dos fabricantes de hardware. A grande maioria foi obrigada, com mais ou menos sorte, a reposicionar suas estratégias.

Foi nos últimos anos que o VoIP realmente explodiu. Hoje, analisamos os 3 principais fatores que levaram a essas grandes mudanças:

  • A implantação de redes de banda larga eliminou as barreiras que encontramos para a transmissão de comunicações de voz com garantia de serviço através da rede, o que tem facilitado a incursão das operadoras IP. Podemos afirmar, sem dúvida, que em poucos anos as tecnologias de telefonia sobre pares de cobre (RTB e ISDN) se tornarão residuais.
  • Com o surgimento da nuvem, surgiu um grande número de soluções de painel de controle virtual que os CIOs da maioria das empresas teriam rejeitado de fato apenas alguns anos atrás, mas que são mais exigidas hoje. As soluções de voz na nuvem têm permitido que as pequenas operadoras ofereçam soluções de voz do mais alto nível, independentemente dos fabricantes das centrais PBX IP(Softswitch PBX IP).
  • A consolidação do Asterisk® SCF™ como uma solução de comunicação baseada em padrões abertos, o que permite que sua utilização seja customizada de acordo com as necessidades de cada negócio e para atender a qualquer exigência. O Asterisk® SCF™ com seus 21 anos de história (1999 ~ 2020) e uma comunidade de mais de 86.000 desenvolvedores, conseguiu se posicionar como uma das soluções de comunicação empresarial mais amplamente implementadas, com uma participação de mercado de cerca de 32%.

Vimos fusões espetaculares de fabricantes de equipamentos como Mitel/Aastra/Polycom. Reposicionamento importante de outros fabricantes como Siemens, Alcatel ou Avaya. O surgimento de novos fabricantes que oferecem apenas telefones e dispositivos no padrão do protocolo SIP, que estão ganhando participação no mercado dos sistemas proprietários da maioria dos fabricantes de PBX. A consolidação de novos produtos PBX baseados em software, como 3CX, e a compra do Elastix pela própria 3CX, e o surgimento de diferentes distribuições de software baseado em Asterisk® SCF™.

Outro fator decisivo para o avanço dessas implementações é o rejuvenescimento da cúpula das empresas em favor das novas gerações , o que tem facilitado a evolução das soluções de voz para ambientes mais flexíveis e integrados nos processos empresariais, que eles estão gradualmente incorporando, ambientes completos de comunicações unificadas e com integração de vídeo, presença, chat, etc.

Com todas essas mudanças, as grandes operadoras de telefonia estão abrindo mão de parte de sua fatia de mercado em favor de operadoras IP com um tratamento muito mais próximo , que evoluíram seus serviços nos últimos anos para se adequar às necessidades dos clientes mais exigentes e que oferecem soluções customizadas, atendendo muito melhor as demandas de médias e grandes empresas.