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.
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.
Services valikosta kytkin SSH:n päälle, jotta laitteen setup saataisiin etänä tehtyä. Generoin itselleni uuden SSH-avainparin.
Ja syötin julkisen avaimen ohjelmalle.
Tallensin asetukset ja aloitin järjestelmän kirjoittamisen.
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.
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.
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:
ja kokeilin yhdistämistä, joka toimi oikein.
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ä.
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.
Portainer on nyt asennettuna ja sen käynnistämiseksi kontissa annoin seuraavan komennon.
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=always
mää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.
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.
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".
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).
Määritin kontin tallennustilan.
Määritin Pi-Holen aikavyöhykkeen.
Määritin Pi-Hole kontin olemaan aina käynnissä.
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/ .
Ja kirjauduin sisään juuri asettamallani salasanalla.
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.
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.
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:
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:
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