Navigation is at the bottom.

FIT IP1: Mobilná sieť s USRP

Zadanie

Vytvoriť mobilnú (GSM) sieť pre prenos dát medzi mobilnými zariadeniami s použitím hardware Ettus Research NI - USRP 2922 a softvérom OpenBTS.

Pozor

Ďalšie zmeny sú už iba v TeXovej verzií podľa šablóny , PDF

Dáta v Torrente

Inštalácia

Balík OpenBTS od RangeNetworks má veľmi špecifické požiadavky z hľadiska operačného systému. Oficiálne je podporovaný iba na Ubuntu 12.04. Preložiť to na RHEL Linuxe čo bol nainštalovaný v labe bolo bez šance a pokus o preloženie na inej verzii Ubuntu som vzdal po nekonečných ručných úpravách Makefile. Nakoniec som nainštaloval Ubuntu 14.04.1 LTS do virtualboxu a tam to už išlo.

S virtualboxom bol problém, že na počítači v labe bolo príliš málo miesta pre obraz disku VM. Našťastie na disku bolo ešte ne alokované miesto, tak som tam vytvoril ďalšiu oddiel čisto pre tento VM obraz.

OpenBTS sa sťahuje ako git repozitár z https://github.com/RangeNetworks/dev, kde je iba zopár skriptov predovšetkým clone.sh a switchto.sh, ktoré naklonujú a posťahujú ostatnú časť softvérového balíku. Skript clone nie je kompatibilný s staršou verziou GIT-u. Minimálna je 1.8.2, no nainštaloval som verziu 2.7.4.

Potom pri preklade (skript build.sh) sa pýta na typ hardware (radio type) a ponúka na výber iba SDR1, USRP1, B100, B110, B200, B210, N200 a N210 ani jedno z nich nie je NI USRP 2922 a ani nie je nikde spomenuté. Experimentálne som však zistil, že typ N200 funguje pre naše zariadenie.

Po preložení vznikli v adresári BUILD deb balíky, ktoré som jednoducho nainštaloval. Tieto balíčky sa neriadia pravidlami Debianu a prepisujú zopár systémových súborov a vytvárajú súbory v adresári /OpenBTS.

Detekcia zariadenia

Počítač komunikuje s USRP cez Ethernet. Ettus si pre komunikáciu s zariadením vytvoril špeciálnu sadu nástrojov, UHD Universal Hardware Driver (zas až tak univerzálnu nie je).

Príkaz uhd_find_devices vyhľadáva zariadenia UHD na sieti pomocou broadcast datagramov. Je užitočný ak práve nastavujeme IP a smerovacie tabuľky. Ďalší príkaz uhd_usrp_probe vyhľadá a vypíše informácie práve o USRP zariadeniach.

Počítač a USRP som zapojil do spoločného Ethernet switchu. USRP zariadenie má predvolenú adresu 192.168.10.2, ktorú som mu aj nechal. Táto adresa je však súčasťou inej podsiete ako sieť v laboratóriu tak som musel konfiguráciu siete upraviť následovne. Na počítači som pridal ďalšiu adresu 192.168.10.1/24 pre hlavnú sieťovú kartu automaticky vznikla aj cesta pre túto podsieť. Spojenie som overil nástrojom ping.

Využitie broadcastov pre tento účel je dosť riskantné. Síce uhd príkazy dovoľujú zadať priamo IP adresu USRP zariadenie, OpenBTS toto neumožňuje a vždy zariadenie na sieti vyhľadáva pomocou broadcastu cez všetky sieťové kartách. Toto je nezanedbateľná bezpečnostná chyba.

Spúšťanie OpenBTS

Všetky potrebné binárky sú v /OpenBTS (cd /OpenBTS). Pred spustením samotného OpenBTS spustíme ešte na pozadí autentifikačnú službu príkazom './sipauthserve&' a frontu správ pomocou príkazu './smqueue&'.

Samotné BTS sa spúšťa cez './OpenBTS', čo je interaktívny príkaz a treba ho spúšťať na popredí. Po spustení nás privíta krásnym promptom 'OpenBTS> ', ktorý ale nepoužíva readline, čiže také vymoženosti ako história príkazov alebo šípka doľava tam nefungujú.

Nastavenia

Konfiguračný systém je ďalšia kategória v ktorej OpenBTS žiary v negatívnom svetle. Je totiž vo formáte SQLite tabuľky. Nedajú sa upravovať ručne. Tabuľka config má veľa stĺpcov takže ani úpravy cez SQL nie sú praktické.

Našťastie je tu OpenBTS príkaz config. Okrem nastavovania hodnôt slúži aj na výpis nastavení a to aj pre neúplné kľúče. Jeho syntax je config key value. OpenBTS prichádza už s dostatočným defaultným nastavením ale aj tak som zmenil následovné:

Rádio

Bolo treba zvoliť pásmo a kanál na ktorom naša BTS bude vysielať. Normálne by som tieto hodnoty mal pridelené od úradov, no v testovacom prostredí som si ich zvolil sám a to následovne:

config GSM.Radio.Band 900  #Pásmo 900MHz
config GSM.Radio.C0 68     #Kanál č 68

Pre naše rádio sú prednastavené hodnoty zosilnenia príliš vysoké pre úspešnú de-moduláciu a OpenBTS ma na to patrične upozornilo, preto som som tieto hodnoty upravil. Tiež som znížil výkon vysielača, lebo to stačí na pokrytie laboratória. Nasledovne:

rxgain 4   # zníži citlivosť prijímača
power -10  # zníži výkon vysielača

Identifikácia

Zase platí, že tieto hodnoty by som mal dostať pridelené. BSIC musí byť unikátne vrámci kanálu. Pre ČR je MCC 230 a MNC som zvolil rovnaké, ako má pokusná sieť ČVUT (99). Ostatné kódy by malo byť unikátne pre danú oblasť, no nevedel som to skontrolovať. Použil som buď predvolené alebo som ich zvolil a to následovne:

config GSM.Identity.ShortName xbrada17
#^ názov siete, mobily ho väčšinou nezobrazujú
config GSM.Identity.BSIC.NCC 7
config GSM.Identity.BSIC.BCC 3
#^ ID kód základnej stanice
config GSM.Identity.CI 1337
config GSM.Identity.LAC 1000
#^ Cell ID a Location ID
config GSM.Identity.MCC 320
config GSM.Identity.MNC 99
#^ ID Kód mobilnej siete

Registrácia

OpenBTS podporuje mód, kedy sa môže do siete pripojiť každý mobil s každou SIM. Ja som sa rozhodol tento režim nepoužívať a radšej pridám telefóny ručne. Pri pokuse o pripojenie neznámeho telefónu OpenBTS zareaguje SMS správou a pripojenie zamietne. Nový mobil zaregistrujeme nasledujúcim príkazom:

./nmcli.py sipauthserve subscribers create  IMSI 

Nick je ľubovolná prezývka. IMSI príde v tej chybovej správe alebo sa dá zistiť z OpenBTS príkazu tmsis spolu s IMEI. V skratke IMSI je číslo SIM-ky a IMEI je číslo mobilu. IMEI sa dá zistiť zadaním #06# do mobilu alebo je napísané na nálepke pod krytom mobilu alebo na krabici.

Príkaz nmcli pracuje (okrem iného) so službou sipauthserve, ktorá používa dve bázy dát: /etc/OpenBTS/sipauthserve.db na nastavenia a /var/lib/asterisk/sqlite3dir/sqlite3.db na uloženie registrovaných účastníkov. Príkazom sqlite3 je možné obidve otvoriť a upravovať.

Pri registrácií som raz zle odpísal IMEI a cez nmcli sa mi tento chybný záznam nepodarilo odstrániť ani zmeniť. Chybné IMEI som našiel a opravil klasickým SQL UPDATE na príkazovom riadku sqlite3.

Skúšanie

Pre pripojenie mobilu k mojej novej sieti je treba v nastaveniach mobilu vyhľadať dostupné mobilné siete a zvoliť tú našu. Skúšaním som prišiel na to, že rôzne mobily zobrazujú iba iba MNC (99) alebo MCC a MNC (32099) alebo android, a to len občas, zobrazí ShortName. Všetkým testovaným mobilom to trvalo pomerne dlho, ale nakoniec sa do siete pripojili.

Zoznam pripojených zariadení môžme získať OpenBTS príkazom tmsis. Pre overenie spojenia som najprv vyskúšal poslať priamu SMS na môj mobil OpenBTS príkazom sendsms (viď help sendsms).

Táto správa prešla tak som ďalej skúsil poslať SMS z mobilu na testovacie číslo 411. Číslo 411 je veľmi užitočné, pretože obratom pošle SMS s informáciami: zaťaženie siete, IMSI, telefónne číslo aktuálny čas a dátum.

Vyskúšal som aj SMS medzi dvoma mobilmi, čo tiež fungovalo.

GPRS Dáta

Nastavenie

Na strane OpenBTS sa GPRS iba zapne. Okrem toho treba na strane OS nastaviť IP adresu, smerovanie a preklad (masquerade). Vstavaný firewall OpenBTS som vypol, pretože blokoval niektoré ICMP ECHO (ping) pakety. Nasleduje konfigurácia openbts:

config GPRS.Enable 1
#^ zapne dátové služby
config GGSN.Firewall 0
#^ vypne firewall
config GGSN.MS.IP.Base 192.168.99.1
config GGSN.MS.IP.MaxCount 250
#^ obmedzenie pre prideľovanie adries

OpenBTS prideľuje IP adresy od GGSN.MS.IP.Base až do base+GGSN.MS.IP.MaxCount. Prideľovanie od externého DHCP servera nie je podporované. IP komunikácia z mobilnej siete do zbytku internetu prúdi cez virtuálne TUN zariadenie sgstun, ktoré program automaticky vytvorí a prekvapivo mu pridelí aj cestu (route). Ale adresu nie, tú som musel prideliť ručne.

ip addr add 192.168.99.254/24 dev sgstun
#^ pridelenie adresy pre virtuálne rozhranie

Pre jednoduchosť som premostil mobilnú a laboratórnu sieť prekladom adries NAT. Pri nasadení by dvojitý NAT mohol byť problém.

iptables -t nat -A POSTROUTING --out-interface enp0s8 -j MASQUERADE
sysctl net.ipv4.ip_forward=1

Skúšanie

Pripojené mobily detekovali sieť ako v roamingu a dátové pripojenie odmietli. Pre pripojenie som musel povoliť dátové služby a dátové služby v roamingu v nastavení mobilu. Potom sa mobil po menej ako minúte pripojil.

Príkazom tmsis môžeme overiť či sa je mobil úspešne pripojený a zistiť jeho IMSI. IP adresu pripojeného mobilu môžeme zistiť príkazom sgsn list.

Ďalší užitočný nástroj je tcpdump. Nasledujúci príkaz začne vypisovať všetky pakety prúdiace cez zariadenie sgstun:

tcpdump -i sgstun

Spojenie som overil z mobilu s systémom Android pomocou príkazu ping a načítal som stránky Google a Yahoo.

Záver

Nainštaloval som OpenBTS a overil funkčnosť dátových služieb.