Blog (48)
Komentarze (382)
Recenzje (0)
@karol221-10Zróbmy własnego Skype'a

Zróbmy własnego Skype'a

Obecnie na rynku mamy dużą ilość wszelkiej maści komunikatorów. Możemy korzystać z Messengera Zuckerberga, Skype’a Satyi Nadelli lub jakiegokolwiek mniej popularnego programu. Aplikacje te są zwykle „idiotoodporne” - zakładasz konto, dodajesz znajomych i już możesz z nimi korespondować. Odpowiednie aplikacje na telefon pozwalają ci być w kontakcie ze znajomymi praktycznie cały czas.

Technologie, które umożliwiają nam rozmowę głosową/video przez Internet, określa się ogólnym mianem VoIP (Voice over Internet Protocol – dosł. głos przez IP). Istnieje dosyć spora liczba protokołów, które nam to umożliwiają. Znane aplikacje zazwyczaj korzystają ze swoich własnościowych rozwiązań. Ich cechą (podobnie zresztą, jak cechą całego współczesnego Internetu) jest centralizacja usług. Co to oznacza? Treść wszystkich naszych rozmów, wiadomości itd. przechodzi zwykle przez serwer dostawcy danego rodzaju aplikacji. Nie zmienia to nic z perspektywy przeciętnego użytkownika. Jednakże, stanowi kolejny cios w naszą prywatność. W końcu z treści rozmowy z naszą/naszym znajomą/znajomym można się sporo dowiedzieć o naszych/czyichś upodobaniach, poglądach itp. I potem możemy dziwić się, że niedawno rozmawialiśmy z kimś o np.: o diecie, a chwilę później Facebook proponuje nam idealne rozwiązanie, które pozwoli nam schudnąć w błyskawicznym tempie, idealnie dostosowane do nas.

Możesz pomyśleć, że zrobienie własnego Skype’a może być ciężkim i karkołomnym zadaniem. Z pewnością wymaga napisania niejednej linijki kodu w jakimś enigmatycznym języku programowania… Otóż nie! Odpowiednie narzędzia już istnieją na rynku i wystarczy je tylko odpowiednio skonfigurować. Jedyne, co musisz mieć opanowane, to podstawowe operacje w systemie operacyjnym Linux.

Nasz „Skype” będzie oparty, podobnie jak wiele innych istniejących rozwiązań, na technologii VoIP. Do komunikacji wykorzystamy protokół SIP (Session Initiation Protocol). Jest to najprostszy, a także (przy odrobinie konfiguracji) jeden z bezpieczniejszych protokołów VoIP. Tak naprawdę w procesie komunikacji dużą rolę odgrywają także inne "konstrukcje", takie jak SDP czy RTP, ale w tym artykule nie będziemy zajmowali się stricte technicznymi zasadami działania telefonii internetowej, a jedynie konfiguracją gotowych narzędzi.

W roli serwera wykorzystamy otwarto-źródłowy program Kamailio. Posiada on bardzo wiele opcji. Serwer Kamailio powinien być uruchomiony na takim urządzeniu, które może chodzić 24h/dobę (np.: Raspberry Pi). W tym poradniku nauczymy się wykonywać jedynie podstawową konfigurację. Nasz cel jest prosty. Chcemy mieć możliwość komunikacji (zarówno głosowej, jak i tekstowej) między różnymi urządzeniami (telefon, komputer). Dodamy także obsługę „statusu użytkownika” - będziemy wiedzieli, kto w danej chwili jest online.

Jesteś gotowy? No to zaczynamy!

Instalacja i konfiguracja serwera MySQL

Serwer baz danych MySQL jest niezbędny do prawidłowej pracy Kamailio. Serwer VoIP przechowuje w bazie danych wszystkie informacje na temat swoich użytkowników, używanych przez nich haseł, numerów telefonów itp. Poradników dotyczących konfiguracji MySQL znajdziesz bardzo dużo. Skupię się jedynie na przedstawieniu najbardziej podstawowej, działającej konfiguracji.

Serwer MySQL możemy zainstalować z repozytoriów. Zrobimy to za pomocą polecenia:

sudo apt-get install mysql-server

Do serwera mysql możemy się zalogować za pomocą polecenia:

mysql -u root

(oczywiście, dla bezpieczeństwa warto sobie ustawić hasło dla roota w mysql-u. Ale to już temat na inną opowieść) Aby kompilacja Kamailio, którą za chwilę rozpoczniemy, powiodła się, musimy także zainstalować pliki nagłówkowe serwera MySQL. Zrobimy to za pomocą polecenia:

sudo apt-get install libmariadb-dev libmariadbclient-dev

Instalacja i konfiguracja Kamailio

Kamailio jest obecny w większości dystrybucji linuksowych. Niestety, niektórzy (jak np.: użytkownicy Raspbiana) nie mogą skorzystać z takiej dogodności. Wtedy jedynym rozwiązaniem jest kompilacja ze źródeł.

Zakładam, że nigdy wcześniej nie kompilowałeś programu ze źródeł i korzystałeś jedynie z repozytoriów. W takim wypadku musisz doinstalować kilka niezbędnych pakietów. Zakładam, że używasz debianopodobnej dystrybucji, ale poniższe kroki będą podobnie wyglądały także w wypadku innych menedżerów pakietów.

Najpierw musimy zainstalować podstawowe narzędzia, które służą do kompilacji programów. Możemy to zrobić za pomocą polecenia:

 apt-get install build-essential

Drugim krokiem „przygotowania środowiska” jest instalacja pakietów, które będą wymagane podczas kompilacji przez Kamailio. Żebyś się nie trudził, odpowiednie wywołanie apt‑get znajduje się poniżej.

sudo apt-get install bison flex libxml++2.6-dev libssl-dev

Pierwszym krokiem jest pobranie źródeł kamailio. Znajdziemy je na oficjalnej stronie projektu. Na dzień dzisiejszy najnowsza wersja oznaczona jest numerkiem 5.0.2. Po pobraniu rozpakowujemy archiwum za pomocą polecenia:

tar -zxvf kamailio-5.0.2_src.tar.gz

Utworzony zostanie katalog kamailio-5.0.2, do którego wchodzimy za pomocą polecenia cd. Jeśli to nie jest twoja pierwsza kompilacja programu ze źródeł na Linuksie, wiedza pewnie podpowiada ci, że następnym krokiem będą polecenia ./configure, make, make install. Niestety, muszę cię zasmucić, gdyż nie będzie to takie proste. Wpierw wygenerować pliki konfiguracyjne, a następnie wprowadzić w nich kilka zmian. Pliki konfiguracyjne możemy wygenerować za pomocą polecenia:

make cfg

Gdy make skończy swoją pracę, przechodzimy do katalogu src. Następnie edytujemy plik modules.lst za pomocą wybranego edytora tekstowego (ja uwielbiam nano).

628778

W domyślnej konfiguracji, dosyć spora ilość modułów Kamailio jest wyłączona. Nie możemy tak skompilować Kamailio, gdyż na nic nam się ono w takim stanie nie przyda. Będą nam potrzebne następujące moduły:

  • db_mysql – domyślnie, Kamailio przechowuje informacje na temat zarejestrowanych użytkowników, ich numerów oraz haseł w bazie danych. Do wyboru mamy szereg różnych opcji. Jednakże najłatwiej będzie nam zrealizować nasz cel, używając bazy danych MySQL.
  • presence, presence_xml – te dwa moduły odpowiadają za status użytkownika. Za pomocą odpowiednich wiadomości (nie będziemy się zagłębiać w szczegóły techniczne) rozsyłana jest wiadomość o tym, że dany użytkownik jest dostępny.
  • tls – Protokół SIP domyślnie przesyła wszystko otwartym tekstem. My chcemy mieć komunikator bezpieczny i odporny na wszelkie próby podsłuchu. Aby to zadanie stało się faktem, musimy włączyć obsługę szyfrowania SSL w serwerze Kamailio.

Moduły te dopisujemy do pozycji „include_modules” w pliku konfiguracyjnym. Poprawnie stworzona konfiguracja znajduje się na screenie poniżej.

628782

Modyfikacja plików została zakończona. Prawda, że nie było to trudne? No dobrze. Teraz za pomocą polecenia cd .. cofamy się do głównego katalogu ze źródłami Kamailio. Pora rozpocząć kompilację. Wydajemy polecenie

make all

i modlimy się o to, aby GCC nie wyświetliło nam żadnych błędów.

628786

Po zakończeniu kompilacji wydajemy polecenie:

sudo make install

Hurra! Udało się nam się skompilować Kamailio! Wykonaliśmy już 50% pracy. Teraz trzeba tylko to narzędzie odpowiednio skonfigurować.

Konfiguracja Kamailio

Konfiguracja systemd

Najpierw musimy utworzyć specjalną grupę oraz specjalnego użytkownika dla kamailio. Czynności te wykonamy za pomocą poniższych poleceń.

groupadd kamailio
useradd -g kamailio kamailio

Kolejny element układanki to przygotowanie pliku konfiguracyjnego dla systemd. Dzięki temu nasz serwer będziemy mogli uruchamiać, restartować za pomocą polecenia systemctl. Zyskamy także możliwość automatycznego startu wraz z uruchamianiem systemu operacyjnego.

Własne pliki konfiguracyjne dla systemd należy umieszczać w katalogu /etc/systemd/system. Nazwijmy naszą usługę kamailio.service. W środku powinno znaleźć się to:

[Unit]
Description=Kamailio (OpenSER) - the Open Source SIP Server
After=network.target

[Service]
Type=forking
Environment='CFGFILE=/usr/local/etc/kamailio/kamailio.cfg'
Environment='SHM_MEMORY=512'
Environment='PKG_MEMORY=8'
Environment='USER=kamailio'
Environment='GROUP=kamailio'
EnvironmentFile=-/etc/default/kamailio
EnvironmentFile=-/etc/default/kamailio.d/*
# PIDFile requires a full absolute path
PIDFile=/var/run/kamailio/kamailio.pid
# ExecStart requires a full absolute path
ExecStart=/usr/local/sbin/kamailio -P /var/run/kamailio/kamailio.pid -f $CFGFILE -m $SHM_MEMORY -M $PKG_MEMORY -u $USER -g $GROUP
Restart=on-abort

[Install]
WantedBy=multi-user.target

Konfiguracja serwera VoIP

Wszystkie pliki konfiguracyjne przed chwilą skompilowanego Kamailio znajdują się w katalogu /usr/local/etc/kamailio. Zaczynamy od pliku kamctlrc.

628799

Sam początek pliku i dwie pozycję do zmiany … Pierwszą z nich jest SIP_DOMAIN. Po znaku równości najlepiej wpisać nazwę domenową lub adres IP naszego serwera. Nie ma to zbyt wielkiego znaczenia.

Ostatni parametr, który musimy zmienić w tym pliku znajduje się gdzieś pod jego koniec. Mowa o STORE_PLAINTEXT_PW. Musimy usunąć znak # sprzed linijki STORE_PLAINTEXT_PW=0. Dzięki temu hasła w bazie danych kamailio nie będą zapisywane w postaci jawnej.

Gdy skierujemy swój wzrok na dalszą część pliku, zauważymy zahaszowaną pozycję DBENGINE=MYSQL. Musimy usunąć znak # sprzed tej linijki. Dzięki temu Kamailio będzie wiedziało, że ma korzystać z serwera baz danych MySQL. To koniec zmian w pliku kamctlrc. Zapisujemy zmiany.

Musimy zmodyfikować jeszcze jeden plik. Nosi on nazwę kamailio.cfg. Pod pierwszym wierszem (#!KAMAILIO) dopisujemy:

#!define WITH_MYSQL
#!define WITH_AUTH
#!define WITH_NAT
#!define WITH_TLS
#!define WITH_PRESENCE

Poszczególne linijki mówią serwerowi Kamailio o tym, jakie funkcjonalności mają zostać włączone.

W pliku kamailio.cfg musimy wprowadzić jeszcze jedną zmianę. Domyślnie, hasła użytkowników w bazie danych kamailio są przechowywane w postaci jawnej. Aby wyemilinować to uciążliwe zachowanie, wystarczy zmodyfikować kilka rzeczy.

628807

Znajdź w pliku konfiguracyjnym fragment przedstawiony na screenie powyżej. Zawiera on konfigurację metod autoryzacji użytkowników. My musimy zmienić tutaj dwie rzeczy. Parametr calculate_ha1 zmieniamy na no. Natomiast opcję password_column na ha1. Poprawną konfigurację przedstawia poniższy screen.

628809

Następnym krokiem jest stworzenie bazy danych. Spokojnie, nie musimy ręcznie tworzyć tabel czy rekordów. Wszystko wykona za nas jeden z programów dostarczanych wraz z kamailio, a mianowicie kamdbctl. Aby stworzyć odpowiednią bazę danych, wydajemy polecenie:

sudo kamdbctl create
628812

Program zapyta nas o wybór domyślnego kodowania. Możemy wybrać utf16 albo cp1250. Następnie musimy odpowiedzieć na kilka pytań o stworzenie tabel dla dodatkowych funkcji. Polecam odpowiedzieć na wszystkie wątpliwości kamdbctl literką y(zgadzam się).

Obejście NAT

Na poprzednim kroku moglibyśmy zakończyć wstępną konfigurację serwera VoIP. Tak by było pod warunkiem, gdyby nasz komunikator miał działać tylko w sieci lokalnej. Niestety, jeśli chcemy korzystać z niego także poza domem, musimy skonfigurować dodatkową aplikację – rtpproxy.

Pomaga ona serwerowi VoIP Kamailio pokonać warstwę translacji adresów. Czym jest NAT, który stanowi tutaj problem? W skrócie, pozwala on korzystać kilku komputerom z sieci Internet, używając jednego publicznego adresu IP. NAT jest powszechnie stosowany zarówno w zwykłych routerach domowych, jak i u dużych operatorów telekomunikacyjnych (używając np.: danych komórkowych w telefonie, nie mamy publicznego adresu IP, jesteśmy za NATem). Bez odpowiednich technik nie jest możliwe zainicjowanie połączenia przez serwer z komputerem będącym za NATem. Programy takie jak rtpproxy likwidują ten problem. Rtpproxy możemy zainstalować z repozytoriów za pomocą polecenia:

sudo apt-get install rtpproxy

Konfiguracja jest prosta. Przechodzimy do katalogu /etc/default i modyfikujemy plik rtpproxy.

628819

Jak widzimy na screenie powyżej, linia CONTROL_SOCK=udp:127.0.0.1:22222 jest zahaszowana. Usuwamy znak # sprzed tej linii. Dodatkowo, zmieniamy cyfry 22222 na 7722. Liczba ta oznacza port, po którym Kamailio komunikuje się z rtpproxy. W domyślnej konfiguracji kamailio korzysta z portu 7722. Aby wszystko przebiegało sprawnie, rtpproxy musi nasłuchiwać na takim samym porcie. Dodatkowo dopisujemy dwa parametry: USER=kamailio i GROUP=kamailio. Oznaczają one użytkownika i grupę, która będzie uprawniona do korzystania z rtpproxy Na sam koniec modyfikujemy parametr EXTRA_OPTS. Między znakami „” wpisujemy: „‑l nasz_zewnetrzny_adres_ip”. Poprawnie skonfigurowany plik znajduje się na screenie poniżej.

628821

Konfiguracja szyfrowania

Szyfrowanie w dzisiejszych czasach jest rzeczą nieodzowną. Praktycznie każda strona internetowa przedstawia się „zieloną kłódeczką” która ma chronić nas przed wszelkimi podsłuchiwaczami. Nasz serwer VoIP także musi mieć szyfrowanie. W przypadku Kamailio mamy dostępne dwie opcje. Możemy użyć gotowego certyfikatu pochodzącego z CA (Certificate Authority), kupionego np.: dla naszej strony internetowej. Wtedy wystarczy przekopiować je do wybranego przez nas katalogu oraz wprowadzić odpowiednie zmiany w pliku tls.cfg znajdującym się w katalogu /usr/local/kamailio/etc. W dalszym opisie zakładam, że nie posiadamy żadnego certyfikatu i będziemy takowy generować (tzw. self-signed certificate – certyfikat podpisany samodzielnie).

628824

Zajrzyjmy do pliku tls.cfg. (screen powyżej). Widzimy, że wszystko właściwie jest skonfigurowane poprawnie. Brakuje jedynie certyfikatów, które wg pliku konfiguracyjnego powinny znajdować się w: klucz prywatny: /usr/local/etc/kamailio/kamailio-selfsigned.key klucz publiczny: /usr/local/etc/kamailio/kamailio-selfsigned.pem

628826

Nie będziemy nic modyfikowali w pliku tls.cfg. Wygenerujemy jedynie odpowiednie certyfikaty.

Będąc w katalogu /usr/local/etc/kamailio wydajemy polecenie:

sudo openssl req -x509 -newkey rsa:4096 -keyout kamailio-selfsigned-private.pem -out kamailio-selfsigned.pem -days 365

Po wydaniu polecenia terminal zapyta nas o kilka rzeczy. Najpierw będziemy musieli wprowadzić tzw. PEM pass phrase – chroni ono nasz klucz prywatny przez jego szyfrowanie. Potem będziemy mogli podać województwo, miejscowość itd. wygenerowania klucza. Możemy wpisać tutaj byle co lub zostawić te pola puste. Nie odgrywa to w naszym wypadku żadnej roli.

W poprzednim akapicie wspominałem o PEM pass phrase. Aby Kamailio odczytało nasz klucz prywatny, musimy usunąć to zabezpieczenie. Możemy to zrobić za pomocą polecenia:

openssl rsa -in kamailio-selfsigned-private.pem -out kamailio-selfsigned.key

Na sam koniec musimy zmienić właściciela i grupę dla dwóch plików kluczy. Możemy to zrobić za pomocą poleceń:

chown kamailio:kamailio kamailio-selfsigned.key kamailio-selfsigned.pem

Tworzenie kont użytkowników

Przed tym etapem proponuję zrestartować serwer kamailio. Możemy to zrobić za pomocą polecenia:

sudo systemctl restart kamailio.service

Tworzenie kont użytkowników w serwerze kamailio jest bajecznie proste. Wystarczy wydać polecenie, które ma następującą składnię:

sudo kamctl add nazwa_uzytkownika haslo_uzytkownika

Jako nazwę użytkownika proponuję stosować wyłącznie cyfry. Unikniemy problemów w konfiguracji wielu programów służących do komunikacji za pomocą serwera SIP. Po wydaniu polecenia terminal zapyta nas o hasło do bazy danych dla użytkownika kamailio@localhost. Domyślnie, jest to kamailiorw. Utwórzmy kilku przykładowych użytkowników

sudo kamctl add 10000 123456
sudo kamctl add 10001 234567
sudo kamctl add 10002 345678
628842

Nasz serwer w tej chwili jest już gotowy do pracy. Jeśli chcemy, aby był widoczny w Internecie, wystarczy jedynie wykonać odpowiednie przekierowanie portów w routerze. Ze względu na różnorodność tego procesu u różnych producentów routerów pominę ten krok.

Konfiguracja klienta SIP – Windows

W Internecie jest dostępnych bardzo dużo zarówno darmowych jak i płatnych programów obsługujących protokół SIP. Ja zainteresowałem się bardzo prostą, a jednocześnie mającą dużo opcji (np.: wideorozmowy) aplikacją MicroSIP. Można ją pobrać ze strony domowej projektu.

628846

Konfiguracja MicroSIP jest bardzo prosta. Najpierw musimy dodać nasze konto. Klikamy Menu›dodaj konto.

628848

Pola, które powinniśmy wypełnić to Nazwa konta (to, co będzie się nam wyświetlało), serwer SIP (adres naszego skonfigurowanego przed chwilą serwera), login użytkownika (login jednego z utworzonych przed chwilą kont), domena (to samo co serwer SIP), login i hasło.

Jeśli chcemy włączyć szyfrowanie, wybieramy opcję „Obowiązkowe” w polu Szyfrowanie. Zaznaczamy także pole „Publikuj status”. Dzięki temu inni użytkownicy naszego serwera będą wiedzieli, kiedy jesteśmy online.

628851

Jeśli z menu wybierzemy opcję „Opcje programu MicroSIP” będziemy mogli zdecydować m.in. o tym, jakich kodeków chcemy używać. Będziemy także mogli wybrać domyślny mikrofon lub kamerę.

628853

Na zakładce „Kontakty”, jak sama nazwa wskazuje, możemy dodać naszych znajomych (korzystających oczywiście z tego samego serwera SIP). Powyższy screen pokazuje sposób działania modułu „Presence” serwera Kamailio – numer 10001 jest niedostępny, a 10002 dostępny. W omawianym programie, aby status był pokazywany, należy przy dodawaniu kontaktu zaznaczyć pole: „Subskrypcja obecności”.

Konfiguracja klienta SIP – Android

Również na Androidzie mamy spory wybór programów obsługujących protokół SIP. Ja używam prostej, otwartoźródłowej aplikacji CSIPSimple. Jest ona dostępna do pobrania w Google Play.

Przy pierwszym uruchomieniu aplikacja zapyta się nas o kilka podstawowych opcji oraz pozwoli skonfigurować konto. Listę „Wybierz kreatora” przewijamy na dół i wybieramy pozycję „Basic”.

628858

Ekran konfiguracji jest jeszcze prostszy niż w przypadku MicroSIP. Pole „Nazwa konta” nie ma na nic wpływu – jest to tylko czytelna nazwa wyświetlana nam. W polu użytkownik wpisujemy samą nazwę użytkownika, następnie w polu serwer adres IP serwera kamailio, a ostatecznie hasło dostępu do konta.

628860

Tak przedstawia się nam aplikacja po poprawnym skonfigurowaniu. Na klawiaturze numerycznej możemy wybrać numer osoby, do której chcemy zadzwonić. Niestety, mimo teoretycznej możliwości, nie udało mi się zmusić CSIPSimple zarówno do wideorozmów, jak i szyfrowania. Wady te aplikacja nadrabia prostotą użytku.

Jakie są role zakładek? Zadanie pierwszej (słuchawka) omówiliśmy. Na drugiej znajduje się historia wykonanych połączeń. Na trzeciej możemy utworzyć listę znajomych. Natomiast ostatnia pozwala nam na pisanie „SMS-ów”.

Podsumowując

Na polsko-języcznych stronach nie znalazłem żadnych informacji jak można skonfigurować tego typu usługę. Jest to rzecz przydatna raczej dla wąskiej garstki użytkowników domowych. Własne serwery VoIP prędzej znajdą zastosowanie w firmach. Niemniej, warto wiedzieć, że istnieje taka możliwość. Przy odpowiedniej konfiguracji możemy sobie zapewnić pełną poufność komunikacji. Aplikacja na PC MicroSIP pozwala zarówno na szyfrowanie procesu logowania do serwera jak i samej komunikacji, co zapewnia pełne bezpieczeństwo przed ewentualnym przechwyceniem treści naszej rozmowy. Niestety, trochę ciężej znaleźć odpowiednią aplikację dla systemu Android. Niemniej, jest to opcja godna rozważenia. Dla tych, którzy będą chcieli jeszcze lepiej zabezpieczyć się przed „NSA” zawsze istnieje opcja połączenia własnego serwera VoIP z VPN‑em lub siecią Tor.

Wybrane dla Ciebie
Komentarze (13)