.~~.   .~~.
		    '. \ ' ' / .'
		     .~ .~~~..~.                       _                          _
		    : .~.'~'.~. :      ___ ___ ___ ___| |_ ___ ___ ___ _ _    ___|_|
		   ~ (   ) (   ) ~    |  _| .'|_ -| . | . | -_|  _|  _| | |  | . | |
		  ( : '~'.~.'~' : )   |_| |__,|___|  _|___|___|_| |_| |_  |  |  _|_|
		   ~ .~ (   ) ~. ~                |_|                 |___|  |_|
		    (  : '~' :  )
		     '~ .~~~. ~'
			 '~'
		

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.

  1. 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.

  2. 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 sekcji 4. Localisation Options -> Change Locale, poźniej z długiej listy odznaczamy en_GB zaznaczamy pl_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.

  3. 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ę klawiszy ctrl+a oraz ctrl+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 i Init2, 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 wspomniany APN, 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] z Modem = /dev/ttyUSB0 na Modem = /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ć.

  4. 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] mianowicie Before oraz Wants. Zmienimy również opcje Description 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.

  5. 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.

  6. 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.

  7. 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
    
  8. 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.

  9. 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
    
  10. 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