Raspberry Pi Zero jako router 3G
Pomysł na to zrodził się w mojej głowie, kiedy szykowałem się do swojej pierwszej zagranicznej wycieczki, pandemia wszystko pokrzyżowała a projekt został. Jednak bez obudowy oraz schematu połączeń jest on jedynie systemem naczyń połączonych.
- Przygotowanie sprzętu.
- Raspberry Pi Zero W,
- Modem 3G (w moim przypadku użyłem Huawei E173s-2 [pełny model znajduje się pod klapką]),
- Oficjalna klawiatura Raspberry Pi lub hub USB i zwykła klawiatura,
- Karta sieciowa USB (JP1082 - niebieska, tania karta z allegro za 10 czy 20 zł),
- Zasilacz,
- Karta microSD z systemem (RasPiOS Lite),
- Karta SIM z pakietem danych komórkowych, dedykowanego operatora dla modemu lub dowolnego jeśli modem nie posiada blokady simlock,
- Adapter mini-HDMI,
- Kabel OTG do podłączenia klawiatury lub huba,
- Kabel do podłączenia RPI do Internetu.
- Początkowa konfiguracja RPI oraz aktualizacja.
Uruchamiamy Raspberry Pi, następnie zmieniamy layout klawiatury na polski za pomocą narzędzia
raspi-config
. Wydajemy następujące polecenie:$ sudo raspi-config
Z menu głównego programu wybieramy, kolejno
4. Localisation Options
->Change Keyboard Layout
, jeśli nie wyświetli nam się nic, skrypt poprostu wróci do menu, oznacza to że musimy przełączyć jeszcze locale, po ustawieniu ich na język polski, będziemy mogli zmienić layout klawiatury. Locale ustawia się z tej samej sekcji4. Localisation Options
->Change Locale
, poźniej z długiej listy odznaczamyen_GB
zaznaczamypl_PL
w wersji UTF-8. Po ustawieniu locale oraz layoutu klawiatury należy zrestartować malinę, co sam będzie sugerować sam program. Po ponownym uruchomieniu urządzenia, możemy teraz przejść do aktualizacji wydajemy dwa następujące polecenia:$ sudo apt update $ sudo apt upgrade
Po zaktualizowaniu systemu możemy przejść do obsługi modemu 3G.
- Modem.
Podpinamy modem do gniazda usb. Po wydaniu polecenia:
$ lsusb
(w moim przypadku) powinniśmy zobaczyć linię zawierającą napis
Huawei ...
, może on się nieco różnić. Przed przystąpieniem do konfiguracji należy upewnić się czy to urządzenie jest rzeczywiście rozpoznawany jako modem. Najprościej wydać polecenie:$ ls /dev/ttyUSB*
Powinny pokazać nam się dwa urządzenia /dev/ttyUSB0 oraz /dev/ttyUSB1, to teraz możemy być pewni (tak na 99%) że modem jest prawidłowo rozpoznawany w systemie. Jeśli chcemy być pewni na 100%, możemy doinstalować program, który pozwoli nam się połączyć z modemem za pomocą linii szeregowej. Wydajemy poniższe polecenia:
$ sudo apt update $ sudo apt install picocom
Po zainstalowaniu programu możemy się z nim połączyć wydając polecenie:
$ picocom /dev/ttyUSB0 -b 115200
W nie których przypadkach mogą być wymagane uprawnienia administratora. Jeśli nie pojawiły się żadne błędy, powinniśmy mieć możliwość porozmawiania z modemem, wystarczy że się przywitamy. Wpisujemy poniższy ciąg znaków:
AT
W odpowiedzi powinniśmy dostać
OK
. Teraz już możemy być w 100% pewni że modem jest dobrze wykrywany przez RPI. Połączenie możemy zakończyć klikając po sobie kombinację klawiszyctrl+a
orazctrl+x
. Jeśli karta SIM jest zablokowana kodem PIN, przy przepięciu modemu lub przy wyłączeniu Raspberry będzie musieli ją aktywować. Połączenia jak i odblokowywania karty będziemy dokonywać za pomocą programu vwdial, należy go zainstalować wraz z pakietem ppp.$ sudo apt install wvdial ppp
Po zainstalowaniu pakietów przechodzimy do pliku /etc/vwdial.conf. Plik w domyślnie wygląda następująco:
[Dialer Defaults] Init1 = ATZ Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 Modem Type = Analog Modem Baud = 9600 New PPPD = yes Modem = /dev/ttyUSB0 ISDN = 0 ; Phone = <Target Phone Number> ; Password = <Your Password> ; Username = <Your Login Name>
Dla nas interesującą linią jest pierwsza linia. Ona tworzy sekcje konfiguracyjno-uruchomieniowe dla vwdial. Równie ciekawymi liniami są
Init1
iInit2
, zawierają bowiem one polecenia AT dla modemu. Aby odblokować modem (jeśli jest zablokowany kodem PIN) należy dodać nową sekcję pod nazwą np.pin
.[Dialer pin] Init3 = AT+CPIN=0123
W miejsce
0123
podajemy swój kod PIN. Odblokowanie modemu następuje po wydaniu polecenia.$ sudo vwdial pin
Następna sekcja w pliku konfiguracyjnym powinna być już sekcją połączenia.
[Dialer play] Init3 = AT+CGDCONT=1,"IP","internet" Username = "internet" Password = "internet" Phone = "*99#" Dial Command = ATDTW New PPPD = yes Stupid Mode = yes Dial Attemps = 0
W linii
Init3
ostatnią wartością jest APN. Do wypełnienia użytkownikowi pozostaje właśnie wspomnianyAPN
,Username
,Password
,Phone
oraz nazwa dialera, choć nie jest to obowiązkowe. Reszta pozostaje bez zmian. Teraz wystarczy tylko się podłączyć wydając polecenie:wvdial play&
Warto pamiętać o tym aby uruchomić połączenie w tle. Możemy spotkać się z taką sytuacją że modem nie będzie chciał się połączyć z Internetem. W takiej sytuacji należy spróbować ze 2-3 razy, następnie zmienić urządzenie, w sekcji
[Dialer Defaults]
zModem = /dev/ttyUSB0
naModem = /dev/ttyUSB1
. i wtedy spróbować się połączyć jeśli się to również nie powiedzie, to należy wrócić do poprzedniego urządzenia. W tym momemcie modem powinien się połączyć. - Usługa wvdial w systemd
Aby wvdial uruchamiał się i łączył w raz ze startem systemu, należy utworzyć jednostkę systemd. Oczywiście można skorzystać z poniższego pliku.
[Unit] BindsTo=dev-ttyUSB0.device After=dev-ttyUSB0.device Description=Wvdial Connection Before=network.target Wants=network.target [Service] type=oneshot ExecStart=/usr/bin/wvdial play [Install] WantedBy=multi-user.target
Jeśli kartę sim trzeba odblokować kodem PIN. Należy stworzyć drugą jednostkę podobną do tej. Powiedzmy że mamy jednostkę służącą do połączenia nazwiemy ją vwdial-connect.service, oraz jedostkę służącą do odblokowania karty vwdial-unlock.service musimy zmienić dwie opcje w sekcji
[Unit]
mianowicieBefore
orazWants
. Zmienimy również opcjeDescription
aby była bardziej adekwatna do czynności wykonywanych przez daną jednostkę.[Unit] BindsTo=dev-ttyUSB0.device After=dev-ttyUSB0.device Description=Wvdial SIM Card Unlock Before=wvdial-connect.service Wants=wvdial-connect.service [Service] type=oneshot ExecStart=/usr/bin/wvdial pin [Install] WantedBy=multi-user.target
Jednostka wvdial-connect.service zostanie opóźniona do momentu uruchomienia jednostki wvdial-unlock.service.
- Adres dla interfejsu bezprzewodowego.
Konfiguracji interfejsu bezprzewodowego dokonujemy w pliku /etc/dhcpcd.conf. Dopisując poniższe linie na samym końcu pliku.
interface wlan0 static ip_address=192.168.4.1/24 nohook wpa_supplicant
Oczywiście klasę adresów należy ustawić według własnych preferencji.
- Konfiguracja serwera dhcp.
Do konfiguracji DHCP na RPI wykorzystamy pakiet dnsmasq. Instalujemy go poleceniem.
$ sudo apt install dnsmasq
Po zainstalowaniu pakietu, zmieniamy nazwę pliku konfiguracyjnego na dnsmasq.conf.bak, następnie tworzymy nowy plik /etc/dnsmasq.conf i umieszczamy w nim poniższą konfigurację.
interface=wlan0 dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h
Zakresy i czas dzierżawy należy ustawić według własnych preferencji.
- Konfiguracja sieci bezprzewodowej.
Aby Raspberry Pi mogło rozgłaszać sygnał sieci bezprzewodowej należy zainstalować odpowiedni pakiet. Hostapd pobieramy z repozytorium:
$ sudo apt install hostapd
Konfiguracja znajduje się w pliku /etc/hostapd/hostapd.conf. Jednak to nie jedyny plik w którym należy coś zmienić, aby uruchomić 'hostapd', drugim plikiem jest /etc/default/hostapd tam usuwamy znak komentarza sprzed opcji
DAEMON_CONF
. Natomiast w /etc/hostapd/hostapd.conf możemy wpisać konfigurację bazującą na poniższej.interface=wlan0 driver=nl80211 ssid=test123 hw_mode=g channel=6 ieee80211n=1 wmm_enabled=0 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_passphrase=12344321 wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP
- Przekazywanie pakietów
Aby sprzęt podłączony do naszej sieci bezprzewodowej miał dostęp do Internetu potrzebne są dwe rzeczy. NAT oraz przekazywanie pakietów. NAT-em zajmiemy się w następnym punkcie. Aby skonfigurować przekazywanie pakietów na RasPiOS wystarczy odkomentować opcje
net.ipv4.ip_forward=1
w pliku /etc/sysctl.conf. - NAT
W każdym RasPiOS pre-instalowane jest iptables czyli jeden z pakietów firewall-a dostępnych na GNU/Linux. Jednak pre-instalowane nie jest oprogramowanie, które pozwala zachować wpisane do tablic reguły, aby ustawienia NAT-u, w iptables zostało zapisane na stałe w plikach systemu potrzebujemy pakietu iptables-persistent instalowanego za pomocą polecenia.
$ sudo apt install iptables-persistent
NAT w przypadku tego systemu uruchamiamy następującym poleceniem:
$ sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
Teraz kiedy jest on włączony, pozostaje tylko zapisać naszą tablicę, aby to zrobić musimy wykonać polecenia z uprawnieniami użytkownika root więc albo:
$ sudo su # iptables-save > /etc/iptables.ipv4.nat
lub:
$ sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
Reguła NAT-u jest już trwała. Teraz kolejnym problem jest przywrócenie tej reguły podczas ładowania systemu. Najłatwiejszym sposobem jest dopisanie polecenia do pliku, który wyświetla nam adres IP zaraz przez logowaniem. Jest to plik /etc/rc.local, przed linią
exit 0;
dopisujemy następujące polecenie:$ iptables-restore < /etc/iptables.ipv4.nat
- Restart
Restarujemy malinke:
$ sudo reboot
Jak możemy się przekonać to wszystko działa. Patrząc na to z perspektywy czasu to zmienił bym modem 3G na LTE i przylutował go pod gniazdo USB, wszystko zasilił bym modułem z powerbank-a z wymiennymi akumlatorami 3,7V. Na koniec zaprojektowałbym obudowę i wydrukował za pomocą drukarki 3D.
~xf0r3m