Monitorando ligações SIP – VoIP com tcpdump do Linux
Todos os profissionais que trabalham com VoIP sabem muito bem como são importantes as ferramentas para monitoramento das ligações, para a identificação e solução de problemas em geral, principalmente aquelas que capturam e nos mostram tudo o que está ocorrendo de verdade. Uma dessas ferramentas é o tcpdump.
Uma das ferramentas mais antigas do Linux, criada nos primórdios, muito simples e primitiva, porém uma das melhores para profissionais que entendem a função dos protocolos. O tcpdump tem a função de capturar todos os pacotes trafegados na rede, abrindo-os por completo se necessário, nos mostrando tudo que está passando por ali. Com ele é possível identificar cada fase de uma comunicação SIP como INVITE, ACK, BYE e CANCEL, tendo todo o protocolo aberto e esmiuçado em tempo real.
Com autorização judicial é possível inclusive interceptar essa chamada, gravar o áudio e gerar uma prova pericial judicial, que anexada aos autos tornar-se-á válida.
Veja o exemplo de como monitorar chamadas VoIP SIP em um servidor asterisk por exemplo:
tcpdump -nqt -s 0 -A -i eth0 port 5060
Alguns possíveis resultados são esses abaixo:
Esse é o método INVITE (convite) de uma chamada VoIP SIP, ocorre quando o originado disca para um destino e espera o tom de chamada (ring). Perceba que o originador é o número 7799813xxxx e o destiono é o número 08000xx3100. OBS: Alguns dados serão suprimidos para não comprometer os alvos da busca.
IP 10.1.0.2.5060 > 186.xxx.176.x.5060: UDP, length 693
E…4…@…
…… ……..INVITE sip:08000xx3100@186.xxx.176.x SIP/2.0
Via: SIP/2.0/UDP 10.1.0.2:5060;branch=z9hG4bK4232e5a4;rport
From: “7799813xxxx” sip:7799813xxxx@10.1.0.2 ;tag=as2d0b9142
To: sip:08000xx3100@186.xxx.176.x
Contact: sip:7799813xxxx@10.1.0.2
Call-ID: 5a2dc84e790a5ac72b131a8c51e8c2f3@10.1.0.2
CSeq: 102 INVITE
User-Agent: Asterisk PBX
Max-Forwards: 70
Date: Fri, 05 Jun 2020 15:00:28 GMT
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY
Content-Type: application/sdp
Content-Length: 176
v=0
o=root 18556 18556 IN IP4 10.1.0.2
s=session
c=IN IP4 10.1.0.2
t=0 0
m=audio 15506 RTP/AVP 8 0
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=silenceSupp:off – – – –
Esse é método TRING (tentando), significa que o servidor asterisk identificou o destino e está tentando fazer contato.
IP 186.xxx.176.x.5060 > 10.1.0.2.5060: UDP, length 492
E…b…?……
………..SIP/2.0 100 Trying
Via: SIP/2.0/UDP 10.1.0.2:5060;branch=z9hG4bK4232e5a4;received=186.xxx.176.x;rport=12721
From: “7799813xxxx” sip:7799813xxxx@10.1.0.2;tag=as2d0b9142
To: sip:08000xx3100@186.xxx.176.x
Call-ID: 5a2dc84e790a5ac72b131a8c51e8c2f3@10.1.0.2
CSeq: 102 INVITE
Server: PBX – LISpbx 3
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Contact:
Content-Length: 0
Esse método OK (pronto), significa que o destino recebeu o INVITE e respondeu que o ramal está pronto para tocar, isto é, não está em uso e começará a tocar (ring).
IP 186.xxx.176.x.5060 > 10.1.0.2.5060: UDP, length 720
E…b…?..)…
………0.SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.1.0.2:5060;branch=z9hG4bK4232e5a4;received=186.227.176.7;rport=12721
From: “7799813xxxx” sip:7799813xxxx@10.1.0.2;tag=as2d0b9142
To: sip:08000xx3100@186.xxx.176.x; ;tag=as6614a790
Call-ID: 5a2dc84e790a5ac72b131a8c51e8c2f3@10.1.0.2
CSeq: 102 INVITE
Server: PBX – LISpbx 3
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Contact:
Content-Type: application/sdp
Content-Length: 184
v=0
o=root 501293801 501293801 IN IP4 186.xxx.176.x
s=Asterisk PBX 13.10.0
c=IN IP4 186.227.176.9
t=0 0
m=audio 13556 RTP/AVP 8
a=rtpmap:8 PCMA/8000
a=maxptime:150
a=sendrecv
O método ACK (aceite), significa que o destinatário atendeu a chamada e iniciou o transporte da mídia, isto é, iniciou a comunicação do audio (conversa).
IP 10.1.0.2.5060 > 186.xxx.176.x.5060: UDP, length 393
E…4…@…
…… ……..ACK sip:08000xx3100@186.xxx.176.x:5060 SIP/2.0
Via: SIP/2.0/UDP 10.1.0.2:5060;branch=z9hG4bK6666ffd9;rport
From: “7799813xxxx” sip:7799813xxxx@10.1.0.2;tag=as2d0b9142
To: sip:08000xx3100@186.xxx.176.x; ;tag=as6614a790
Contact: sip:7799813xxxx@10.1.0.2
Call-ID: 5a2dc84e790a5ac72b131a8c51e8c2f3@10.1.0.2
CSeq: 102 ACK
User-Agent: Asterisk PBX
Max-Forwards: 70
Content-Length: 0
O método BYE (tchau), significa que alguém desligou a chamada, isto é, a ligação acabou e o ramal VoIP avisou para o outro encerrar a transmissão. Nesse caso é possível descobrir quem desligou, pois o BYE veio do 08000xx3100, portanto foi o destino que desligou primeiro.
IP 10.1.0.2.5060 > 186.xxx.176.x.5060: UDP, length 358
E…5]..@…
…… …..n..BYE sip:08000xx3100@186.xxx.176.x:5060 SIP/2.0
Via: SIP/2.0/UDP 10.1.0.2:5060;branch=z9hG4bK3a2e0156;rport
From: sip:08000xx3100@186.xxx.176.x; ;tag=as6614a790
To: sip:7799813xxxx@10.1.0.2;tag=as54cbfecc
Call-ID: 72b40f010fb1c39c7cf19ac540207656@186.xxx.176.x
CSeq: 103 BYE
User-Agent: Asterisk PBX
Max-Forwards: 70
Content-Length: 0
O método Not Found (não encontrado), significa que o destino não foi encontrado, talvez não autenticou ou perdeu conexão temporariamente, etc.
10.1.0.1.5060 > 10.1.0.2.5060: [udp sum ok] SIP, length: 381
SIP/2.0 404 Not Found
Via: SIP/2.0/UDP 10.1.0.2:5060;branch=z9hG4bK395b3143;rport=5060
From: “112313xxxx” sip:112313xxxx@10.1.0.2;tag=as7ef79cbd
To: sip:773639xxxx@10.1.0.1;tag=as2685bf88
Call-ID: 6b82a21e07b28a8049f8b0917463193d@10.1.0.2
CSeq: 102 INVITE
User-Agent: Asterisk PBX
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY
Content-Length: 0
O método Request Timeout (requisição expirada), significa que o servidor asterisk ficou tentando contato com o destino, mas ninguém atendeu até o tempo estimado de expiração, que é configurável.
13:18:40.679886 IP (tos 0x10, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 415)
10.1.0.1.5060 > 10.1.0.2.5060: [udp sum ok] SIP, length: 387
SIP/2.0 408 Request Timeout
Via: SIP/2.0/UDP 10.1.0.2:5060;branch=z9hG4bK1fb270ed;rport=5060
From: “112313xxxx” sip:112313xxxx@10.1.0.2;tag=as7ef79cbd
To: sip:773639xxxx@10.1.0.1;tag=as2685bf88
Call-ID: 618424403cbe22ee67c9c7f73b8e92e8@10.1.0.2
CSeq: 102 INVITE
User-Agent: Asterisk PBX
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY
Content-Length: 0
Agora se você quer abrir mais ainda o protocolo e ter as informações completas, basta manipular a variável verbose (verboso), representado pelo atribudo “-vvv” veja o exemplo do comando para liberar ao máximo as informações.
tcpdump -nvvv -s 65535 -A -i eth0 port 5060
Abaixo é possível ver um resultado de um verbose de um Tring, que é o servidor asterisk tentando fazer contato com algum ramal SIP.
13:10:45.211063 IP (tos 0x10, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 562)
10.1.0.1.5060 > 10.1.0.2.5060: [udp sum ok] SIP, length: 534
SIP/2.0 100 trying — your call is important to us
Via: SIP/2.0/UDP 10.1.0.2:5060;branch=z9hG4bK7d84c8fb;rport=5060
From: “183519xxxx” sip: 183519xxxx @10.1.0.2;tag=as016b315a
To: sip:773639xxxx@10.1.0.1
Call-ID: 009888fa29fcb5751f30549f46836023@10.1.0.2
CSeq: 102 INVITE
Server: Sip EXpress router (0.9.6 (i386/linux))
Content-Length: 0
Warning: 392 10.1.0.1:5060 “Noisy feedback tells: pid=6663 req_src_ip=10.1.0.2 req_src_port=5060 in_uri=sip:773639xxxx@10.1.0.1 out_uri=sip:773639xxxx@186.xxx.176.x:5060 via_cnt==1”
0x0000: 5349 502f 322e 3020 3130 3020 7472 7969
0x0010: 6e67 202d 2d20 796f 7572 2063 616c 6c20
0x0020: 6973 2069 6d70 6f72 7461 6e74 2074 6f20
0x0030: 7573 0d0a 5669 613a 2053 4950 2f32 2e30
0x0040: 2f55 4450 2031 302e 312e 302e 323a 3530
0x0050: 3630 3b62 7261 6e63 683d 7a39 6847 3462
0x0060: 4b37 6438 3463 3866 623b 7270 6f72 743d
0x0070: 3530 3630 0d0a 4672 6f6d 3a20 2231 3833
0x0080: 3531 3939 3230 3022 203c 7369 703a 3138
0x0090: 3335 3139 3932 3030 4031 302e 312e 302e
0x00a0: 323e 3b74 6167 3d61 7330 3136 6233 3135
0x00b0: 610d 0a54 6f3a 203c 7369 703a 3737 3336
0x00c0: 3339 3331 3330 4031 302e 312e 302e 313e
0x00d0: 0d0a 4361 6c6c 2d49 443a 2030 3039 3838
0x00e0: 3866 6132 3966 6362 3537 3531 6633 3035
0x00f0: 3439 6634 3638 3336 3032 3340 3130 2e31
0x0100: 2e30 2e32 0d0a 4353 6571 3a20 3130 3220
0x0110: 494e 5649 5445 0d0a 5365 7276 6572 3a20
0x0120: 5369 7020 4558 7072 6573 7320 726f 7574
0x0130: 6572 2028 302e 392e 3620 2869 3338 362f
0x0140: 6c69 6e75 7829 290d 0a43 6f6e 7465 6e74
0x0150: 2d4c 656e 6774 683a 2030 0d0a 5761 726e
0x0160: 696e 673a 2033 3932 2031 302e 312e 302e
0x0170: 313a 3530 3630 2022 4e6f 6973 7920 6665
0x0180: 6564 6261 636b 2074 656c 6c73 3a20 2070
0x0190: 6964 3d36 3636 3320 7265 715f 7372 635f
0x01a0: 6970 3d31 302e 312e 302e 3220 7265 715f
0x01b0: 7372 635f 706f 7274 3d35 3036 3020 696e
0x01c0: 5f75 7269 3d73 6970 3a37 3733 3633 3933
0x01d0: 3133 3040 3130 2e31 2e30 2e31 206f 7574
0x01e0: 5f75 7269 3d73 6970 3a37 3733 3633 3933
0x01f0: 3133 3040 3138 362e 3232 372e 3137 362e
0x0200: 383a 3530 3630 2076 6961 5f63 6e74 3d3d
0x0210: 3122 0d0a 0d0a
E..2..@.@.$.
…
………A.SIP/2.0 100 trying — your call is important to us
Via: SIP/2.0/UDP 10.1.0.2:5060;branch=z9hG4bK7d84c8fb;rport=5060
From: “183519xxxx” sip: 183519xxxx @10.1.0.2;tag=as016b315a
To: sip:773639xxxx@10.1.0.1
Call-ID: 009888fa29fcb5751f30549f46836023@10.1.0.2
CSeq: 102 INVITE
Server: Sip EXpress router (0.9.6 (i386/linux))
Content-Length: 0
Warning: 392 10.1.0.1:5060 “Noisy feedback tells: pid=6663 req_src_ip=10.1.0.2 req_src_port=5060 in_uri=sip:773639xxxx@10.1.0.1 out_uri=sip:773639xxxx@186.xxx.176.x:5060 via_cnt==1”