−25%

na Windows przy płatności rocznej, do 31.10. Do planów

EQVPS
Zacznij

Jak skonfigurować VPS z Alpine Linux: apk, doas, OpenRC i zapora

Pierwsze kroki na świeżym VPS z Alpine Linux 3.21: aktualizacja i restart, użytkownik z doas, który naprawdę może się zalogować, wyłączenie logowania SSH dla roota i hasłem, ufw, cron i codzienne aktualizacje. Do tego port Dockera, którego ufw nie blokuje.

Alpine Linux to najmniejszy obraz w naszej ofercie. Na naszych serwerach świeży Alpine 3.21 zajmował w spoczynku 55 MB RAM i 153 MB dysku, a Ubuntu 24.04 — 313 MB i 2,7 GB. Ceną jest rezygnacja z dobrze znanych narzędzi. Alpine używa apk zamiast apt, doas zamiast sudo, OpenRC zamiast systemd i musl zamiast glibc.

Poniższe kroki to te same pierwsze dziesięć minut co na Debianie czy Ubuntu, przełożone na Alpine. Przed publikacją wykonaliśmy każde polecenie na naszym obrazie Alpine 3.21, a dwa z nich za pierwszym razem nas zaskoczyły. Zaloguj się jako root hasłem z panelu.

1. Zaktualizuj i raz zrestartuj

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

Serwer zainstalował dostępne aktualizacje już przy pierwszym uruchomieniu, więc apk upgrade zwykle nie ma wiele do zrobienia. Patrz raczej na dwa ostatnie wiersze. Jeśli ta pierwsza aktualizacja przyniosła nowe jądro, działające jądro (uname -r) nie ma już swoich modułów na dysku. Wszystko, co ładuje moduł, będzie się wtedy wysypywać aż do restartu. Na naszym serwerze testowym instalacja zapory wypisała ERROR: Couldn't determine iptables version. Jeśli wersje się różnią, zrestartuj teraz:

reboot

Nasz serwer testowy wrócił w niecałą minutę.

2. Utwórz użytkownika, który może się zalogować

adduser -D deploy
passwd deploy
adduser deploy wheel

Nie pomijaj passwd. adduser -D tworzy konto bez hasła, Alpine oznacza je jako zablokowane, a sshd odrzuca zablokowane konto nawet z poprawnym kluczem. W naszym teście jedyną wskazówką był ten wiersz w /var/log/messages:

User deploy not allowed because account is locked

Hasło przyda się też później: o nie zapyta doas.

Jeśli przy zamawianiu serwera dodałeś klucz SSH, znajduje się on w authorized_keys roota. Skopiuj go nowemu użytkownikowi:

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

Nie masz jeszcze klucza? Utwórz go na swoim komputerze i wklej część publiczną do /home/deploy/.ssh/authorized_keys.

3. Niech doas pyta o hasło

Alpine używa doas zamiast sudo, a nasz obraz już pozwala na to grupie wheel. Reguła w /etc/doas.d/wheel.conf to permit nopass :wheel, czyli każdy członek wheel zostaje rootem bez wpisywania czegokolwiek. Niech pyta o hasło i pamięta je przez kilka minut:

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

Od teraz doas apk add nano działa tak, jak sudo apt install nano na Ubuntu.

4. SSH: tylko klucze, bez roota

sshd czyta pliki z /etc/ssh/sshd_config.d/ w kolejności nazw i dla każdego ustawienia zachowuje pierwszą znalezioną wartość. W naszym obrazie pierwszym plikiem jest 00-eqvps.conf, który pozwala na logowanie roota i hasłem, żebyś pierwszego dnia mógł wejść. Zastąp jego zawartość:

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

Trzeci wiersz ma znaczenie na Alpine. Obraz używa wersji OpenSSH z PAM i przy samych dwóch pierwszych wierszach nasz serwer testowy wciąż oferował logowanie keyboard-interactive. Ze wszystkimi trzema próba logowania bez klucza dostaje:

Permission denied (publickey).

Nie zamykaj sesji roota. W drugim terminalu sprawdź, czy działa ssh deploy@YOUR.SERVER.IP (na planie z NAT dodaj -p i osobisty port z panelu) i czy doas id przyjmuje hasło.

5. Zapora: ufw

ufw jest w repozytorium community, które w naszym obrazie jest włączone:

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

limit przepuszcza SSH, ale spowalnia każdego, kto otwiera wiele połączeń pod rząd. rc-update jest tu ważne, bo OpenRC nie uruchomi zapory po restarcie, dopóki nie dodasz jej do runlevelu. Po restarcie nasz serwer wrócił ze Status: active. Na planie z NAT zostaw SSH na porcie 22: twój osobisty port zewnętrzny jest przekierowany na 22 wewnątrz serwera. Na planie z własnym IPv4 otwieraj porty WWW, gdy ich potrzebujesz (ufw allow 80/tcp, ufw allow 443/tcp). Resztę opisuje poradnik ufw.

6. Włącz cron i codzienne aktualizacje

Świeży Alpine w ogóle nie uruchamia crona. Włącz go:

rc-update add crond default
rc-service crond start

crontab roota w Alpine już uruchamia wszystko z /etc/periodic/daily o 02:00. Wrzuć tam skrypt aktualizacji:

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

Ostatnie polecenie wypisuje skrypty, które uruchomi cron, i twój powinien być na liście. Tak dostajesz poprawki dla 3.21. Przejście na kolejne wydanie Alpine to osobny, ręczny krok. Aktualizacje jądra nadal wymagają restartu: co jakiś czas powtórz sprawdzenie uname -r / ls /lib/modules z kroku 1.

7. OpenRC w jednej tabeli

Jeśli znasz systemd, to prawie wszystko, co się zmienia:

ZadaniesystemdAlpine (OpenRC)
Uruchom usługęsystemctl start nginxrc-service nginx start
Uruchamiaj przy starciesystemctl enable nginxrc-update add nginx default
Stansystemctl status nginxrc-service nginx status
Co działasystemctl list-unitsrc-status
Log systemowyjournalctl/var/log/messages

8. Docker i port, którego ufw nie blokuje

Alpine to dobry host dla Dockera, bo sam system prawie nie przeszkadza:

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

Na naszym serwerze zajęło to 12 sekund razem z pobieraniem. Z działającym demonem Dockera zajęta pamięć wzrosła z 57 MB do 124 MB.

Pułapka, która nie dotyczy tylko Alpine: Docker zapisuje własne reguły zapory. Gdy ufw przepuszczał tylko SSH, uruchomiliśmy nginx z -p 8080:80 i dostaliśmy się do niego spoza serwera na porcie 8080. ufw go nie zablokował. Jeśli kontener ma być dostępny tylko przez reverse proxy na tym samym serwerze, publikuj go na localhost:

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

Jaki plan

Alpine zostawia prawie cały RAM twojemu oprogramowaniu. Plan Nano (2 vCPU, 1 GB, 15 GB, $3/mies.) wystarczy na małą usługę albo kilka kontenerów. To plan z NAT, więc SSH wchodzi przez osobisty port. Jeśli porty 80 i 443 mają być otwarte do internetu, Nano-IP ma własny IPv4 za $8/mies. Na cięższe stosy Dockera Micro daje 2 GB za $5/mies.

Alpine 3.21 jest na stronie Alpine VPS i dostępny na każdym planie z Linuksem w dziale VPS. Płatność w USDT, USDC lub ETH w sieciach Base, Ethereum lub Polygon, bez dokumentów i karty.

FAQ

Dlaczego Alpine jest o tyle mniejszy od Ubuntu czy Debiana?

Używa musl zamiast glibc, BusyBox do podstawowych poleceń i OpenRC zamiast systemd. Na naszych serwerach świeży Alpine 3.21 zajmował w spoczynku 55 MB RAM i 153 MB dysku. Ubuntu 24.04 zajmowało 313 MB i 2,7 GB.

Dlaczego nowy użytkownik dostaje „account is locked”, choć klucz jest poprawny?

adduser -D tworzy konto bez hasła, Alpine oznacza je jako zablokowane, a sshd odrzuca takiego użytkownika nawet z poprawnym kluczem. W logu pojawia się wiersz „User deploy not allowed because account is locked”. Nadaj użytkownikowi hasło poleceniem passwd, a logowanie kluczem zacznie działać.

Dlaczego tunel SSH nie działa na Alpine?

Domyślny plik /etc/ssh/sshd_config w Alpine ustawia AllowTcpForwarding no, więc przekierowania ssh -L są odrzucane. Jeśli potrzebujesz tuneli, zmień wartość na yes w tym pliku i uruchom rc-service sshd restart.

Czy mój program zadziała na Alpine?

Wszystko z repozytoriów Alpine zadziała, podobnie jak kontenery Dockera zbudowane na dowolnym obrazie bazowym. Gotowe binaria Linuksa skompilowane pod glibc często nie startują na musl. Szukaj wersji dla Alpine lub musl albo uruchom program w Dockerze. Pakiet gcompat pomaga przy niektórych prostych binariach glibc.

Jaki plan wystarczy dla Alpine?

Plan Nano z 1 GB za $3 miesięcznie ma duży zapas: sam system zajmuje około 55 MB. Jeśli porty 80 i 443 mają być otwarte do internetu, wybierz Nano-IP za $8 miesięcznie, z własnym IPv4.

Komentarze

Brak komentarzy. Bądź pierwszy.

Zostaw komentarz

Komentarze są moderowane przed pojawieniem się.