Raspberry Pi: setup, Docker, Pi-Hole ja WireGuard

Sain aikaiseksi hommata Raspberry Pi:n, jolla olisi tarkoitus pistää pystyyn pienimuotoinen homelab. Laite on Raspberry Pi 5 model B, 4 Gt muistilla. Raspberry Pihin otettu yhteyttä Debian 12 pyörittävällä läppärillä, paitsi kohdissa Docker asennus, Pi-Hole, jossa otettu laitteeseen yhteyttä M2 MacBook Airilla, jossa käyttöjärjestelmänä toiminut macOS Sequoia 15.3.2.

Käyttöjärjestelmän setup

Asensin Raspberry Pi Imager sovelluksen tiedoston imager_1.8.5_amd64.deb sivustolta https://www.raspberrypi.com/software/ , jotta laitteelle saadaan käyttöjärjestelmä asennettua. Samalla syötin micro-sd kortin kortinlukijaan ja lukijan tietokoneeseen.

Asensin tämän jälkeen .deb tiedoston.

qownnotes-media-BiJPTo

Avasin sovelluksen ja sovelluksessa valitsin oman laitteeni, käyttöjärjestelmäksi Raspberry Pi OS (64-BIT) ja muistikortin, johon käyttöjärjestelmä kirjoitetaan. Ctrl+Shift+X sain auki lisäasetukset. General valikosta lisäsin WLANin tiedot, muut tiedot oletuksena.

qownnotes-media-KJXMrL

Services valikosta kytkin SSH:n päälle, jotta laitteen setup saataisiin etänä tehtyä. Generoin itselleni uuden SSH-avainparin.

qownnotes-media-RjKfMZ

Ja syötin julkisen avaimen ohjelmalle.

qownnotes-media-TFMhTm

Tallensin asetukset ja aloitin järjestelmän kirjoittamisen.

qownnotes-media-xFzJLU

Kirjoitus valmistui, poistin kortin lukijasta ja liitin sen Raspberryyn. Liitin seuraavaksi laitteen virtajohtoon ja painoin virtanapista. Virtajohtojen huonon saatavuuden vuoksi käytin puhelimen laturia virtajohtona, jonka pitäisi täyttää minimi virtavaatimukset.

Seuraavaksi yritin ottaa yhteyttä laitteeseen.

qownnotes-media-iKXlpY

Sain virheen väärästä avaimesta, jonka uskoin johtuvan koneella olevasta useasta avaimesta. Määrittämällä avaimen polun komennolla ssh -o "IdentitiesOnly=yes" -i ~/.ssh/id_rsa_rpi -v raspberrypi, pääsin kirjautumaan sisään.

qownnotes-media-pSESKQ

SSH-avain määritys hostille

Koska en halua joka kerta syöttää pitkää komentoa kirjautumiseen, niin lisäsin ~/.ssh kansioon config-tiedoston, jossa määritellään mitä avainta käytetään tiettyyn hostiin. Tein config-tiedostoon seuraavat määritykset:

qownnotes-media-xcMgsS

ja kokeilin yhdistämistä, joka toimi oikein.

qownnotes-media-gGhsLG

Rootin poistaminen käytöstä

Tietoturvasyistä poistin root-käyttäjän käytöstä. Ensin lukitsin käyttäjän komennolla sudo usermod --lock root, jonka jälkeen poistin ssh kirjautumisen komennolla sudoedit /etc/ssh/sshd_config ja vaihtamalla kohdan "PermitRootLogin" arvoksi "no".

Docker asennus

Päivitin tässä kohtaa paketit ja järjestelmän sudo apt-get update ja sudo apt-get dist-upgrade, jonka jälkeen reboottasin laitteen komennolla sudo reboot. Annoin tämän jälkeen laitteelle staattisen IP-osoitteen kotiverkon reitittimeltä DHCP asetuksista.

Docker on yksinkertaisuudessaan virtualisointialusta, joka mahdollistaa sovellusten ajamisen omissa konteissaan (container), muista eristettynä. Dockerin rinnalle asennan Portainerin, joka helpottaa konttien hallintaa verkkokäyttöliittymän avulla.

Asennuksen aloittamiseksi kävin silmäilemässä https://get.docker.com/ sivun sisältämän asennus-skriptin selaimella, ja ajoin tämän jälkeen skriptin raspberryllä.

qownnotes-media-fPlwgL

Varmistin, että asennus onnistui komennolla docker. Seuraavaksi täytyi lisätä oma käyttäjä ryhmään docker, ohjelman ajamiseksi, joka onnistui komennolla sudo usermod -aG docker lassi. Asensin tämän jälkeen Portainer Community Editionin.

qownnotes-media-qvtNUO

Portainer on nyt asennettuna ja sen käynnistämiseksi kontissa annoin seuraavan komennon.

qownnotes-media-eCHidK

Kohta:
docker run -d käskee luomaan uuden docker kontin.
-p 9000:9000 määrittää kontin käyttämät portit.
--name=docker määrittää kontin nimen.
--restart=alwaysmäärittää kontin uudelleenkäynnistämään tarvittaessa.
-v /var/run..., -v portainer... määrittää tallennustilaa.
portainer/portainer-ce:linux-arm kertoo mikä kontti ajetaan.

Avasin selaimen, siirryin osoitteeseen http://192.168.1.109:9000 ja avautui sivu, jossa oli seuraava ilmoitus.

qownnotes-media-MFQxIQ

En ollut varma kuinka käynnistää vain portainer uudelleen, joten annoin komennon sudo systemctl restart docker koko dockerin reboottaamiseksi.

Latasin sivun uudelleen ja se näytti seuraavalta.

qownnotes-media-XzyFbJ

Loin uuden pääkäyttäjän ja kirjauduin sillä sisään.

Pi-Hole

Seuraavaksi vuorossa Pi-Hole asennus konttiin. Portainerin web-käyttöliittymässä navigoin Containers-sivulle, josta klikkasin "Add container".

qownnotes-media-VTLKYM

Kontin nimeksi annoin Pi-Hole ja asennuskuvaksi (image) pihole/pihole:latest. Määritin portit 53 (TCP ja UDP, DNS), 67 (UDP, DHCP), 80 (TCP, HTTP) ja 443 (TCP, HTTPS).

qownnotes-media-IvPjOY

Määritin kontin tallennustilan.

qownnotes-media-uPXrwg

Määritin Pi-Holen aikavyöhykkeen.

qownnotes-media-hiRGbR

Määritin Pi-Hole kontin olemaan aina käynnissä.

qownnotes-media-fWTIcx

Määritysten jälkeen klikkasin "Deploy the container" -nappia ja siirryin portainerissa Pi-Holen terminaaliin, jossa määritin salasanan komennolla sudo pihole setpassword tähänomasalasana. Seuraavaksi siirryin selaimella osoitteeseen http://192.168.1.109/admin/ .

qownnotes-media-bhJGtV

Ja kirjauduin sisään juuri asettamallani salasanalla.

qownnotes-media-mTrwsf

Sain Pi-Holen pyörimään, mutta se ei vastaanottanut dns kyselyitä, vaikka reitittimeltä verkon DNS-palvelin oli asetettu raspberryn osoitteeseen. Tutkin syitä ja huomasin Tools -> Pi-Hole diagnostics sivulla uuden ilmoituksen.

qownnotes-media-GfQaws

Kyselyitä ei vastaanotettu, sillä ne tulivat sisäverkon ulkoa. Tosiasiassa osoite 192.168.1.x kuuluu sisäverkkooni, joten vaihdoin Pi-Hole asetuksista sovelluksen vastaamaan kaikkiin pyyntöihin, jotka saapuvat eth0-porttiin.

qownnotes-media-mMiOxX

Tämän jälkeen Pi-Hole alkoi pelittämään, niin kuin sen kuuluu.

WireGuard VPN

Tämä kohta kirjoitettu pääasiassa muistista, joten ei välttämättä 100% oikein.

WireGuard on tämän hetken (maaliskuu 2025) johtava VPN protokolla. Asensin WireGuard palvelimen artikkelin https://docs.pi-hole.net/guides/vpn/wireguard/server/ mukaan raspberrylle. Otin ssh-yhteyden raspberryyn, päivitin paketit ja asensin wireguardin sudo apt-get install wireguard wireguard-tools.

Siirryin root-käyttäjälle sudo -i ja ja vaihdoin hakemistoa cd /etc/wireguard. Loin avainparin palvelimelle wg genkey | tee server.key | wg pubkey > server.pub.

Seuraavaksi loin wireguard konfiguraatiotiedoston micro wg0.conf, jonne lisäsin seuraavan:

Screenshot_20250331_185724

Ajoin alla olevan komennon salaisen avaimen viemiseksi konfiguraatiotiedostoon.

echo "PrivateKey = $(cat server.key)" >> /etc/wireguard/wg0.conf

Tämän jälkeen asetin reitittemeni portin 47111 ohjaamaan suoraan raspberryn porttiin 47111, jotta ulkoverkosta tuleva VPN-yhteys ohjataan oikeaan paikkaan.

Tein loppusäädöt ja käynnistin demonin:

sudo systemctl enable wg-quick@wg0.service
sudo systemctl daemon-reload
sudo systemctl start wg-quick@wg0

Jotta laitteita saadaan yhdistettyä wireguard-palvelimeen tulee wg0.conf-tiedostoon lisätä uuden laitteen konfiguraatio, sekä laitteeseen lisätä palvelimen tiedot. Näiden käsin asettaminen on hieman työlästä, joten kopioin sivulta https://docs.pi-hole.net/guides/vpn/wireguard/client/ bash-scriptin tämän automatisoimiseksi. Lisäksi scripti luo qr-koodin, jolla laitteita on helppo liittää.

Kyseinen scripti näyttää seuraavalta:

Screenshot_20250331_191151

Kopioin scriptin omaan kotihakemistooni nimellä "add_wireguard_clients.sh" ja lisäsin siihen ajo-oikeudet kaikille käyttäjille chmod ugo+x add_wireguard_clients.sh. Latasin myös qrencode-sovelluksen, jotta qr-koodi toimisi, sudo apt-get install -Y qrencode.

Tämän jälkeen siirryin taas root-käyttäjälle ja hakemistoon /etc/wireguard/. Ajoin scriptin ja annoin sille haluamani muuttujat: /home/lassi/add_wireguard_clients.sh "10.100.0." "fd08:4711::" "<reitittimen_ip_tai_domain>:47111" 2 "lassi-mac".

Pääasiallinen laite, jolla tulisin WireGuardia käyttämään on MacBook Air, joten asensin tälle WireGuard-sovelluksen App Storesta. Otin tämän jälkeen MacBookilla ssh-yhteyden raspberryyn ja kopioin tiedoston /etc/wireguard/lassi-mac.conf sisällön. Avasin WireGuard-sovelluksen, valitsin "Lisää tyhjä tunneli..." ja liitin tiedoston sisällön tähän. Lopuksi yhteys päälle aktivointinapista. Yhteyden pitäisi nyt toimia myös käyttäen Pi-Holea ilman lisäkikkailuja.

Jos VPN-yhteys ei tomi (netti ei toimi/nettiin pääsee, mutta liikenne ei kulje VPN:n kautta), niin vaihda Wireguard asetus "AllowedIP" arvoon "0.0.0.0/0, ::/0". Jos se ei edelleen toimi ja tähän asti kaikki oikein, niin ongelmana voi olla palvelimen NAT määritykset.

Lassi Hirvonen 31.3.2025