Kodėl SIP skambutis registruojasi per VPN, bet nesiunčia garso
Registracija ir garsas eina skirtingais keliais. Sekite vieną skambutį per tunelį ir pamatykite, kokius adresus gali naudoti PBX ir kur RTP iš tikrųjų sustoja.
Sėkminga registracija beveik nieko nepasako apie garsą. Programinis telefonas gali valandų valandas palaikyti galiojančią sąsają su biuro PBX ir vis tiek perduoti tylą. Tunelis neša tik tuos paketus, kuriuos kas nors sąmoningai į jį siunčia, o skambutis naudoja tris atskirus kelius: susiejimą, dialogo nustatymą ir RTP srautą. Kai juos atskiriate, gedimas tenka vienam keliui, o ne žodžiui VPN.
Įsivaizduokite nešiojamąjį kompiuterį namų Wi-Fi tinkle, kuris per patvirtintą tunelį renka biuro vidinį numerį. PBX autentifikuoja naudotoją, priima REGISTER, o vidinis numeris rodomas kaip pasiekiamas, vis dėlto skambutis prisijungia visiška tyla viena kryptimi.
Registracija susieja kontaktą, o ne medijos kelią
REGISTER užklausa prašo registratoriaus išsaugoti atitikmenį tarp įrašo adreso ir vieno ar daugiau kontakto URI. Tas atitikmuo atsako į siaurą klausimą, kur dabar reikia siųsti naują dialogą. Jis nieko nesako apie tai, kur priklauso medija, ir priimta registracija neįrodo, kad vėlesnis INVITE neša pasiekiamą medijos adresą. Registracijos taip pat baigiasi pagal laikmatį, todėl telefonas, kuris nustoja atnaujinti, praranda gaunamus skambučius, nors jo tunelis dar atrodo sveikas. Stebėkite kontakto galiojimo pabaigą, o ne tunelio būseną.
Kai programinis telefonas yra už tunelio, kontakto antraštė gali nešti privatų adresą. PBX, kuris persiunčia jį kitam galiniam taškui, sukuria dialogą, nukreiptą į tinklą, kurio kviečiamasis negali pasiekti. Nustačius rewrite_contact=yes PJSIP galiniame taške, PBX pakeičia stebėtą šaltinio adresą, ir tai dažnai yra skirtumas tarp skambučio ir laukimo pabaigos.
Ką siūlo INVITE ir kas gali juo naudotis
INVITE su SDP turiniu siūlo, kur skambinantysis nori gauti mediją: adresą, prievadą ir kodekų sąrašą. Kviečiamasis atsako savo adresu ir prievadu, o tada kiekviena pusė siunčia RTP į tai, ką pasiūlė kita. Jei skambinantysis pasiūlė 192.168.x.x adresą, kuris egzistuoja tik jo namų tinkle, kviečiamasis neturi kur siųsti garso, kad ir kokia švari buvo signalizacija. Maskavimas perrašo IP antraštes, kai paketai palieka maršrutizatorių, bet niekada neperrašo teksto SDP turinio viduje.
Šis atotrūkis paaiškina klasikinį vienkryptį skambutį: signalizacija veikia, nes abu galiniai taškai pasiekia PBX, o garsas nepavyksta, nes vienam galiniam taškui buvo liepta siųsti į adresą, kuris egzistuoja tik už kito NAT.
| Path | Who picks the address | Typical failure |
|---|---|---|
| REGISTER | Softphone, rewritten by the registrar if configured | Binding expires or points at a private address |
| INVITE and SDP | Each endpoint in its own offer or answer | Offer names a media address nobody can route to |
| RTP | PBX relay policy or the two endpoints | Port range blocked, or no return path |
Kas neša garsą, yra konfigūracijos pasirinkimas
Signalizacija ir medija yra atskiri vaidmenys. Tarpinis serveris gali visą skambutį likti signalizacijos kelyje ir niekada nepalies nė vieno RTP paketo. Ar PBX taps medijos rele, priklauso nuo konfigūracijos, o ne nuo tunelio buvimo.
Esant tiesioginei medijai, galiniai taškai patys keičiasi RTP, o tai gerai veikia viename LAN ir blogai, kai viena pusė yra už siauro prievadų diapazono.
Nustačius direct_media=no, PBX įstumiamas į medijos kelią, kad abi kojos baigtųsi jo valdomame adrese, mainais už numatomą adresavimą atsisakant pralaidumo ir procesoriaus. Kai jis releina, PBX vis tiek turi skelbti pasiekiamą adresą. Daugiainio tinklo pagrindiniame kompiuteryje external_media_address ir external_signaling_address faile pjsip.conf lemia, kas rodoma SDP ir Via antraštėse. Palikite juos nenustatytus, ir PBX gali pasiūlyti savo LAN adresą skambinančiajam, kurio vienintelis kelias yra tolimoji tunelio pusė.
Sekite kiekvieną kryptį prieš liesdami nustatymus
Pradėkite nuo PBX lizdų lentelės, kol skambutis aktyvus: ss -uanp | grep -E '5060|10000' parodo, ar RTP prievadai susieti ir kokį vietinį adresą jie naudoja. Jei medijos diapazone niekas nesusieta, relė neįjungta ir galiniai taškai kalba tiesiogiai. Tada fiksuokite programinio telefono pusėje su tcpdump -ni any -s0 udp portrange 10000-20000 -w rtp.pcap. Išeinantys paketai be įeinančių paketų susiaurina problemą iki grįžimo kelio arba adreso, kurį tolimajai pusei buvo liepta naudoti, o tuščias įrašas reiškia, kad medija apskritai nepasiekė tunelio sąsajos. Signalizacijos įrašas su sngrep atsako į kitą pusę parodydamas SDP ryšio eilutę tokią, kokia buvo išsiųsta.
Palyginkite adresą toje ryšio eilutėje su adresu, į kurį tolimoji pusė iš tikrųjų gali maršrutizuoti. Šis vienas palyginimas išsprendžia daugumą vienkrypčio garso ataskaitų greičiau nei bet kokia konfigūracijos apžvalga.
Šifravimas sustoja ties tunelio kraštu
SIP per TLS apsaugo signalizacijos šuolį, kuriam buvo sukonfigūruotas, SRTP apsaugo mediją, kai abi pusės dėl to susitaria, o tunelis apsaugo srautą tarp savo galinių taškų. Nė vienas iš jų nesuteikia kitų. Skambutis, užšifruotas tunelio viduje, gali palikti tinklų sietuvą atviru tekstu link PBX, ir tai yra dizaino sprendimas, o ne defektas.
Prieš uždarydami bilietą, patvirtinkite tris dalykus iš eilės: registracija yra nauja, SDP neša adresą, kurį tolimoji pusė gali pasiekti, ir paketai teka abiem kryptimis medijos prievadais. Jei kuris nors iš jų neteisingas, tunelis nėra problemos vieta. Pataisykite nepavykusį kelią, tada pakartokite tą patį įrašą, kad patvirtintumėte pakeitimą. Įrašų prieš ir po išsaugojimas paverčia kitą vienkrypčio garso ataskaitą penkių minučių patikra, o ne visu puse dienos.