Objavljeno:

Napredno "hekanje" RasPBX

V enem prejšnjih člankov sem opisal kako si s pomočjo aplikacije RasPBX in mini računalnika RaspberryPi postavimo svojo telefonsko centralo, ter kako jo s pomočjo USB modema povežemo v mobilno omrežje. Na to telefonsko centralo nato povežemo več uporabnikov oz. tim. končnih točk (angl. endpoint). To so lahko fizični namizni telefoni ali pa SIP aplikacije na računalniku oziroma mobilnem telefonu. Te naprave se lahko kličejo med seboj, lahko pa tudi kličejo ven (preko mobilnega omrežja), oziroma sprejemajo klice na mobilno številko oz. preko SIM kartice v USB modemu. Po nekaj mesecih uporabe RasPBX sistema in testiranju različnih scenarijev lahko potegnemo nekaj zanimivih zaključkov.

VPN povezava

Testiranje povezave med SIP telefoni in centralo je potekalo na razdalji več kot 1000 km. SIP telefoni so bili v internet povezani preko različnih omrežij - od mobilnih, do žičnih, WiFi, itd. Vse povezave med SIP telefoni in RasPBX centralo so potekale preko VPN povezave. Testirali smo OpenVPN ter Wireguard.

Za dobro delovanje telefonske povezave je seveda potrebna ustrezna pasovna širina in nizka omrežna zakasnitev. Zato je seveda pomembno, da imamo omrežje kar najbolj optimalno nastavljeno.

Testiranje je pokazalo, da se je Wireguard obnesel nekoliko bolje kot OpenVPN. Wireguard je sicer znan kot precej hitra VPN aplikacija, ki porabi le malo dodatnih virov (predvsem pasovne širine in procesorskega časa), in tudi na našem testiranju se je obnesel nekoliko bolje kot OpenVPN. Predvsem se je zelo dobro izkazal na mobilnih telefonih (Android in iPhone), predvsem v smislu stabilnosti delovanja.

V nadaljevanju podajamo nekaj rezultatov testiranj. Testirali smo prenos (preko SSH) 1040MB velike datoteke z naključno generirano vsebino med RasPBX centralo in VoIP telefonom in obratno in sicer preko Wireguard in preko OpenVPN omrežja.

OpenVPN:

  • VoIP telefon -> RasPBX: 1.6MB/s
  • RasPBX -> VoIP telefon: 1.1MB/s

Wireguard:

  • VoIP telefon -> RasPBX: 2.0MB/s
  • RasPBX -> VoIP telefon: 1.2MB/s

Iz podatkov je razvidno, da je prenos podatkov v Wireguard omrežju hitrejši.

Testiranje VoIP telefonije preko VPN omrežja je pokazalo, da vse skupaj na več kot 1000 km razdalji deluje presenetljivo dobro. Še posebej pri uporabi Wireguard omrežja, pa tudi OpenVPN preko TCP povezave in celo VPN z maskirano povezavo (tim. obfuskacija) deluje povsem zadovoljivo. Sprejemanje klicev na stacionarni VoIP telefon, računalnik ter mobilni telefon na različnih omrežjih (WiFi ter mobilni podatki) je delovalo zelo dobro, prav tako je bila večinoma zelo dobra tudi kakovost zvoka.

Aplikacija Zoiper na iPhone

Apple od različice iOS 11 aplikacijam (razen z nekaj izjemami) ne dovoljuje, da so aktivne v ozadju. Aplikacija Zoiper, ki jo uporabljamo za sprejemanje klicev in klicanje preko RasPBX centrale ima zato precej omejeno funkcionalnost. Če namreč iPhone ni aktiven oziroma aplikacija Zoiper ni aktivna (v ospredju), bo Zoiper izgubil povezavo do RasPBX centrale. Klicana številka zato ne bo dosegljiva.

Zoiper je sicer ponudil rešitev, in sicer uporabo potisnih obvestil (angl. push notifications). Ki so seveda plačljiva. Poleg tega pa to deluje samo na telefonskih centralah na javnih omrežjih in ne na telefonskih omrežjih, ki delujejo znotraj VPN omrežja. Razlog je seveda v tem, da za delovanje potisnih obvestil Zoiper strežniki potrebujejo dostop do telefonskega strežnika, kar v primeru, da se le-ta nahaja v internem ali VPN omrežju ni mogoče. Mimogrede, Zoiperjeva uporaba potisnih obvestil je iz tega razloga nekoliko problematična tudi iz stališča varnosti oz. zasebnosti.

A glavna ugotovitev je, da je Zoiper na iPhone napravah uporaben samo za klicanje ven, za sprejemanje klicev pa je Zoiper praktično neuporaben. Če želite uporabljati RasPBX sistem na iPhone telefonu, bo treba RasPBX centralo postaviti na odprti internet (in seveda poskrbeti za TLS šifriranje) ter seči v žep in kupiti aktiviranje Zoiper aplikacije ob dohodnem klicu preko potisnih obvestil.

Druga možnost pa je, da se čim prej znebite iPhona in si kupite telefon, ki vam pušča dovolj svobode, da ga upravljate vi in ne obratno.

Aplikacija Zoiper na Androidu

Problem aktivnosti aplikacij v ozadju je prisoten tudi v operacijskem sistemu Android. Tudi tu Zoiper ponuja rešitev v obliki plačljivih potisnih obvestil, a Android je vseeno precej bolj prilagodljiv (in posledično tudi precej bolj uporaben) operacijski sistem, zato z nekaj triki lahko nastavimo, da bo aplikacija Zoiper stalno delovala v ozadju oziroma da bo stalno povezana na RasPBX strežnik.

Pri tem si lahko pomagamo s spletno stranjo Don’t kill my app!, ki vsebuje namige oziroma navodila za aktiviranje delovanja aplikacij v ozadju za različne Androidne telefone.

Testiranje je pokazalo, da sprejemanje dohodnih klicev na Androidnih telefonih z Zoiper aplikacijo v ozadju deluje zelo dobro.

Uporaba namiznega VoIP telefona

Kot je bilo opisano na RasPBX vodiču, lahko na RasPBX centralo preko VPN priključimo tudi namizni VoIP telefon. Nekateri telefoni imajo vgrajene bolj zmogljive procesorje in tudi podporo za VPN odjemalce, vendar večinoma povezava telefona na centralo preko VPN ni mogoča.

A pomagamo si lahko z vmesno napravo. Na primer z RaspberryPi računalnikom, na katerega priključimo USB omrežni vmesnik, tako da ima dva omrežna vmesnika. Preko prvega (eth0) nato RaspberryPi povežemo na internet (in v VPN), na drugega (eth1) pa priključimo VoIP telefon. RaspberryPi nam tako služi kot vmesnik, oziroma “most” preko katerega VoIP telefon povežemo v VPN omrežje. Nato omrežni promet iz eth1 preusmerimo na VPN (wg0 ali tun0 vmesnik) in telefon se lahko poveže na RasPBX centralo v VPN omrežju. Preprosto, kajne?

Za priklop telefona moramo na RaspberryPi namestiti DHCP strežnik, ki bo telefonu na vmeniku eth1 dodelil IP naslov. V našem primeru smo za DHCP strežnik izbrali isc-dhcp-server.

Postopek nastavitve je približno naslednji. Najprej vmesniku eth1 nastavimo fiksni IP naslov, nato nastavimo posredovanje prometa iz eth1 na VPN, nato pa nastavimo da DHCP strežnik, na tem eth1 vmesniku sprejema DHCP zahtevke in napravam na drugi strani (telefonu) dodeljuje dinamične IP naslove iz ustreznega podomrežja. Nastavimo lahko tudi, da DHCP strežnik telefonu dodeli tim. statični DHCP naslov.

No, zaplete se pri nastavitvah USB omrežnega vmesnika. Operacijski sistem Raspbian temelji na operacijskem sistemu Debian. V Debianu omrežne vmesnike nastavljamo v mapi /etc/network/interfaces.d. Raspbian pa se je od tega nekoliko odmaknil in preferira nastavljanje omrežnih vmesnikov v datoteki /etc/dhcpcd.conf (bodite pozorni na “dhcpcd.conf” - DHCP client).

Raspbian poleg novega načina podpira tudi nastavitve omrežnih vmesnikov na star, Debianov način. Vse lepo in prav, a ta podpora ni popolna. Če bomo uporabili “star” način, bo vse skupaj sicer delovalo, a omrežje na delu, kamor je povezan VoIP telefon se bo obnašalo izredno nenavadno. Telefon bo na nekaj minut izgubljal povezavo (in to ne za kratek čas, pač pa za več minut), mi pa si bomo razbijali glavo kje je težava.

No, rešitev je na srečo enostavna (ko seveda ugotovimo v čem je težava). V datoteko /etc/dhcpcd.conf vpišemo:

interface eth1
static ip_address=192.168.100.1/24
static routers=192.168.100.254
static domain_name_servers=8.8.8.8 1.1.1.1

S tem Raspbianu na njegov “novi način” povemo, da naj na eth1 omrežnem vmesniku nastavi fiksni IP naslov 192.168.100.1.

Nato nastavimo ISC-DHCP strežnik (datoteka /etc/dhcp/dhcpd.conf), kjer povemo iz katerega območja naj DHCP strežnik napravam dodeljuje IP naslove ter za VoIP telefon nastavimo statičen DHCP naslov (npr. ker želimo preko VPN omrežja dostopati do spletnega vmesnika za nastavljanje VoIP telefona).

Nastavimo še IP posredovanje ter pravila omrežnega zidu, na koncu pa še spletni posredniški strežnik za dostop do spletnega vmesnika VoIP telefona preko VPN in stvar je zaključena.

No, skoraj. Izkaže se namreč, da se po ponovnem zagonu RasPBX naprave DHCP strežnik ne zažene sam. Oziroma se, vendar javi napako (No subnet declaration for eth1 (no IPv4 addresses).). Težava je v tem, da se DHCP strežnik zažene preden je aktiven omrežni vmesnik eth1.

Prva, ampak precej grda rešitev težave je, da v crontab dodamo: @reboot sleep 30 && systemctl start isc-dhcp-server. S tem se bo DHCP strežnik 30 sekund po ponovnem zagonu celotnega sistema ponovno zagnal.

Še bolje pa je, če poženemo ukaz systemctl edit isc-dhcp-server.service in vnesemo:

[Service]
ExecStartPre=/bin/sleep 15

S tem bomo dosegli, da bo sistem pred zagonom DHCP strežnika počakal 15 sekund in ga šele nato zagnal. V vmesnem času pa se bo eth1 omrežni vmesnik že postavil. Morda bo pri tem potrebnega nekaj igranja z nastavitvami koliko sekund naj čaka. Sam sem se odločil za 15 sekund (oz. v prvem primeru za 30), lahko pa da je veljavna tudi kakšna druga možnost.

Testiranje je sedaj pokazalo, da namizni VoIP telefon deluje stabilno. Sprejemanje klicev in klicanje preko VPN omrežja na razdalji več kot 1000 km deluje brez večjih težav, zvok med pogovorom je čist in brez prekinitev.

Skupine za dohodne klice

Za dohodne klice iz mobilnega omrežja v RasPBX sistemu lahko nastavimo katera končna točka (SIP aplikacija ali fizični VoIP telefon) bo klice sprejemala.

Seveda se iz različnih razlogov lahko zgodi, da ta končna točka v trenutku, ko v sistem preko GSM modema prihaja dohodni klic, ni dosegljiva.

Ena rešitev je, da na tej končni točki aktiviramo glasovno pošto. Če končna točka ne bo dosegljiva ali določen čas ne bo prevzela klica, se bo aktivirala “telefonska tajnica” in klicatelj bo imel možnost posneti svoje sporočilo, ki bo potem v obliki zvočne datoteke posredovano v naš poštni predal.

Obstaja pa še bolj zanimiva rešitev, in sicer tim. skupine za zvonenje (Ring Groups).

Ideja je preprosta. V RasPBX sistemu nastavimo skupino končnih točk, ki ob dohodnem klicu na GSM modem vse hkrati začnejo zvoniti (razen seveda tiste, ki niso dosegljive). Če ni dosegljiva nobena od njih, ali če dohodni klic v določenem času ni prevzet na nobeni od njih, pa se aktivira “telefonska tajnica”, ki potem zvočno sporočilo klicatelja posreduje v naš poštni predal.

Skupine za zvonenje v RasPBX vključimo preko menija Applications -> Ring Groups.

Najprej nastavimo telefonsko številko in opis skupine. Izbrati moramo seveda takšno številko, ki trenutno ni zasedena (sicer nas sistem opozori, da številka ni na voljo).

Primer:

Ring Group Number: 5000
Group Description: Redirection of incoming GSM calls

Nato nastavimo katere končne točke (RasPBX telefonske številke) bodo članice skupine in bodo torej simultano zvonile ob dohodnem klicu.

Primer:

Extension List: 7000, 1000, 3000

Na koncu nastavimo še čas zvonenja (posamezno zvonenje traja cca. 4 do 5 sekund, če torej nastavimo 25 sekund, to pomeni, da bodo telefoni v skupini zvonili približno petkrat. Zadnja nastavitev določi kaj se zgodi, če v tem času nobena izmed končnih točk ne prevzame klica. V našem primeru bomo nastavili, da se klic posreduje v zvočni predal številke 1000. CF nastavitve (CF - Call Forward) določijo ali naj se upoštevajo preusmeritve klicev, ki so si jih morebiti nastavili uporabniki posameznih končnih točk v skupini.

Primer:

Ring Time: 25 seconds
Ignore CF Settings: YES
Destination if no answer: Voilcemail --> 1000 (Unavailable Message)

Nato za sprejemanje dohodnih klicev v meniju Connectivity -> Inbound Routes nastavimo to skupino (številka 5000):

Set Destination: Ring Groups --> 5000

V našem primeru smo torej v skupino za zvonenje dodali tri telefonske številke (1000, 3000 in 7000) - računalnik (s SIP aplikacijo), mobilni telefon (s SIP aplikacijo) in namizni VoIP telefon. Ob dohodnem klicu začnejo zvoniti vse tri naprave - če so dosegljive. Če klica po 25 sekundah zvonenja ne sprejmemo, se klic preusmeri v predal govorne pošte številke 1000 in posnetek dobimo dostavljen po e-pošti.

Točen čas za RasPBX centrali

Za nastavitev točnega časa Linux sistemi uporabljajo sinhronizacijo s tim. časovnimi strežniki. Aplikacij za sinhronizacijo časa je na voljo kar nekaj, a izkušnje so pokazale, da se je najbolje držati aplikacije timedatectl.

V nadaljevanju podajamo nekaj kratkih navodil kako usposobiti sinhronizacijo časa s časovnimi strežniki na Linux sistemih.

Prvi korak je, da odstranimo vse aplikacije, ki skrbijo za sinhronizacijo s časovnimi strežniki (npr. ntp, ntpdate, itd.) ter pustimo nameščeno samo aplikacijo timedatectl.

Aplikacijo nato “ugasnemo” (timedatectl set-ntp false) ter ročno nastavimo približno točen datum (primer: sudo timedatectl set-time "2022-08-14 13:41:00").

Zdaj aplikacijo ročno aktiviramo (sudo timedatectl set-ntp true) ter počakamo nekaj minut, da sinhronizacija samodejno steče.

Vmes lahko preverimo kako sinhronizacija poteka. To storimo z ukazom: timedatectl timesync-status.

Status aplikacije lahko preverimo z ukazom timedatectl. Dobimo izpis iz katerega mora biti razvidno, da je NTP storitev aktivna (NTP service: active) ter da je sistemski čas sinhroniziran (System clock synchronized: yes):

Local time: sre 2022-07-27 14:18:54 CEST  
           Universal time: sre 2022-07-27 12:18:54 UTC   
                 RTC time: sre 2022-07-27 12:18:54       
                Time zone: Europe/Ljubljana (CEST, +0200)
System clock synchronized: yes                           
              NTP service: active                        
          RTC in local TZ: no

Časovne strežnike za sinhronizacijo lahko nastavimo v datoteki /etc/systemd/timesyncd.conf:

[Time]
NTP=pool.ntp.org

V primeru, da pri zagonu aplikacije pride do kakšne napake, to lahko preverimo z ukazom: sudo journalctl --unit=systemd-timesyncd.service.

Težave USB vmesnika pri povezovanju v mobilno omrežje

Z ukazom sudo asterisk -rx 'dongle show device state dongle0' na RaspPBX napravi lahko izpišemo status GSM USB vmesnika. Ukaz izpiše podatke v katero mobilno omrežje je povezana SIM kartica, IMSI številko, ime mobilnega operaterja, LAC kodo, Cell ID ter še kup tehničnih podatkov, ki so zanimivi v glavnem zgolj za hekerje.

Posebej zanimiva je vrstica GSM Registration Status, ki nam pove ali je SIM kartica povezana v mobilno omrežje ali ne.

Za spremljanje statusa povezave SIM kartice lahko napišemo preprosto skripto, ki vsako minuto preveri status SIM kartice v USB modemu in nas ob spremembi statusa obvesti po elektronski pošti ali preko Signala.

Opozorilo, skripta je samo “proof-of-concept”, če želite, da vam pošlje sporočilo, je v drugem delu skripte potrebno zamenjati zakomentirane echo ukaze.

#!/bin/bash
state_file=/root/sim_state.txt

DONGLESTATUS=$(/usr/sbin/asterisk -rx 'dongle show device state dongle0')
SIMREGISTRATION=$(echo "$DONGLESTATUS" | grep "GSM Registration Status" | awk -F": " '{print $2}')

if [ -s "$state_file" ]; then
  # Read state_file...
  while read -r line; do
    prev="$line"
  done < "$state_file"
else
  prev="Unknown"
  echo "$prev" > "$state_file"
fi

if [ x"$SIMREGISTRATION" != x"$prev" ]; then
  # SIM state changed!
  echo "$SIMREGISTRATION" > "$state_file"
  # Send e-mail or Signal message about status change
  # You can use the following variables
  # echo "Change: $prev --> $SIMREGISTRATION"
  # echo "USB dongle status:"
  # echo "$DONGLESTATUS"
fi

Skripto nato vstavimo v cron in spremljanje statusa se lahko začne.

Spremljanje statusa registracije SIM kartice v mobilnem omrežju pa je dalo precej zanimive rezultate.

Change: Unknown --> Registered, home network
Chance of status detected: 11-08-2022 at 20:30:01.

Change: Registered, home network --> Not registered, but searching
Chance of status detected: 12-08-2022 at 16:00:01.

Change: Not registered, but searching --> Registered, home network
Chance of status detected: 12-08-2022 at 16:01:01.

Change: Registered, home network --> Not registered, not searching
Chance of status detected: 12-08-2022 at 16:51:01.

Change: Not registered, not searching --> Registered, home network
Chance of status detected: 12-08-2022 at 22:37:01.

Kot lahko vidimo, je skripta javila, da SIM kartica kar nekaj časa ni bila povezana v omrežje, vendar pa smo RasPBX pustili pri miru in povezava se je nato sama vzpostavila nazaj.

A kar je zanimivo je dejstvo, da je v času, ko je USB modem javljal, da SIM kartica ni povezana v mobilno omrežje, na SIM kartico bilo mogoče sprejemati klice in SMS sporočila oziroma tudi pošiljati SMS sporočila.

Iskanje vzroka takega obnašanja je nakazalo, da bi problem morda lahko bilo preklapljanje med 2G in 3G/HSDPA omrežji, ampak za kaj bolj natančno odkrivanje vzroka težave, bi bilo potrebno malo več razhroščevanja. Je pa tukaj na mestu nasvet, da GSM modem z AT ukazi spravimo v stanje, ko se povezuje samo na 2G omrežje in ne uporablja roaminga. Seveda pa je potrebno AT ukaze poiskati za vsak tip modema posebej…

No, pravi rock and roll pa se je začel, ko smo RasPBX napravo enkrat v tem “neregistriranim” stanjem ponovno zagnali. Do težave pri ostalih ponovnih zagonih ni prišlo, je pa težava kar zanimiva.

Naprava je najprej javila, da SIM kartica ni registrirana v omrežje:

Change: Registered, home network --> Not registered, not searching
Chance of status detected: 17-08-2022 at 12:41:02.

Sledil je ponoven zagon naprave in skripta je sedaj javila, da je naprava v nekem čudnem stanju:

Change: Not registered, not searching --> 
Chance of status detected: 17-08-2022 at 12:47:01.

Change:  --> Unknown
Chance of status detected: 17-08-2022 at 12:48:15.

Status GSM ključka pa je bil Not connected Start scheduled.

No, potem se je status USB ključka spremenil v:

No ethernet interface found for seeding global EID. You will have to set it manually.

Ko smo se nato povezali v Asterisk konzolo in zagnali ukaz za izpis statusa GSM ključka, pa se je pojavila precej zgovorna napaka:

[dongle0] Trying to connect on /dev/ttyUSB2...
[2022-08-17 12:59:34] WARNING[1624]: chan_dongle.c:222 opentty: unable to open /dev/ttyUSB2: No such file or directory

Zdaj je hitro postalo vse jasno. Najprej je bilo potrebno odstraniti “ključavnico” (rm -f /var/lock/*tty*), nato pa smo asterisk uporabnika za vsak slučaj dodali še v skupino dialout (sudo adduser asterisk dialout). Po ponovnem zagonu RasPBX naprave je vse skupaj pričelo normalno delati.

Zaključek

S pomočjo poceni RasPBX naprave smo se naučili kako postaviti lastno poceni telefonsko centralo, ki deluje precej zanesljivo in pokriva različne scenarije uporabe.

Je pa res, da šele dlje časa trajajoča uporaba in spremljanje delovanja pokaže, kje so možne in potrebne optimizacije. Telefonska centrala z različnimi uporabniki je seveda kompleksen sistem, še posebej če telefonski sistem uporabljamo v široko razprostrstem omrežju z nenadzorovanimi omrežnimi pogoji.

Kategorije: Informacijska tehnologija, Odprta koda, Telefonija
Ključne besede: VoIP, SIP