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

Mini serwer LXD z łącznością bezprzewodową na Raspberry Pi

Kiedy nie mamy miejsca w domu na prawdziwy serwer, a chcemy pobawić się kontenerami, to jako alternatywy możemy użyć Raspberry Pi. Po poza samą usługą LXD/LXC do dałem jeszcze funkcję AP, aby można było podłączyć się do niego bez kabli.

  1. Dysk twardy

    Do realizacji tego zadania, przyda nam się dysk twardy czy to HDD 2,5 czy 3,5" czy SSD. Obecnie Raspberry od wersji 2 drugie wspiera bootowanie z USB, przy wersji 4 należy na początku uruchomić komputer z karty następnie z aktualizować bootloader i również będzie taka możliwość.

  2. Pierwsze czynności po załadowaniu nowego systemu

    Zaraz po zalogowaniu do świeżego systemu, należało by zmienić domyślne hasło.

    $ passwd
    

    Podajemy obecne hasło: raspberry, oraz ustalamy nowe. Następną czynnością jest ustawienie lokalizacji działania sieci bezprzewodowej. Każdy kraj na własne regulacje prawne odnośnie wykorzystania pasma ISM (2,4GHz), dlatego też interfejs sieci bezprzewodowej w RPI jest zablokowany przez rfkill, dopóki nie ustawimy kraju, w którym będziemy z niej korzystać. Uruchamiamy $ sudo raspi-config, następnie wybieramy 4 Localisation Options -> I4 Change Wi-Fi Country -> PL Poland potwierdzamy OK. Zostaniemy poinformowani o ustawieniu lokalizacji.

  3. Aktualizacja systemu

    Teraz zainstalujemy aktualizacje systemu i przejdziemy do konfiguracji połączenia z Internetem.

    $ sudo apt update
    $ sudo apt upgrade
    
  4. Konfigurowanie dostępu do internetu.

    Możemy pozostawić to takie jakie jest, czyli dostęp realizowany po kablu. Jednak traci to trochę na mobilności. Dlatego proponuje dołożyć drugą kartę bezprzewodową, aby również połączenie z internetem odbywało się za pomocą sieci bezprzewodowej. W moim przypadku użyłem TP-Link Archer T2U. Karta jest dwuzakresowa jednak nie działa out of box z RasPiOS, jeśli chcemy jej użyć musimy wykonać poniższe czynności.

    1. Pobieramy paczke oficjalnego firmware-u i przechodzimy do pobranego katalogu (jeśli nie ma git, to instalujemy go z repozytorium $ sudo apt instal git).
        $ git clone https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
      
        $ cd linux-firmware
      
    2. Tworzymy katalog 'mediatek' na /lib/firmware.
      $ sudo mkdir /lib/firmware/mediatek
      
    3. Kopiujemy sterownik do naszego nowo utworzonego katalogu.
      $ sudo cp mediatek/mt7610u.bin /lib/firmware/mediatek/
      
    4. Usuwamy niekompatybilny moduł z jądra systemu.
      $ sudo rmmod mt76x0
      

      Gdyby pojawił się taki komunikat o błedzie:

      rmmod: ERROR: ../libkmod/libkmod.c:514 lookup_builtin_file() could not open builtin file '/lib/modules/4.19.97-v7+/modules.builtin.bin'
      

      To należy zresetować malinkę: $ sudo reboot

    5. Dodajemy nowy moduł do jądra.
      $ sudo modprobe mt76x0
      

    Po wprowadzeniu powyższych czynności karta powinna już działać, można to przetestować skanując sieci bezprzewodowe.

    $ sudo iwlist wlan1 scan
    
  5. Konfiguracja interfejsu AP

    Aby wybudowany interfejs sieci bezprzewodowej mógł być punktem dostępu musi mieć adress ip, które jednocześnie będzie bramą dla jego sieci. Aby nadać mu adres IP w pliku /etc/dhcpcd.conf na samym dole dopisujemy poniższe opcje:

    interface wlan0
    static ip_address=192.168.4.1/24
    nohook wpa_supplicant
    
  6. Instalacja i konfiguracja serwera dhcp oraz demona punktu dostępu

    Do stworzenia sieci bezprzewodowej potrzebny jest serwer odpowiedzialny za przydział adresów IP oraz program który tak skonfiguruje wbudowaną kartę by rozgłaszała sygnał sieci. Instalujemy dwa pakiety:

    $ sudo apt install hostapd dnsmasq
    

    Zmieniamy nazwę pliku konfiguracyjnego dnsmasq dostarczonego wraz z pakietem, ponieważ nie będzie on nam potrzebny jednak warto go zachować gdyż może być bazą wiedzy na temat konfiguracji usługi.

    $ sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.init
    

    Tworzymy nowy plik i zapisujemy w nim poniższe linie, oczywiście adresy zakresu należy dobrać do adresu ustawionego na wlan0.

    interface=wlan0
    dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h
    

    Teraz należy zrestartować usługę.

    $ sudo systemctl restart dnsmasq
    

    Następnie przechodzimy do pliku konfiguracyjnego daemon hostapd. Plik ten najprawdopodobniej nie istnieje, więc do nowego pliku /etc/hostapd/hostapd.conf wpisujemy poniższą konfiguracje.

    interface=wlan0
    driver=nl80211
    ssid=rpilxdsrv
    hw_mode=g
    channel=6
    wmm_enabled=1
    ieee80211n=1
    macaddr_acl=0
    auth_algs=1
    ignore_broadcast_ssid=1
    wpa=2
    wpa_passphrase=123_LxD_123
    wpa_key_mgmt=WPA-PSK
    wpa_pairwise=TKIP
    rsn_pairwise=CCMP
    

    To nie koniec konfiguracji, otóż daemonowi należy jeszcze wskazać ścieżkę do pliku konfiguracjnego w pliku /etc/default/hostapd. Otwieramy plik, odszukujemy linie zawierajacą DAEMON_CONF="", usuwamy znajdujący się na początku znak komentarza, pomiędzy podwójnymi apostrofami umieszczamy ścieżkę do pliku.

    DAEMON_CONF="/etc/hostapd/hostapd.conf"
    

    Aby uruchmić usługę należy wydać poniższe polecenia.

    $ sudo systemctl unmask hostapd
    $ sudo systemctl enable hostapd
    $ sudo systemctl start hostapd
    
  7. NAT i przekazywanie pakietów

    Włączenie przekazywania pakietów na Raspberry Pi jest dziecinnie proste sprowadza się do usunięcia znaku komentarza z linii #net.ipv4.ip_forwarding=1 w pliku /etc/sysctl.conf. Uruchomienie NAT-u, to w sumie też jedno polecenie.

    $ sudo iptables -t nat -A POSTROUTING -o <interfejs połączenia z internetem> -j MASQUERADE
    

    Jednak kiedy uruchomimy ponownie nasze RPI, reguła NAT-u zniknie. Aby reguły iptables były stałe są zapisywane do pliku, a przy uruchomieniu systemu odtwarzane, aby to zrealizować musimy zainstalować pakiet iptables-persistent.

    $ sudo apt install iptables-persistent
    

    Podczas instalacji, zostaniemy zapytani o to czy zapisać istniejące już reguły. Możemy to zrobić. Przy każdym zapisie plik jest nadpisywany obecnie załdowanymi do iptables regułami. Reguły najlepiej zapisywać po każdej zmianie, poniżej znajduje się polecenie odpowiedzialne za ich przywrócenie, należy umieścić je w pliku /etc/rc.local przed linią exit 0.

    iptables-restore < /etc/iptables/rules.v4
    
  8. Połączenie z internetem

    Kiedy mamy już gotową bramkę pozostaje nam tylko połączyć się z Internetem, połączenie to będzie udostępniane przez nasz mikroserwer za pomocą sieci bezprzewodowej. Jeśli łączymy się po kablu, to tak naprawdę wystarczy go wpiąć i możemy przejść do kolejnego punktu. Jeśli połączenie będziemy realizować za pomocą sieci bezprzewodowej, to teraz się z taką siecią połączymy. Zestawianie połaczenia rozpoczynamy od znalezienia naszej sieci docelowej, skanowania dokonujemy za pomocą polecenia:

    $ sudo iwlist wlan1 scan
    

    Odszukujemy sieć do której chcemy się podłączyć następnie na podstawie zabezpieczeń sieci wybieramy z jedną z metod sparowania się.

    • sieć otwarta -
      $ sudo iwconfig wlan1 essid "ssid"
      
    • WEP -
      $ sudo iwconfig wlan1 essid "ssid" key "kluczWEP"
      
    • WPA/WPA2 -
      $ sudo wpa_passphrase "ssid" "psk" | sudo tee /etc/wpa_supplicant/wpa_supplicant.conf
      
      $ sudo wpa_supplicant -B -c /etc/wpa_supplicant/wpa_supplicant.conf -i wlan1
      

    Bez względu na wybrany typ sieci, musimy pobrać z niej adres IP, co jest realizowane przez poniższe polecenie.

    $ sudo dhclient wlan1
    

    Z racji tego iż ta czynność będzie wykonywana za każdym razem gdy użytkownik będzie podłączał się do Internetu. Dnsmasq nie posiada adresu, na który mógłby przekazywać pakiety. Dnsmasq nie jest serwerem DNS sam w sobie. Jest tylko przekaźnikiem co nawet tłumaczy jego nazwa. Po pobraniu adresu IP z docelowej sieci, należy zrestartować dnsmasq, aby mógł wczytać ten adres i zapewnić swobodny dostęp do Internetu.

    $ sudo systemctl restart dnsmasq
    

    Powyższy sposób można zautomatyzować, o ile będziemy się łączyć przez cały czas z tą samą siecią. Dodajemy polecenie sparowania z siecią oraz polecenie pobrania adresu ip do pliku /etc/rc.local nad przywróceniem reguł iptables.

  9. Instalacja LXD

    Aby zainstalować LXD, potrzebujemy znanego z Ubuntu managera pakietów snap oraz oprogramowania to tworzenia mostów. Instalujemy wymagane oprogramowanie.

    $ sudo apt install snapd bridge-utils
    

    Następnie instalujemy lxd oraz inny wymagany do uruchomienia czego kolwiek z snap pakiet.

    $ sudo snap install core
    $ sudo snap install lxd --channel=3.0/stable
    

    Po zainstalowaniu dodajemy użytkownika pi do grupy lxd, za pomocą poniższego polecenia.

    $ sudo usermod -aG lxd pi
    

    Przelogowywujemy się na użytkownika root.

    $ sudo su
    

    Dodajemy tymczasowo /snap/bin do zmiennej PATH.

    # export PATH=${PATH}:/snap/bin
    

    Zatrzymujemy usługę 'dnsmasq'.

    # systemctl stop dnsmasq
    

    Inicjujemy LXD.

    # lxd init
    

    Opis poszczególnych pytań znajdziemy https://morketsmerke.net/articles/linux/instalacja_konterów_lxd.html.

    Po zainicjowaniu LXD musimy dokonać małych zmian w konfiguracji naszego dnsmasq, otwieramy plik /etc/dnsmasq.conf, po opcji interface=wlan0 dopisujemy poniższe opcje.

    except-interface=lxdbr0
    bind-interfaces
    

    Teraz możemy ponownie uruchomić dnsmasq.

    # systemctl restart dnsmasq
    

    Wylogowujemy się zupełnie z Raspberry, po to aby zmienna PATH się przeładowała. Po ponownym zalogowaniu możemy uruchomić nasz pierwszy kontener.

    $ lxc launch ubuntu:18.04 <nazwa kontenera>
    

Jak widać powyżej nie trzeba władać potężnymi serwera, aby móc korzystać z usług konteneryzacji. W tym przypadku jest LXD, ale równie dobrze może być np. Docker.

~xf0r3m