Monitorando ligações SIP – VoIP com tcpdump do Linux

Foto da Matthew Henry do Burst

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”