−25%

auf Windows bei Jahreszahlung, bis 31.10. Zu den Tarifen

EQVPS
Loslegen

Alpine-Linux-VPS einrichten: apk, doas, OpenRC und eine Firewall

Die ersten Schritte auf einem frischen VPS mit Alpine Linux 3.21: aktualisieren und neu starten, einen doas-Benutzer anlegen, der sich wirklich anmelden kann, Root- und Passwort-Login per SSH abschalten, ufw einrichten, cron und tägliche Updates aktivieren. Dazu der Docker-Port, den ufw nicht blockiert.

Alpine Linux ist das kleinste Image, das wir anbieten. Auf unseren Servern belegte ein frisches Alpine 3.21 im Leerlauf 55 MB RAM und 153 MB Festplatte, Ubuntu 24.04 dagegen 313 MB und 2,7 GB. Dafür verzichten Sie auf die gewohnten Werkzeuge. Alpine nutzt apk statt apt, doas statt sudo, OpenRC statt systemd und musl statt glibc.

Die Schritte unten sind dieselben ersten zehn Minuten wie bei Debian oder Ubuntu, übertragen auf Alpine. Wir haben jeden Befehl vor der Veröffentlichung auf unserem Alpine-3.21-Image ausgeführt, und zwei davon haben uns beim ersten Mal erwischt. Melden Sie sich als root mit dem Passwort aus Ihrem Dashboard an.

1. Aktualisieren und einmal neu starten

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

Ihr Server hat die verfügbaren Updates schon beim ersten Start installiert, deshalb hat apk upgrade meist kaum noch etwas zu tun. Achten Sie stattdessen auf die letzten beiden Zeilen. Hat dieses erste Update einen neuen Kernel gebracht, liegen die Module des laufenden Kernels (uname -r) nicht mehr auf der Platte. Alles, was ein Modul lädt, schlägt dann bis zum Neustart fehl. Auf unserem Testserver meldete die Firewall-Installation ERROR: Couldn't determine iptables version. Wenn die beiden Versionen nicht übereinstimmen, starten Sie jetzt neu:

reboot

Unser Testserver war nach weniger als einer Minute wieder da.

2. Einen Benutzer anlegen, der sich anmelden kann

adduser -D deploy
passwd deploy
adduser deploy wheel

Lassen Sie passwd nicht weg. adduser -D legt das Konto ohne Passwort an, Alpine markiert es als gesperrt, und sshd lehnt ein gesperrtes Konto auch mit korrektem Schlüssel ab. In unserem Test war der einzige Hinweis diese Zeile in /var/log/messages:

User deploy not allowed because account is locked

Das Passwort brauchen Sie auch später: doas fragt danach.

Wenn Sie bei der Bestellung einen SSH-Schlüssel hinterlegt haben, steht er in den authorized_keys von root. Kopieren Sie ihn zum neuen Benutzer:

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

Noch kein Schlüssel? Erzeugen Sie einen auf Ihrem Computer und fügen Sie den öffentlichen Teil in /home/deploy/.ssh/authorized_keys ein.

3. doas nach dem Passwort fragen lassen

Alpine nutzt doas statt sudo, und unser Image erlaubt es der Gruppe wheel bereits. Die Regel in /etc/doas.d/wheel.conf lautet permit nopass :wheel, also wird jedes Mitglied von wheel root, ohne etwas einzutippen. Lassen Sie es nach dem Passwort fragen und sich dieses ein paar Minuten merken:

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

Ab jetzt funktioniert doas apk add nano so, wie sudo apt install nano unter Ubuntu.

4. SSH: nur Schlüssel, kein root

sshd liest die Dateien in /etc/ssh/sshd_config.d/ in Namensreihenfolge und behält für jede Einstellung den ersten gefundenen Wert. In unserem Image ist die erste Datei 00-eqvps.conf. Sie erlaubt Root- und Passwort-Logins, damit Sie am ersten Tag hineinkommen. Ersetzen Sie ihren Inhalt:

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) '

Die dritte Zeile ist auf Alpine wichtig. Das Image nutzt den PAM-Build von OpenSSH, und mit nur den ersten beiden Zeilen bot unser Testserver weiterhin den Login per keyboard-interactive an. Mit allen drei bekommt ein Anmeldeversuch ohne Schlüssel:

Permission denied (publickey).

Lassen Sie die Root-Sitzung offen. Prüfen Sie in einem zweiten Terminal, dass ssh deploy@YOUR.SERVER.IP funktioniert (bei einem NAT-Tarif mit -p und dem persönlichen Port aus dem Dashboard) und dass doas id das Passwort annimmt.

5. Firewall: ufw

ufw liegt im community-Repository, das in unserem Image aktiviert ist:

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

limit lässt SSH durch, bremst aber jeden aus, der viele Verbindungen hintereinander öffnet. rc-update ist hier wichtig, denn OpenRC startet die Firewall nach einem Neustart nur, wenn Sie sie zum Runlevel hinzufügen. Nach einem Neustart kam unser Server mit Status: active zurück. Bei einem NAT-Tarif lassen Sie SSH auf Port 22: Ihr persönlicher externer Port wird auf 22 im Server weitergeleitet. Bei einem Tarif mit eigener IPv4 öffnen Sie Web-Ports, wenn Sie sie brauchen (ufw allow 80/tcp, ufw allow 443/tcp). Den Rest erklärt die ufw-Anleitung.

6. cron und tägliche Updates einschalten

Ein frischer Alpine-Server führt überhaupt kein cron aus. Schalten Sie es ein:

rc-update add crond default
rc-service crond start

Die root-crontab von Alpine startet bereits alles in /etc/periodic/daily um 02:00 Uhr. Legen Sie dort ein Update-Skript ab:

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

Der letzte Befehl listet die Skripte, die cron ausführen wird, und Ihres sollte dabei sein. So bekommen Sie die Fehlerbehebungen für 3.21. Der Wechsel zum nächsten Alpine-Release ist ein eigener, manueller Schritt. Kernel-Updates brauchen weiterhin einen Neustart: Wiederholen Sie die Prüfung uname -r / ls /lib/modules aus Schritt 1 ab und zu.

7. OpenRC in einer Tabelle

Wenn Sie systemd kennen, ist das fast alles, was sich ändert:

AufgabesystemdAlpine (OpenRC)
Dienst startensystemctl start nginxrc-service nginx start
Beim Booten startensystemctl enable nginxrc-update add nginx default
Statussystemctl status nginxrc-service nginx status
Was läuftsystemctl list-unitsrc-status
Systemlogjournalctl/var/log/messages

8. Docker und der Port, den ufw nicht blockiert

Alpine ist ein guter Docker-Host, weil das System selbst kaum im Weg steht:

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

Auf unserem Server dauerte das 12 Sekunden inklusive Download. Mit laufendem Docker-Daemon stieg der belegte Speicher von 57 MB auf 124 MB.

Eine Falle, die nicht nur Alpine betrifft: Docker schreibt eigene Firewall-Regeln. Während ufw nur SSH erlaubte, starteten wir nginx mit -p 8080:80 und erreichten es von außerhalb des Servers auf Port 8080. ufw blockierte es nicht. Soll ein Container nur über einen Reverse Proxy auf demselben Server erreichbar sein, veröffentlichen Sie ihn auf localhost:

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

Welcher Tarif

Alpine lässt fast den ganzen RAM Ihrer eigenen Software. Der Tarif Nano (2 vCPU, 1 GB, 15 GB, $3/Monat) reicht für einen kleinen Dienst oder ein paar Container. Es ist ein NAT-Tarif, SSH kommt also über einen persönlichen Port herein. Wenn die Ports 80 und 443 aus dem Internet erreichbar sein müssen, hat Nano-IP eine eigene IPv4 für $8/Monat. Für schwerere Docker-Stacks bietet Micro 2 GB für $5/Monat.

Alpine 3.21 steht auf der Alpine-VPS-Seite und ist bei jedem Linux-Tarif unter VPS verfügbar. Bezahlt wird in USDT, USDC oder ETH auf Base, Ethereum oder Polygon, ohne Ausweis und ohne Karte.

FAQ

Warum ist Alpine so viel kleiner als Ubuntu oder Debian?

Es nutzt musl statt glibc, BusyBox für die Grundbefehle und OpenRC statt systemd. Auf unseren Servern belegte ein frisches Alpine 3.21 im Leerlauf 55 MB RAM und 153 MB Festplatte. Ubuntu 24.04 belegte 313 MB und 2,7 GB.

Warum bekommt mein neuer Benutzer „account is locked“, obwohl der Schlüssel stimmt?

adduser -D legt das Konto ohne Passwort an, Alpine markiert es als gesperrt, und sshd lehnt diesen Benutzer dann auch mit gültigem Schlüssel ab. Im Log steht „User deploy not allowed because account is locked“. Geben Sie dem Benutzer mit passwd ein Passwort, dann funktioniert der Schlüssel-Login.

Warum funktioniert ein SSH-Tunnel auf Alpine nicht?

Alpines Standard-/etc/ssh/sshd_config setzt AllowTcpForwarding no, deshalb werden ssh -L-Weiterleitungen abgelehnt. Wenn Sie Tunnel brauchen, ändern Sie den Wert in dieser Datei auf yes und führen Sie rc-service sshd restart aus.

Läuft mein Programm auf Alpine?

Alles aus den Alpine-Paketquellen läuft, ebenso Docker-Container auf beliebigem Basis-Image. Fertige Linux-Binärdateien, die für glibc gebaut wurden, starten auf musl oft nicht. Suchen Sie nach einem Build für Alpine oder musl oder starten Sie das Programm in Docker. Das Paket gcompat hilft bei manchen einfachen glibc-Binärdateien.

Welcher Tarif reicht für Alpine?

Der Tarif Nano mit 1 GB für $3 im Monat hat reichlich Platz: Das System selbst braucht etwa 55 MB. Wenn die Ports 80 und 443 aus dem Internet erreichbar sein müssen, nehmen Sie Nano-IP für $8 im Monat mit eigener IPv4.

Kommentare

Noch keine Kommentare. Sei der Erste.

Kommentar hinterlassen

Kommentare werden vor der Anzeige moderiert.