−25%

op Windows bij jaarbetaling, tot 31/10. Naar de pakketten

EQVPS
Aan de slag

Een Alpine Linux-VPS inrichten: apk, doas, OpenRC en een firewall

De eerste stappen op een verse VPS met Alpine Linux 3.21: bijwerken en herstarten, een doas-gebruiker maken die echt kan inloggen, SSH-login voor root en met wachtwoord uitzetten, ufw installeren, cron en dagelijkse updates aanzetten. Inclusief de Docker-poort die ufw niet tegenhoudt.

Alpine Linux is de kleinste image die we aanbieden. Op onze servers gebruikte een verse Alpine 3.21 in rust 55 MB RAM en 153 MB schijf, tegen 313 MB en 2,7 GB voor Ubuntu 24.04. Daarvoor lever je de vertrouwde tools in. Alpine gebruikt apk in plaats van apt, doas in plaats van sudo, OpenRC in plaats van systemd en musl in plaats van glibc.

De stappen hieronder zijn dezelfde eerste tien minuten als op Debian of Ubuntu, vertaald naar Alpine. We hebben elk commando vóór publicatie op onze Alpine 3.21-image uitgevoerd, en twee ervan zetten ons de eerste keer op het verkeerde been. Log in als root met het wachtwoord uit je dashboard.

1. Bijwerken en één keer herstarten

apk update && apk upgrade
uname -r
ls /lib/modules

Je server heeft de beschikbare updates al bij de eerste start geïnstalleerd, dus apk upgrade heeft meestal weinig meer te doen. Kijk liever naar de laatste twee regels. Als die eerste update een nieuwe kernel bracht, staan de modules van de draaiende kernel (uname -r) niet meer op schijf. Alles wat een module laadt, faalt dan tot je herstart. Op onze testserver gaf de installatie van de firewall ERROR: Couldn't determine iptables version. Verschillen de twee versies, herstart dan nu:

reboot

Onze testserver was binnen een minuut terug.

2. Maak een gebruiker die kan inloggen

adduser -D deploy
passwd deploy
adduser deploy wheel

Sla passwd niet over. adduser -D maakt het account zonder wachtwoord aan, Alpine markeert het als vergrendeld, en sshd weigert een vergrendeld account zelfs met de juiste sleutel. In onze test was de enige aanwijzing deze regel in /var/log/messages:

User deploy not allowed because account is locked

Het wachtwoord heb je later ook nodig: doas vraagt erom.

Heb je bij het bestellen van de server een SSH-sleutel toegevoegd, dan staat die in de authorized_keys van root. Kopieer hem naar de nieuwe gebruiker:

install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
install -m 600 -o deploy -g deploy /root/.ssh/authorized_keys /home/deploy/.ssh/authorized_keys

Nog geen sleutel? Maak er een op je computer en plak het publieke deel in /home/deploy/.ssh/authorized_keys.

3. Laat doas om het wachtwoord vragen

Alpine gebruikt doas in plaats van sudo, en onze image staat het al toe voor de groep wheel. De regel in /etc/doas.d/wheel.conf is permit nopass :wheel, dus elk lid van wheel wordt root zonder iets te typen. Laat het om het wachtwoord vragen en dat daarna een paar minuten onthouden:

echo 'permit persist :wheel' > /etc/doas.d/wheel.conf

Vanaf nu werkt doas apk add nano zoals sudo apt install nano op Ubuntu.

4. SSH: alleen sleutels, geen root

sshd leest de bestanden in /etc/ssh/sshd_config.d/ op naamvolgorde en houdt voor elke instelling de eerste waarde die het vindt. Op onze image is het eerste bestand 00-eqvps.conf, dat root en wachtwoorden toestaat zodat je er op dag één in komt. Vervang de inhoud:

cat > /etc/ssh/sshd_config.d/00-eqvps.conf <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
EOF
sshd -t && rc-service sshd restart
sshd -T | grep -E '^(permitrootlogin|passwordauthentication|kbdinteractiveauthentication) '

De derde regel doet ertoe op Alpine. De image draait de PAM-build van OpenSSH, en met alleen de eerste twee regels bood onze testserver nog steeds inloggen via keyboard-interactive aan. Met alle drie krijgt een inlogpoging zonder sleutel:

Permission denied (publickey).

Laat je root-sessie open. Controleer in een tweede terminal dat ssh deploy@YOUR.SERVER.IP werkt (op een NAT-pakket voeg je -p en de persoonlijke poort uit je dashboard toe) en dat doas id het wachtwoord accepteert.

5. Firewall: ufw

ufw staat in de community-repository, die op onze image al aan staat:

apk add ufw
ufw limit 22/tcp
ufw --force enable
rc-update add ufw default
ufw status

limit laat SSH door maar remt wie veel verbindingen achter elkaar opent. rc-update is hier belangrijk, want OpenRC start de firewall na een herstart pas als je hem aan het runlevel toevoegt. Na een herstart kwam onze server terug met Status: active. Laat SSH op een NAT-pakket op poort 22: je persoonlijke externe poort wordt naar 22 in de server doorgestuurd. Op een pakket met eigen IPv4 open je webpoorten wanneer je ze nodig hebt (ufw allow 80/tcp, ufw allow 443/tcp). De ufw-handleiding behandelt de rest.

6. Zet cron en dagelijkse updates aan

Een verse Alpine-server draait helemaal geen cron. Zet het aan:

rc-update add crond default
rc-service crond start

De root-crontab van Alpine draait al alles in /etc/periodic/daily om 02:00. Zet daar een updatescript neer:

cat > /etc/periodic/daily/apk-upgrade <<'EOF'
#!/bin/sh
apk upgrade --update-cache --no-progress >> /var/log/apk-auto.log 2>&1
EOF
chmod +x /etc/periodic/daily/apk-upgrade
run-parts --test /etc/periodic/daily

Het laatste commando toont de scripts die cron zal draaien, en het jouwe hoort erbij te staan. Zo krijg je de fixes voor 3.21. Overstappen naar de volgende Alpine-release is een aparte, handmatige stap. Kernelupdates hebben nog steeds een herstart nodig: herhaal af en toe de controle uname -r / ls /lib/modules uit stap 1.

7. OpenRC in één tabel

Ken je systemd, dan is dit vrijwel alles wat verandert:

TaaksystemdAlpine (OpenRC)
Dienst startensystemctl start nginxrc-service nginx start
Starten bij opstartensystemctl enable nginxrc-update add nginx default
Statussystemctl status nginxrc-service nginx status
Wat draait ersystemctl list-unitsrc-status
Systeemlogjournalctl/var/log/messages

8. Docker, en de poort die ufw niet tegenhoudt

Alpine is een goede Docker-host, omdat het systeem zelf nauwelijks in de weg zit:

apk add docker docker-cli-compose
rc-update add docker default
rc-service docker start
docker run --rm hello-world

Op onze server duurde dit 12 seconden, inclusief downloaden. Met de Docker-daemon actief steeg het gebruikte geheugen van 57 MB naar 124 MB.

Een valkuil die niet alleen voor Alpine geldt: Docker schrijft zijn eigen firewallregels. Terwijl ufw alleen SSH toestond, startten we nginx met -p 8080:80 en bereikten we het van buiten de server op poort 8080. ufw hield het niet tegen. Moet een container alleen via een reverse proxy op dezelfde server bereikbaar zijn, publiceer hem dan op localhost:

docker run -d -p 127.0.0.1:8080:80 nginx:alpine

Welk pakket

Alpine laat bijna al het RAM over aan je eigen software. Het pakket Nano (2 vCPU, 1 GB, 15 GB, $3/maand) is genoeg voor een kleine dienst of een paar containers. Het is een NAT-pakket, dus SSH komt binnen via een persoonlijke poort. Moeten poort 80 en 443 open staan naar internet, dan heeft Nano-IP een eigen IPv4 voor $8/maand. Voor zwaardere Docker-stacks geeft Micro je 2 GB voor $5/maand.

Alpine 3.21 staat op de Alpine VPS-pagina en is beschikbaar op elk Linux-pakket onder VPS. Betalen gaat in USDT, USDC of ETH op Base, Ethereum of Polygon, zonder ID of kaart.

FAQ

Waarom is Alpine zoveel kleiner dan Ubuntu of Debian?

Het gebruikt musl in plaats van glibc, BusyBox voor de basiscommando's en OpenRC in plaats van systemd. Op onze servers gebruikte een verse Alpine 3.21 in rust 55 MB RAM en 153 MB schijf. Ubuntu 24.04 gebruikte 313 MB en 2,7 GB.

Waarom krijgt mijn nieuwe gebruiker "account is locked" terwijl de sleutel klopt?

adduser -D maakt het account zonder wachtwoord aan, Alpine markeert het als vergrendeld en sshd weigert die gebruiker dan zelfs met een geldige sleutel. De logregel is "User deploy not allowed because account is locked". Geef de gebruiker een wachtwoord met passwd en inloggen met de sleutel werkt.

Waarom werkt een SSH-tunnel niet op Alpine?

De standaard /etc/ssh/sshd_config van Alpine zet AllowTcpForwarding no, dus ssh -L-doorsturingen worden geweigerd. Heb je tunnels nodig, zet de waarde in dat bestand op yes en voer rc-service sshd restart uit.

Draait mijn programma op Alpine?

Alles uit de pakketbronnen van Alpine draait, net als Docker-containers op elke basisimage. Kant-en-klare Linux-binaries die voor glibc zijn gebouwd, starten op musl vaak niet. Zoek een build voor Alpine of musl, of draai het programma in Docker. Het pakket gcompat helpt bij sommige eenvoudige glibc-binaries.

Welk pakket is genoeg voor Alpine?

Het Nano-pakket met 1 GB voor $3 per maand heeft ruim genoeg: het systeem zelf gebruikt ongeveer 55 MB. Moeten poort 80 en 443 open staan naar internet, neem dan Nano-IP voor $8 per maand, met een eigen IPv4.

Reacties

Nog geen reacties. Wees de eerste.

Laat een reactie achter

Reacties worden gemodereerd voordat ze verschijnen.