Raspberry PI jako router 3G/4G
W dzisiejszych czasach coraz popularniejsze są oferty mobilnego Internetu. Często są opłacalne cenowo dla tych, którzy nie ściągają zbyt dużo z sieci. Zwykle nie trzeba nawet podpisywać umowy - niektórzy operatorzy oferują dość korzystne oferty Internetu na kartę. Zresztą, nawet jeśli chcemy Internet na umowę, to czasami opłata miesięczna jest mniejsza, gdy nie będziemy brali urządzenia.
W takim bądź razie, jak będziemy odbierać ten Internet? Rozwiązanie jest proste - musimy niestety zainwestować trochę pieniędzy w modem LTE. Jako router rozdzielający sygnał posłuży nam Raspberry Pi. No to do dzieła!
Najpierw logujemy się przez ssh do naszej pięknej malinki.
ssh pi@192.168.1.7
Domyślnym hasłem przy systemie Raspbian jest raspberry, a zamiast 192.168.1.7 podstaw adres IP twojej malinki.
Aby w następnych rozdziałach nie było problemu z instalacją pakietów, przeprowadźmy aktualizację repozytoriów poleceniem:
sudo apt-get update
Konfiguracja modemu - usb_modeswitch
Podłącz swój modem do Raspberry. Pierwszym problemem na jaki napotykamy jest to, że modem nie zostanie wykryty jako “modem”, ale jako urządzenie pamięci masowej. Widzimy to na poniższym screenie:
Abyśmy mogli przejść do następnego etapu konfiguracji, w katalogu /dev muszą być obecne pliki /dev/ttyUSBx (gdzie x to jakaś cyfra). Możemy przełączyć nasze urządzenie usb w tryb modemu za pomocą prostego programiku zwanego usb_modeswitch. Instalujemy usb_modeswitch poleceniem:
sudo apt-get install usb-modeswitch
Teraz wszystko zależy od tego, jaki modem podłączyliśmy do Raspberry. Zwykle wystarczy wydanie polecenia:
sudo usb_modeswitch -v defvendor -p defproduct
Gdzie za defvendor podstawilibyśmy w naszym przypadku 12d1, a za defproduct 14fe. (Jeśli nie możesz zaskoczyć, skąd się to wzięło, spójrz na wynik polecenia lsusb na pierwszym screenie).
Niestety, taka metoda nie zadziała z modemami (np.: z moim Huawei E3131 od Play), w takim wypadku musimy trochę poszperać w Internecie, aby znaleźć odpowiednią komendę, albo ewentualnie samemu pobawić się z różnymi przełącznikami polecenia usb_modeswitch. W moim wypadku odpowiednia jest komenda:
usb_modeswitch -v 12d1 -p 14fe -V 12d1 -P 1506 -M "55534243123456780000000000000011062000000100000000000000000000"
Wydajmy polecenia lsusb, a potem ls /dev/ttyUSB*. Jak widzimy, teraz urządzenie jest widoczne jako modem, a odpowiednie pliki urządzeń. Możemy więc spokojnie przejść do następnego etapu.
Konfiguracja modemu - wvdial
No dobra, mamy modem, który jest wykrywany jako modem, ale co z tego jak urządzenie to nie wie, jak ma się łączyć i z czym ma się łączyć. Do tego służy program wvdial. Zainstalujmy go teraz poleceniem:
sudo apt-get install wvdial
Po zainstalowaniu programu możemy zająć się jego konfiguracją. W tym celu należy otworzyć dowolnym edytorem tekstowym plik /etc/wvdial.conf Sekcja [Dialer Defaults] odpowiada za działania, które zostaną zrealizowane, gdy uruchomimy program wvdial bez żadnych przełączników. Nie będziemy się nią teraz zajmować. Utwórzmy własną sekcję
[Dialer Orange] Modem = /dev/ttyUSB1 Init3 = AT+CGDCONT=1,"IP","internet" Username = "internet" Password = "internet" Phone = "*99#" Dial Command = ATDTW Stupid Mode = yes Dial Attempts = 0
Aby program skorzystał z nowego dialera, będziemy musieli uruchomić program z odpowiednim przełącznikiem (w moim wypadku: wvdial orange).Program wvdial może działać w tle, więc jeśli nie chcesz uruchamiać nowej sesji ssh, możesz dodać znak & na końcu polecenia. Wtedy program nie zostanie połączony z sesją terminala.
No dobra, ale co ten plik konfiguracyjny właściwie robi? Mogę powiedzieć, że po odpowiednim dostosowaniu jest praktycznie uniwersalny (testowałem z sieciami Play i Orange). Omówmy go linijka po linijce.
wvdial orange
[list][item]Modem - czyli po prostu plik urządzenia naszego modemu. Jeśli urządzenie tworzy kilka plików (np.: /dev/ttyUSB0, /dev/ttyUSB1 itd.) to musimy metodą prób i błędów dojść do właściwej konfiguracji :)[/item][item]Init3 - AT - są to polecenia, którymi można komunikować się z modemem. Polecenie, które znajduje się w pliku konfiguracyjnym wysyła do modemu żądanie połączenia się z punktem APN o nazwie “internet”. Jeśli nasz operator stosuje inną nazwę APN, musimy zmienić ten ciąg.[/item] [item]Username, Password - dane dostępowe do punktu APN[/item][item]Phone - numer telefonu, do którego modem musi się “wzdzwonić” aby uzyskać dostęp do Internetu. W polskich sieciach *99# jest praktycznie uniwersalny. [/item][item]Dial Command - komenda, której używa modem do nawiązywania połączenia. Zwykle jest to ATDTW, ale możliwe są także inne kombinacje (np.: ATDT).[/item][item]Stupid Mode - ciekawa opcja. Kiedy wvdial jest w “głupim trybie” usługa pppd jest uruchamiana automatycznie tuż po tym, jak modem połączy się z serwerem. Nie są podejmowane próby interpretowania komend wysyłanych przez serwer APN. Przyspiesza to proces łączenia, ale może spowodować problemy w przypadku niektórych ISP. [/item][item]Dial Attempts - liczba prób połączenia, które podejmie wvdial. Kiedy wartość wynosi 0, modem będzie próbował połączyć się do skutku. [/item][item]Auto DNS - nie mam tej opcji w moim przykładzie, ale warto o niej wspomnieć. Domyślnie jej wartość ustawiona jest na “on”. Oznacza to, że modem będzie pobierał adresy serwerów DNS od providera. Jeśli chcemy korzystać z własnoręcznie wybranych serwerów DNS, możemy dodać tę opcję do pliku konfiguracyjnego z wartością “off”.[/item]Dobrze, po skonfigurowaniu wvdial.conf wydajemy odpowiednie polecenie do uruchomienia połączenia: np.: .Ujrzymy mniej więcej taki widok, jeśli modem połączył się poprawnie:
Dobrze, malinka ma teraz połączenie z Internetem. Jeśli chcesz, możesz spróbować spingować dowolny serwer. Powinna pojawić się odpowiedź. Jeśli jej nie ma, coś musiałeś zrobić źle.
Konfiguracja stałego adresu IP
Malinka będzie służyć za naszą “bramę” do Internetu. Aby tak było, nie może mieć adresu IP przydzielanego dynamicznie. Musimy ustawić statyczny adres IP. Nie jest to trudne zadanie. Sposób konfiguracji zależy jednak od tego, czy na swoim Raspberry masz Raspbian Jessie czy Wheezy. Dla Wheezy procedura będzie następująca: należy edytować plik /etc/network/interfaces. Szukamy linijki: iface eth0 inet manual. Zmieniamy w niej słówko manual na static. Przed tą linijką dopisujemy natomiast: auto eth0. Przykładowa konfiguracja wygląda tak:
auto eth0 Iface eth0 inet static address 192.168.1.50 netmask 255.255.255.0 gateway 10.64.64.64
Teraz omówię te trzy linijki pliku:
- address - ten ciąg cyfr to adres IP naszej malinki
- netmask - maska sieci, w której znajduje się Raspberry
- gateway - nasza brama sieciowa. Adres ten możemy odczytać z wyniku działania polecenia wvdial. Podany jest w linijce: remote IP address. Za pośrednictwem tej sieci nasza malinka będzie łączyć się z Internetem.
Jeśli mamy Raspbiana Jessie, procedura wygląda trochę inaczej. Edytujemy plik /etc/dhcpcd.conf. Na końcu tego pliku dopisujemy naszą konfigurację w następujący sposób:
interface eth0 static ip_address=192.168.1.50/24 static routers=10.64.64.64
Przykład mówi sam za siebie. Najpierw podajemy nazwę interfejsu (po słówku kluczowym interface). W następnej linijce podajemy adres ip z maską. Natomiast w ostatniej bramę sieciową.
Restartujemy malinkę. Po ponownym uruchomieniu spingowanie dowolnego serwera powinno zakończyć się sukcesem.(Nie zapomnij, że jeszcze nie skonfigurowaliśmy automatycznego uruchamiania wvdial i usb_modeswitch. Więc, po ponownym uruchomieniu musisz uruchomić obydwa wspomniane polecenia), a malinka powinna mieć stały adres IP dokładnie taki, jaki podaliśmy w pliku konfiguracyjnym (możemy to sprawdzić za pomocą polecenia ifconfig).
Reguły IPTables
No dobra, mamy połączenie z Internetem na malince, ale co z tego, jak żaden inny komputer póki co nie może z tego połączenia korzystać. Aby to było możliwe, musimy odpowiednio skonfigurować przekazywanie pakietów w IPTables. Ogólnie IPTables to taka linuksowa mocno zaawansowana zapora sieciowa. My również w tym momencie będziemy musieli skorzystać z jej możliwości, aby przekierować pakiety idące na interfejs eth0 do ppp0 i na odwrót. Musimy wydać trzy polecenia:
sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE sudo iptables -A FORWARD -i ppp0 -o eth0 -m state --state RELATED, ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i eth0 -o ppp0 -j ACCEPT
Pierwsza linijka pozwala nam na skonfigurowanie tzw. Maskarady. Jest to specjalna odmiana NAT‑u. Linijka ta ma jeden główny cel - w naszej sieci lokalnej raczej jest więcej urządzeń niż samo Raspberry Pi. Operator natomiast udostępnia nam tylko jeden adres publiczny. Maskarada zamienia adres źródłowy w pakietach pochodzących z sieci lokalnej na globalny adres IP udostępniony przez operatora. Taka bardziej profesjonalna nazwa tego procesu to “maskowanie”. Gdyby nie wymyślano takiego rozwiązania, każdy komputer musiałby mieć swój unikalny adres publiczny, a wtedy pula adresów IPv4 szybciutko by się wyczerpała.
Zajmijmy się analizą drugiej linijki. Pierwszy parametr oznacza, że zajmujemy się przekierowaniem pakietu. (routingiem). Kolejne dwa parametry oznaczają kolejno źródłowy interfejs (nasza sieć 3G/4G czyli ppp0) oraz docelowy interfejs (eth0). Parametr m pozwala nam zdefiniować reguły, wg których będziemy wykonywać routing pakietów. W naszym poleceniu jest to wymóg połączenia tzw. RELATED (słówko to oznacza, że otrzymany pakiet tworzy nowe połączenie) lub ESTABLISHED (pakiet jest “powiązany” z istniejącą sesją między klientem a serwerem).
Poprzednia linijka definiowała reguły ruchu od operatora do nas. Natomiast ostatnia linijka definiuje ruch w przeciwnym kierunku. W tym wypadku należy akceptować wszystkie pakiety (‑j ACCEPT).
IPTables skonfigurowany. Teraz musimy jedynie poinformować jądro systemu, że będziemy przekierowywali pakiety. Można to zrobić jednym prostym poleceniem, które mówi samo za siebie:
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
Skonfigurowaliśmy IPTables. Jeśli nie możesz się doczekać, możesz już teraz przeprowadzić próbę naszego małego routerka. Po prostu na drugim komputerze/tablecie/smartfonie ustaw na razie statyczny adres IP (z tej samej sieci, w której jest malinka), a jako bramę sieciową ustaw Raspberry. Jako serwer DNS możesz użyć tworu firmy Google (8.8.8.8). Internet powinien hulać bez problemu.
Jednak nie ciesz się za wcześnie :) gdyż to nie jest koniec naszej konfiguracji, ponieważ po restarcie będziemy musieli powtórzyć całą naszą ciężką pracę. Poza tym każdy router domowy sam przydziela adresy IP urządzeniom, zwalniając z tego obowiązku użytkownika. Jest to wygodniejsze niż statyczne przydzielanie adresów. A każdy do wygody się szybko przyzwyczaja ...
Automatyzujemy wszystkie procesy
usb_modeswitch
Zacznijmy po kolei, od usb_modeswitch. Nie musimy tutaj nic robić, gdyż odpowiednie reguły udev’a (dla dociekliwych - zajmuje się m.in. obsługą urządzeń podłączanych za pomocą USB) są tworzone automatycznie. Jak chcesz, możesz to sprawdzić, wyświetlając plik /lib/udev/rules.d/40-usb_modeswitch.rules.
Wvdial
Wvdial - naszym celem jest automatyczne uruchamianie tego programu przy starcie systemu. Nasza droga do osiągnięcia celu zależy od tego, czy mamy Raspbian Jessie czy Wheezy. W przypadku tego pierwszego musimy utworzyć odpowiedni plik dla systemd. Lokalizacja, która nas interesuje to /etc/systemd/system. W tym miejscu znajdują się pliki uruchamiające usługi systemowe użytkownika, takie jak ssh czy dhcp. Tworzymy własny plik. Nazwijmy go np.: wvdial.service (pamiętaj o sudo, gdyż musimy mieć uprawnienia roota, bo inaczej Linux nie pozwoli nam tu grzebać).
sudo touch wvdial.service
Potem edytujemy go w dowolnym edytorze tekstowym (profesjonaliści używają vima, ale ja uwielbiam nano za jego prostotę obsługi)
sudo nano wvdial.service
Nasz plik konfiguracyjny będzie prosty, wyglądający dokładnie jak ten poniżej:
[Unit] BindsTo=dev-ttyUSB1.device After=dev-ttyUSB1.device Description=Wvdial connection Before=network.target Wants=network.target [Service] type=oneshot ExecStart=/usr/bin/wvdial orange [Install] WantedBy=multi-user.target
Standardowo omówmy sobie zawartość tego pliku. Pierwsza sekcja [Unit] mówi o ogólnych cechach naszej usługi - kiedy należy ją uruchomić, po czym, przed czym, przez co jest wymagana itd. W naszym wypadku jest ona uruchamiana po utworzeniu pliku urządzenia ttyUSB1 (u ciebie zamiast 1 może być inna cyfra. Będzie to to samo urządzenie, którego użyliśmy przy konfiguracji wvdial), jest wymagana przez usługę dostępu do sieci (Wants=network.target) a więc musi być uruchomiona przed nią (before=network.target). Druga sekcja [Service] opisuje, co nasza usługa ma robić. W tym wypadku ma uruchomić polecenie /usr/bin/wvdial orange Sekcja [Install] ogólnie decyduje o tym, w jakim trybie systemu ma być uruchamiana nasza usługa. W tym wypadku jest to multi-user, czyli tryb wieloużytkownikowy. Najczęściej system operacyjny pracuje właśnie w takim trybie. Dodajemy usługę do autostartu za pomocą polecenia:
sudo systemctl enable wvdial.service
Dzięki tym wszystkim naszym wysiłkom modem powinien łączyć się automatycznie z siecią 3G/4G po włączeniu Raspberry Pi.
Jeśli masz Raspbiana Wheezy na swojej malince, to sprawa jest o wiele prostsza. W tym wypadku wystarczy dopisać nasze polecenie (/usr/bin/wvdial orange na przykład) do pliku /etc/rc.local. Powinno to wystarczyć.
IPTables
Reguły IPTables także nie są automatycznie zapisywane. Musimy o to zadbać sami. Aby to zrobić, przechodzimy na konto roota (sudo su albo su). Wydajemy polecenie:
iptables-save > /etc/firewall.conf
Nazwa pliku może być oczywiście inna, ale wydaje mi się, że ta najlepiej się kojarzy.
Teraz, kiedy zapisaliśmy aktualną konfigurację firewalla, musimy sprawić jeszcze, aby była wczytywana automatycznie. Możemy oczywiście napisać plik usługi systemd, ale prostszym rozwiązaniem będzie utworzenie skryptu, który zostanie automatycznie uruchomiony przy tworzeniu interfejsów sieciowych. Pliki takie znajdują się w katalogu /etc/network/if-up.d Tworzymy tam nowy plik np.: iptables. Zamieszczamy w nim następującą treść:
#!/bin/sh iptables-restore < /etc/firewall.conf
Zapisujemy plik. Musimy także uczynić ten plik plikiem wykonywalnym. Służy do tego polecenie:
chmod +x /etc/network/if-up.d/iptables
Ostatnim krokiem jest modyfikacja pliku /etc/sysctl.conf. Dopisujemy w nim linijkę [code=bash]net.ipv4.ip_forward=1[/code] .
Konfiguracja serwera DHCP
Serwer DHCP w skrócie odpowiada za przydzielanie adresów IP. Jego instalacja i konfiguracja jest bardzo prosta. Najpierw instalacja:
sudo apt-get install isc-dhcp-server
. Po instalacji pakietu edytujemy plik konfiguracyjny /etc/dhcp/dhcpd.conf (oczywiście, korzystając z uprawnień roota). Podstawowa konfiguracja wygląda tak:
subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.100-192.168.1.200; option routers 192.168.1.50; option domain-name-servers 8.8.8.8; }
Adres IP, który występuje po słówku subnet to nasz adres sieci. Netmask natomiast to maska tej sieci. To, co znajduje się pomiędzy klamrami to jej konfiguracja.
- range - opisuje zakres przydzielanych adresów IP. Możesz ustawić inny zakres ale pamiętaj, że musi się on zgadzać z tym, co pokazuje nam maska podsieci.
- option routers - jest to adres bramy sieciowej, którą przydziela serwer DHCP
- option domain-name-servers - są to adresy serwerów DNS. Możemy ustawić także zapasowe serwery DNS (wtedy wymieniamy kolejne po przecinku).
To już praktycznie koniec naszej ciężkiej pracy. Wystarczy teraz uruchomić usługę DHCP poleceniem [code=shell]/etc/init.d/isc-dhcp-server start[/code] oraz dodać ją do autostartu:
- [code=shell]sudo update-rc.d /etc/init.d/isc-dhcp-server defaults (dla Raspbian Wheezy)[/code]
- [code=shell]sudo systemctl enable isc-dhcp-server.service (dla Raspbian Jessie)[/code]
No i voila - możemy się cieszyć własnym routerem udzielającym dostępu do sieci komórkowej. Możemy oczywiście kupić gotowy router spełniający to samo zadanie, ale nie zawsze jest to opłacalne, gdyż Raspberry ma kilka niezaprzeczalnych zalet:
- Malinka ma lepsze parametry od większości najtańszych routerów obsługujących modemy 3G/4G
- Raspberry pozwala nam kontrolować ilość zużywanego transferu
- Malinka może zastąpić nam także inne urządzenia, co pomoże zaoszczędzić kilka złotych na rachunkach za prąd
- i wiele innych...
Na koniec mała uwaga - jeśli w sieci masz inny router, który posiada uruchomiony serwer DHCP, wyłącz go. Jeśli w tej samej sieci pracują dwa serwery DHCP, możesz trafić na różne “anomalie”, które m.in. mogą utrudnić dostęp do Internetu. Na koniec dwa screeny na dowód tego, jak dobrze działa nasz nowy serwer: