Automatyczna blokada internetu LTE w OpenWRT

Spis treści

Jakiś czas temu opisywałem darmowy internet LTE w RBM/PLAY. Jego niewątpliwą zaletą jest fakt, że jest za free, o ile posiadamy odpowiedni modem. Niemniej jednak, ta usługa jest na 30 dni, po upływie których trzeba ją aktywować na nowo. Jeśli z jakichś przyczyn się tego nie zrobi, to wtedy korzystanie z internetu może nas słono kosztować. Niby można zaprzęgnąć do pomocy gammu-smsd, który będzie nas powiadamiał SMS'em, że usługa została wyłączona lub włączona. Niemniej jednak, w dalszym ciągu pozostaje do ogarnięcia kwestia czasu, przez który czekamy na włączenie usługi. Najlepszym wyjściem jest całkowita blokada internetu na routerze, tak by przez ten moment nie nawiązać żadnego połączenia. Jeśli nie nawiążemy połączenia, to dane z pakietu danych nie będą nam uciekać. W momencie, gdy usługa zostanie aktywowana, to blokada będzie zdejmowana. Tego typu rozwiązanie można zaimplementować w OpenWRT za sprawą oprogramowania smstools dostępnego w pakiecie smstools3 . W tym wpisie postaramy się zaprojektować swojego rodzaju automatyczne blokowanie internet w zależności od otrzymywanych komunikatów od operatora GSM.

Gammu vs. smstools3

W OpenWRT mamy kilka pakietów, które są w stanie realizować kwestię automatycznego odcinania połączenia internetowego w oparciu o wiadomości SMS pochodzące z sieci operatora GSM. Te, które leżą w obrębie naszego zainteresowania to gammu oraz smstools3 . W tym przypadku nie korzystamy z gammu z dwóch powodów. Po pierwsze jest on bardzo ciężki jeśli chodzi o zależności. Na dobrą sprawę, by z niego korzystać pod OpenWRT, potrzebny będzie nam mechanizm extroot/whole_root. Nawet mój router TP-LINK Archer C7 v2 wyposażony w 16 MiB flash'a nie był w stanie pomieścić wszystkich potrzebnych zależności. Dlatego też gammu niezbyt się nadaje do stosowania w przypadku domowych routerów. Drugi powód, dla którego nie będziemy korzystać z gammu jest taki, że najwyraźniej nie działa on poprawnie pod OpenWRT. Próbowałem w tej sprawie zapytać na forum OpenWRT ale nie uzyskałem żadnej odpowiedzi póki co. Być może z racji ogromnej ilości zależności nie wiele osób używa tego oprogramowania.

Dlatego właśnie będziemy korzystać z pakietu smstools3 . W przeciwieństwie do poprzednika, nie zaciąga całej masy pakietów i jego instalacja wraz z oprogramowaniem obsługującym modem LTE zmieści się bez problemu na flash'u routera o pojemności 8 MiB. Zatem zainstalujmy ten pakiet:

# opkt update
# opkg install smstools3

Konfiguracja pakietu smstools3

Po instalacji pakietu smstools3 zostanie utworzony plik /etc/smsd.conf . Musimy go odpowiednio uzupełnić. Poniżej jest skrócona wersja mojego pliku konfiguracyjnego. Bardziej obszerna wersja jest na moim github'ie:

devices = GSM1
outgoing = /var/spool/sms/outgoing
checked = /var/spool/sms/checked
incoming = /var/spool/sms/incoming
failed = /var/spool/sms/failed
sent = /var/spool/sms/sent
incoming_utf8 = yes
logfile = /var/log/smsd.log
loglevel = 5
delaytime = 10
errorsleeptime = 10
eventhandler = /etc/skrypty/lte


[GSM1]
pre_init = yes
device = /dev/ttyUSB1
pin = ignore
baudrate = 115200
check_network = 2
check_memory_method = 2
primary_memory = SM
secondary_memory = SM
secondary_memory_max = 25
memory_start = 1
detect_unexpected_input = no
status_include_counters = no
status_signal_quality = no
#report_device_details = no
device_open_retries = -1
keep_open = no
mode = new
rtscts = no
incoming = yes

Wszystkie wykorzystane wyżej opcje zostały opisane przy okazji bawienia się demonem smsd pod debianem. Jeśli ktoś jest ciekaw znaczenia powyższych parametrów, to odsyłam do podlinkowanego artykułu.

Skrypt blokujący połączenie LTE

Demon smsd , który będzie zajmował się obsługą SMS, przekazuje dwa lub trzy argumenty do mechanizmu obsługi zdarzeń. Pierwszym z nich są zmienne i tu mamy do dyspozycji SENT , RECEIVED , FAILED , REPORT lub CALL . Drugim parametrem jest nazwa pliku. Trzecim zaś ID wysłanej z powodzeniem wiadomości przy włączonym statusie raportowania. Jako, że nas interesuje jedynie przypadek odbierania wiadomości od operatora GSM, to będziemy rozpatrywać jedynie zmienną RECEIVED . Skrypt, który widnieje w eventhandler można pobrać z mojego github'a.

Zasada działania blokady internetu LTE

Zasada działania tego mechanizmu jest następująca. W pewnym momencie, przychodzi na modem SMS, który ma w treści komunikat informujący nas o fakcie wyłączenia usługi LTE. Zawiera on słowa kluczowe LTE oraz zostala wylaczona . W oparciu o nie zostanie uruchomionych szereg akcji. Przede wszystkim, zostanie położony interfejs sieciowy, na którym operuje modem LTE. W ten sposób router nie będzie w stanie wysłać i odebrać żadnych danych z internetu. O fakcie założenia blokady zostaniemy powiadomieni wiadomością SMS, która zostanie przesłana na wskazany numer telefonu. System wyśle również automatycznie kod USSD aktywujący usługę LTE i będzie oczekiwał na zwrotną wiadomość SMS od operatora GSM. W tej wiadomości znajdą się słowa kluczowe LTE oraz zostala wlaczona i w oparciu o nie zostaną podjęte następujące kroki. Najpierw zostanie podniesiony interfejs sieciowy modemu, po czym zostanie wysłany SMS o zdarzeniu na określony numer telefonu. Wszystkie komunikaty z przeprowadzanych operacji są logowane do pliku /var/log/smsd.log .

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.