−25%

su Windows con pagamento annuale, fino al 31/10. Vai ai piani

EQVPS
Inizia

Come configurare un VPS Alpine Linux: apk, doas, OpenRC e un firewall

I primi passi su un VPS Alpine Linux 3.21 appena creato: aggiornare e riavviare, creare un utente doas che riesca davvero ad accedere, disattivare l'accesso SSH di root e con password, installare ufw, attivare cron e gli aggiornamenti giornalieri. Con la porta Docker che ufw non blocca.

Alpine Linux è l'immagine più piccola che offriamo. Sui nostri server un Alpine 3.21 appena installato occupava a riposo 55 MB di RAM e 153 MB di disco, contro 313 MB e 2,7 GB di Ubuntu 24.04. In cambio rinunci agli strumenti abituali. Alpine usa apk invece di apt, doas invece di sudo, OpenRC invece di systemd e musl invece di glibc.

I passi qui sotto sono gli stessi primi dieci minuti di Debian o Ubuntu, tradotti per Alpine. Abbiamo eseguito ogni comando sulla nostra immagine Alpine 3.21 prima di pubblicare, e due ci hanno colto di sorpresa la prima volta. Accedi come root con la password del tuo pannello.

1. Aggiorna, poi riavvia una volta

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

Il server ha già installato gli aggiornamenti disponibili al primo avvio, quindi di solito apk upgrade ha poco da fare. Guarda piuttosto le ultime due righe. Se quel primo aggiornamento ha portato un nuovo kernel, il kernel in esecuzione (uname -r) non ha più i suoi moduli sul disco. Tutto ciò che carica un modulo fallisce finché non riavvii. Sul nostro server di prova l'installazione del firewall ha stampato ERROR: Couldn't determine iptables version. Se le due versioni sono diverse, riavvia adesso:

reboot

Il nostro server di prova è tornato in meno di un minuto.

2. Crea un utente che possa accedere

adduser -D deploy
passwd deploy
adduser deploy wheel

Non saltare passwd. adduser -D crea l'account senza password, Alpine lo segna come bloccato e sshd rifiuta un account bloccato anche con la chiave corretta. Nel nostro test l'unico indizio era questa riga in /var/log/messages:

User deploy not allowed because account is locked

La password serve anche dopo: è quella che chiederà doas.

Se hai aggiunto una chiave SSH quando hai ordinato il server, si trova nell'authorized_keys di root. Copiala al nuovo utente:

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

Non hai ancora una chiave? Creane una sul tuo computer e incolla la parte pubblica in /home/deploy/.ssh/authorized_keys.

3. Fai chiedere la password a doas

Alpine usa doas invece di sudo, e la nostra immagine lo concede già al gruppo wheel. La regola in /etc/doas.d/wheel.conf è permit nopass :wheel, quindi qualsiasi membro di wheel diventa root senza digitare nulla. Fai in modo che chieda la password e la ricordi per qualche minuto:

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

D'ora in poi doas apk add nano funziona come sudo apt install nano su Ubuntu.

4. SSH: solo chiavi, niente root

sshd legge i file in /etc/ssh/sshd_config.d/ in ordine di nome e tiene il primo valore che trova per ogni impostazione. Nella nostra immagine il primo file è 00-eqvps.conf, che consente l'accesso di root e con password perché tu possa entrare il primo giorno. Sostituiscine il contenuto:

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

La terza riga conta su Alpine. L'immagine usa la build di OpenSSH con PAM, e con le sole prime due righe il nostro server di prova offriva ancora l'accesso keyboard-interactive. Con tutte e tre, un tentativo senza chiave riceve:

Permission denied (publickey).

Tieni aperta la sessione di root. In un secondo terminale verifica che ssh deploy@YOUR.SERVER.IP funzioni (su un piano NAT aggiungi -p e la porta personale del pannello) e che doas id accetti la password.

5. Firewall: ufw

ufw si trova nel repository community, già attivo sulla nostra immagine:

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

limit lascia passare SSH ma rallenta chi apre molte connessioni di fila. rc-update è importante qui, perché OpenRC non avvia il firewall dopo un riavvio se non lo aggiungi al runlevel. Dopo un riavvio il nostro server è tornato con Status: active. Su un piano NAT lascia SSH sulla porta 22: la tua porta esterna personale è inoltrata alla 22 dentro il server. Su un piano con IPv4 propria apri le porte web quando ti servono (ufw allow 80/tcp, ufw allow 443/tcp). La guida a ufw copre il resto.

6. Attiva cron e gli aggiornamenti giornalieri

Un Alpine appena installato non esegue alcun cron. Attivalo:

rc-update add crond default
rc-service crond start

Il crontab di root su Alpine esegue già tutto ciò che sta in /etc/periodic/daily alle 02:00. Metti lì uno script di aggiornamento:

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

L'ultimo comando elenca gli script che cron eseguirà, e il tuo dovrebbe esserci. Così ricevi le correzioni per la 3.21. Passare alla versione successiva di Alpine è un passo separato e manuale. Gli aggiornamenti del kernel richiedono comunque un riavvio: ripeti ogni tanto il controllo uname -r / ls /lib/modules del passo 1.

7. OpenRC in una tabella

Se conosci systemd, ecco quasi tutto ciò che cambia:

OperazionesystemdAlpine (OpenRC)
Avviare un serviziosystemctl start nginxrc-service nginx start
Avvio al bootsystemctl enable nginxrc-update add nginx default
Statosystemctl status nginxrc-service nginx status
Cosa è in esecuzionesystemctl list-unitsrc-status
Log di sistemajournalctl/var/log/messages

8. Docker, e la porta che ufw non blocca

Alpine è un buon host Docker, perché il sistema stesso non dà fastidio:

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

Sul nostro server ci sono voluti 12 secondi, download compreso. Con il demone Docker attivo, la memoria usata è passata da 57 MB a 124 MB.

Una trappola che non riguarda solo Alpine: Docker scrive le proprie regole del firewall. Con ufw che consentiva solo SSH, abbiamo avviato nginx con -p 8080:80 e l'abbiamo raggiunto dall'esterno del server sulla porta 8080. ufw non l'ha bloccato. Se un container deve essere raggiungibile solo tramite un reverse proxy sullo stesso server, pubblicalo su localhost:

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

Quale piano

Alpine lascia quasi tutta la RAM al tuo software. Il piano Nano (2 vCPU, 1 GB, 15 GB, $3/mese) basta per un piccolo servizio o qualche container. È un piano NAT, quindi SSH arriva da una porta personale. Se ti servono le porte 80 e 443 aperte su internet, Nano-IP ha la sua IPv4 per $8/mese. Per stack Docker più pesanti, Micro offre 2 GB per $5/mese.

Alpine 3.21 è nella pagina Alpine VPS e disponibile su tutti i piani Linux in VPS. Il pagamento è in USDT, USDC o ETH su Base, Ethereum o Polygon, senza documenti né carta.

FAQ

Perché Alpine è molto più piccolo di Ubuntu o Debian?

Usa musl invece di glibc, BusyBox per i comandi di base e OpenRC invece di systemd. Sui nostri server un Alpine 3.21 appena installato occupava a riposo 55 MB di RAM e 153 MB di disco. Ubuntu 24.04 occupava 313 MB e 2,7 GB.

Perché il nuovo utente riceve "account is locked" anche con la chiave giusta?

adduser -D crea l'account senza password, Alpine lo segna come bloccato e sshd rifiuta quell'utente anche con una chiave valida. Nel log compare "User deploy not allowed because account is locked". Imposta una password con passwd e l'accesso con chiave inizia a funzionare.

Perché un tunnel SSH non funziona su Alpine?

Il /etc/ssh/sshd_config predefinito di Alpine imposta AllowTcpForwarding no, quindi gli inoltri ssh -L vengono rifiutati. Se ti servono i tunnel, cambia il valore in yes in quel file ed esegui rc-service sshd restart.

Il mio programma funzionerà su Alpine?

Tutto ciò che arriva dai repository di Alpine funziona, e così i container Docker basati su qualsiasi immagine. I binari Linux precompilati per glibc spesso non partono su musl. Cerca una build per Alpine o musl, oppure esegui il programma in Docker. Il pacchetto gcompat aiuta con alcuni binari glibc semplici.

Quale piano basta per Alpine?

Il piano Nano da 1 GB a $3 al mese ha spazio in abbondanza: il sistema stesso usa circa 55 MB. Se ti servono le porte 80 e 443 aperte su internet, scegli Nano-IP a $8 al mese, con IPv4 propria.

Commenti

Ancora nessun commento. Sii il primo.

Lascia un commento

I commenti sono moderati prima di comparire.