SIP - WEBRTC GATEWAY

Úkol

Realize a translation between SIP and WebRTC using Asterisk.


Co je to vlastně SIP a webRTC 

SIP

Definice

SIP je z angličtiny zkratka pro Session Initiation Protocol, v češtině protokol pro inicializaci. Je to internetový protokol určený pro přenos signalizace v internetové telefoniii.

K čemu slouží, co dělá

Pro vytvoření a řízení multimediální relace musí SIP zajistit následujících pět činností:

  • Lokalizace účastníka - nalezení spojení s koncovou stanicí
  • Zjištění stavu účastníka - zjištění, jestli je účastník schopen relaci navázat (může mít obsazeno, přesměrováno atd.)
  • Zjištění možností účastníka - zjištění, jaké jsou možnosti účastníka (typ kodeku, max. přenosová rychlost, audio/video atd.)
  • Vlastní navázání spojení - zde vstupuje do hry také protokol SDP, který popisuje navázané spojení a odkazuje na RTP datový tok
  • Řízení probíhajícího spojení - případné změny vlastností v průběhu relace a činnosti spojené s jejím ukončováním

Metody protokolu

SIP je textově orientovaný protokol a metody (příkazy) se v něm píší velkými písmeny (podle HTTP, ze kterého vyšel). Mezi základní metody protokolu patří:

  • REGISTER - registrace účastníka na SIP Proxy serveru
  • INVITE - zahájení komunikace o plánované nové relaci
  • ACK - potvrzení zahájení relace
  • CANCEL - přerušení zahajovaní relace ještě před jejím navázáním
  • BYE - ukončení probíhající relace
  • OPTIONS - požádá o informace o možnostech vzdálené strany, aniž by se sestavilo volání

WebRTC

Definice

WebRTC je z angličtiny zratka pro Web Real-Time communication, což v češtině znamená Web pro komunikaci v reálném čase. Je to rozhraní, jenž poskytuje podporu pro telefonní hovory, video konference a peer-to-peer sdílení souborů, které lze spustit ve webovém prohlížeči bez jakýchkoli zásuvných modulů.

Kde lze použít WebRTC, kde je podporován

WebRTC podporují následující prohlížeče:

  • Tradiční osobní počítače
    • Google Chrome 23
    • Mozilla Firefox 22
    • Opera 18
  • Android
    • Google Chrome 28 (implicitně povoleno od verze 29)
    • Mozilla Firefox 24
    • Opera Mobile 12
  • Google Chrome OS
  • Firefox OS

Problematika

Abychom byli schopni vytvořit komunikaci mezi SIP účastníkem a WebRTC, je třeba je řádně na definovat a v následujících krocích si řekneme nějaký návrh řešení zadané problematiky, tedy nějakou topologii a následně si ukážeme praktický popis řešení.  

Topologie

Jak to dle topologie funguje

WebRTC-SIP gateway převede mezi sebou sadu protokolů WebRTC, a to: websocket (Ws/Wss) pro signalizaci, dále TURN/STUN/RTP kanditaty na ICE a DTLS/SRTP media. 

Co se týká SIP protokolů, tak ty jsou následující: SIP signalizace probíhá přes UDP/TCP, RTP/RTCP protokoly, slouží pro média a podporu různých rozšíření protokolu SIP. 

A v neposlední řadě MRTC (Mizutech WebRTC do SIP gatewaye). Je to takzvané řešení vše v jednom pro konverzi mezi protokoly WebRTC/SIP se všemi vestavěnými moduly, které zahrnují konektivitu a síťová nastavené pro uživatele. 

A jakmile se dostane informace až do posledního bodu, tak je to účastník na nějakém software sloužící pro VoIP, v našem případě jsme použili linphone.


Popis praktického řešení

Nejdříve bylo potřeba si zvolit virtuální platformu, kde se bude projekt realizovat. Zvolil jsem si VirtualBox a na něj nainstaloval Linux OS, konkrétně Ubuntu. 

Následoval první praktický krok, a to instalace Asterisku. Asterisk byl nainstalován následovně. 

Nejdříve bylo třeba stáhnout Asterisk

wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-17-current.tar.gz

Dále jej otevřít

tar -xvf asterisk-17-current.tar.gz

cd asterisk-17.7.0/

A aktualizovat

apt-get update

./contrib/scripts/install_prereq install

Následovala konfigurace, kompilace a instalace Asterisku

./configure

make -j4

make install

make config

make samples


Registrace SIP a WebRTC klienta

Použil jsem jednoduchou konfiguraci bez šifrování

sudo nano /etc/asterisk/pjsip.conf

[simpletrans]

type=transport

protocol=udp

bind=0.0.0.0

[2000]

type = endpoint

context = internal

disallow = all

allow = ulaw

aors = 2000

auth = auth2000

[2000]

type = aor

max_contacts = 1

[auth2000]

type=auth

auth_type=userpass

password=1234

username=2000

[2001]

type = endpoint

context = internal

disallow = all

allow = ulaw

aors = 2001

auth = auth2001

[2001]

type = aor

max_contacts = 1

[auth2001]

type=auth

auth_type=userpass

password=1234

username=2001

Následoval správně nakonfigurovaný diaplán v extensions.conf

sudo nano /etc/asterisk/extensions. conf 

exten => _200X,1,Dial(SIP/${EXTEN}) 

Dalším nezbytným krokem bylo třeba nakonfigurovat http.conf

sudo nano /etc/asterisk/http.conf

[general]
enabled=yes
bindaddr=0.0.0.0
bindport=8088
tlsenable=yes
tlsbindaddr=0.0.0.0:8089
tlscertfile=cesta k asterisk.pem
tlscipher=AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA
tlsdontverifyserver=yes

Aby nám správně fungovalo WebRTC, bylo třeba ještě nakonfigurovat sipML5

Zde je ukázka registrace a následně Expert modu

Je třeba podotknout, že nelze realizovat registraci, bez řádného importování ceritifikátu. 

$ sudo mkdir /etc/asterisk/keys

$ sudo contrib/scripts/ast_tls_cert -C 192.168.0.180 -O "My Organization" -b 2048 -d /etc/asterisk/keys 

Tyto příkazy nám vypsaly následovné


Práva složky je možno zobrazit příkazem:

ls -la /etc/asterisk/keys

Jak je uvedeno ve screenshotu výše

Teď máme vygenerovány potřebné certifikáty, avšak stále v tomto kroku nelze importovat certifikát ca.crt do prohlížeče, a to konkrétně FireFox. Je třeba být jako uživatel v rootu. Jelikož tato problematika zabrala samotná několik hodin, tak bych to osobně nedoporučoval. Tak to mi původně Firefox odepíral možnost vložení certifikátu. 


Ale abych certifikát vložit mohl, bylo třeba pouze změnit práva, a to následujícím příkazem: 

chmod 666 /* 

Jak je patrné ze screenshotu výše, práva byla změněna. 


Po tomto kroku už bude možno importovat certifikát a u registrace sipML5 se objeví po LogInu "Connected".  (nezapomenou screenshoty z linkphone a změny na SMRTS)

Abych ověřil, zda tam certifikát opravdu je, pokusil jsem se ho importovat znovu.


Použití SIP klienta v linphone

Aby byl hovor úspěšné spojen, bylo třeba správně nastavit SIP klienta. A to následovně:

Bylo třeba zvolit preferované spojení TLS a šifrování na SRTP v záložce preferences > Calls and Chat

Dalším krokem už stačilo zavolat z prohlížeče na SIP účet, jenž byl aplikován v linphone, spustit software Wireshark a zachytit provoz mezi klienty a ústřednou s cílem popsat jednotlivé protokoly a průběh komunikace.

Jelikož je třeba spustit Wireshark jako admin, abychom mohli sledovat provoz, je třeba použít tento příkaz:

sudo Wireshark

Spustíme-li Wireshark a spustíme zachycení na Ethernetu, v mém případě enp0s3

Následně se zobrazí všechny pakety a jejich protokoly

Vyfiltrovali se pouze dva SIP pakety

A jakmile se uskuteční hovor, bude vidět, jaké veškeré pakety se v hovoru přemístili. Po vypsaní všech paketů je třeba vlevo nahoře zastavit top a následně analyzovat protokoly.

Na výpis hovorů je také možno se podívat v záložce Telephony > SIP Flows


Závěr

Řešení trvalo déle, než jsem předpokládal. Na cestě za úspěšným propojení obou klientů se vyskytlo obrovské množství chyb, ale ty byly po x-hodinách zkoumání, hledání chyb následného řešení, pokaždé vyřešena. Osobně mi tento projekt dal více zkušeností s prací s Linux OS, než jsem doposud získal za celé studium. Protokoly, jež byly zachyceny při komunikaci, jsou SDP, SIP a RTP. Jelikož se ve výsledku nepodařilo spojit účastníky, výsledky jsou pouze transparentní. Veškeré konfigurace jsou správné, možná chyba mohla být čistě teoreticky ve virtuálu.

© 2020 Bc. Daniel Križan. Všechna práva vyhrazena.
Vytvořeno službou Webnode
Vytvořte si webové stránky zdarma! Tento web je vytvořený pomocí Webnode. Vytvořte si vlastní stránky zdarma ještě dnes! Vytvořit stránky