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.
- 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ść.
- 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 wybieramy4 Localisation Options
->I4 Change Wi-Fi Country
->PL Poland
potwierdzamyOK
. Zostaniemy poinformowani o ustawieniu lokalizacji. - Aktualizacja systemu
Teraz zainstalujemy aktualizacje systemu i przejdziemy do konfiguracji połączenia z Internetem.
$ sudo apt update $ sudo apt upgrade
- 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.
- 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
- Tworzymy katalog 'mediatek' na /lib/firmware.
$ sudo mkdir /lib/firmware/mediatek
- Kopiujemy sterownik do naszego nowo utworzonego katalogu.
$ sudo cp mediatek/mt7610u.bin /lib/firmware/mediatek/
- 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
- 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
- Pobieramy paczke oficjalnego firmware-u i przechodzimy do pobranego katalogu (jeśli nie ma git, to instalujemy go z repozytorium
- 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
- 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
- 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
- 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.
- sieć otwarta -
- 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 grupylxd
, 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