−25%

за Windows при годишно плащане, до 31.10. Към плановете

EQVPS
Започни

Как да настроите VPS с Alpine Linux: apk, doas, OpenRC и защитна стена

Първите стъпки на нов VPS с Alpine Linux 3.21: обновяване и рестарт, потребител с doas, който наистина може да влезе, изключване на SSH вход за root и с парола, ufw, cron и ежедневни обновления. Плюс портът на Docker, който ufw не спира.

Alpine Linux е най-малкият образ, който предлагаме. На нашите сървъри нов Alpine 3.21 в покой заемаше 55 MB RAM и 153 MB диск, срещу 313 MB и 2,7 GB за Ubuntu 24.04. Цената е, че се отказвате от познатите инструменти. Alpine използва apk вместо apt, doas вместо sudo, OpenRC вместо systemd и musl вместо glibc.

Стъпките по-долу са същите първи десет минути като на Debian или Ubuntu, пренесени на Alpine. Изпълнихме всяка команда на нашия образ с Alpine 3.21 преди публикуване и две от тях ни подведоха първия път. Влезте като root с паролата от панела.

1. Обновете и рестартирайте веднъж

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

Сървърът вече е инсталирал наличните обновления при първото стартиране, така че apk upgrade обикновено няма много работа. Гледайте по-скоро последните два реда. Ако онова първо обновяване е донесло ново ядро, работещото ядро (uname -r) вече няма модулите си на диска. Всичко, което зарежда модул, ще дава грешка до рестарта. На тестовия ни сървър инсталирането на защитната стена изписа ERROR: Couldn't determine iptables version. Ако двете версии се различават, рестартирайте сега:

reboot

Тестовият ни сървър се върна за по-малко от минута.

2. Създайте потребител, който може да влезе

adduser -D deploy
passwd deploy
adduser deploy wheel

Не пропускайте passwd. adduser -D създава акаунта без парола, Alpine го маркира като заключен, а sshd отказва заключен акаунт дори с правилен ключ. В нашия тест единствената следа беше този ред в /var/log/messages:

User deploy not allowed because account is locked

Паролата ще ви трябва и по-нататък: нея ще иска doas.

Ако при поръчката на сървъра сте добавили SSH ключ, той е в authorized_keys на root. Копирайте го на новия потребител:

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

Още нямате ключ? Създайте си на компютъра и поставете публичната част в /home/deploy/.ssh/authorized_keys.

3. Нека doas пита за парола

Alpine използва doas вместо sudo, а нашият образ вече го разрешава на групата wheel. Правилото в /etc/doas.d/wheel.conf е permit nopass :wheel, тоест всеки член на wheel става root, без да въвежда нищо. Нека пита за паролата и после я помни няколко минути:

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

Оттук нататък doas apk add nano работи като sudo apt install nano в Ubuntu.

4. SSH: само ключове, без root

sshd чете файловете в /etc/ssh/sshd_config.d/ по реда на имената и за всяка настройка запазва първата намерена стойност. В нашия образ първият файл е 00-eqvps.conf, който разрешава root и пароли, за да влезете още първия ден. Заменете съдържанието му:

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

Третият ред има значение на Alpine. Образът използва версията на OpenSSH с PAM и само с първите два реда тестовият ни сървър продължаваше да предлага вход keyboard-interactive. С трите заедно опит за вход без ключ получава:

Permission denied (publickey).

Не затваряйте сесията на root. Във втори терминал проверете, че ssh deploy@YOUR.SERVER.IP работи (при план с NAT добавете -p и личния порт от панела) и че doas id приема паролата.

5. Защитна стена: ufw

ufw е в хранилището community, което в нашия образ е включено:

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

limit пропуска SSH, но забавя всеки, който отваря много връзки подред. rc-update е важен тук, защото OpenRC не пуска защитната стена след рестарт, ако не я добавите в runlevel. След рестарт сървърът ни се върна със Status: active. При план с NAT оставете SSH на порт 22: личният ви външен порт е пренасочен към 22 вътре в сървъра. При план със собствен IPv4 отваряйте уеб портове, когато ви потрябват (ufw allow 80/tcp, ufw allow 443/tcp). Останалото е в ръководството за ufw.

6. Включете cron и ежедневните обновления

Нов сървър с Alpine изобщо не пуска cron. Включете го:

rc-update add crond default
rc-service crond start

crontab-ът на root в Alpine вече пуска всичко в /etc/periodic/daily в 02:00. Сложете там скрипт за обновяване:

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

Последната команда изброява скриптовете, които cron ще пусне, и вашият трябва да е в списъка. Така получавате поправките за 3.21. Преминаването към следващата версия на Alpine е отделна, ръчна стъпка. Обновленията на ядрото пак изискват рестарт: от време на време повтаряйте проверката uname -r / ls /lib/modules от стъпка 1.

7. OpenRC в една таблица

Ако познавате systemd, ето почти всичко, което се променя:

ЗадачаsystemdAlpine (OpenRC)
Стартиране на услугаsystemctl start nginxrc-service nginx start
Старт при зарежданеsystemctl enable nginxrc-update add nginx default
Състояниеsystemctl status nginxrc-service nginx status
Какво работиsystemctl list-unitsrc-status
Системен журналjournalctl/var/log/messages

8. Docker и портът, който ufw не спира

Alpine е добър хост за Docker, защото самата система почти не пречи:

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

На нашия сървър това отне 12 секунди заедно с изтеглянето. С работещ демон на Docker заетата памет се качи от 57 MB на 124 MB.

Капан, който не е само на Alpine: Docker пише собствени правила в защитната стена. Докато ufw разрешаваше само SSH, пуснахме nginx с -p 8080:80 и го достигнахме отвън на порт 8080. ufw не го спря. Ако контейнерът трябва да е достъпен само през reverse proxy на същия сървър, публикувайте го на localhost:

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

Кой план

Alpine оставя почти цялата RAM на вашия софтуер. Планът Nano (2 vCPU, 1 GB, 15 GB, $3/мес.) стига за малка услуга или няколко контейнера. Това е план с NAT, така че SSH идва през личен порт. Ако портове 80 и 443 трябва да са отворени към интернет, Nano-IP има собствен IPv4 за $8/мес. За по-тежки Docker стекове Micro дава 2 GB за $5/мес.

Alpine 3.21 е на страницата Alpine VPS и е наличен на всеки Linux план в раздела VPS. Плащането е в USDT, USDC или ETH в мрежите Base, Ethereum или Polygon, без документи и карта.

Въпроси

Защо Alpine е толкова по-малък от Ubuntu или Debian?

Използва musl вместо glibc, BusyBox за основните команди и OpenRC вместо systemd. На нашите сървъри нов Alpine 3.21 в покой заемаше 55 MB RAM и 153 MB диск. Ubuntu 24.04 заемаше 313 MB и 2,7 GB.

Защо новият потребител получава „account is locked“, макар ключът да е верен?

adduser -D създава акаунта без парола, Alpine го маркира като заключен и sshd отказва на този потребител дори с валиден ключ. Редът в журнала е „User deploy not allowed because account is locked“. Задайте парола с passwd и входът с ключ заработва.

Защо SSH тунел не работи на Alpine?

Стандартният /etc/ssh/sshd_config на Alpine задава AllowTcpForwarding no, затова пренасочванията ssh -L се отказват. Ако ви трябват тунели, сменете стойността на yes в този файл и изпълнете rc-service sshd restart.

Ще тръгне ли програмата ми на Alpine?

Всичко от хранилищата на Alpine работи, както и Docker контейнери върху произволен базов образ. Готови Linux програми, компилирани за glibc, често не стартират върху musl. Потърсете версия за Alpine или musl или пуснете програмата в Docker. Пакетът gcompat помага при някои прости glibc програми.

Кой план стига за Alpine?

Планът Nano с 1 GB за $3 на месец има достатъчно резерв: самата система заема около 55 MB. Ако портове 80 и 443 трябва да са отворени към интернет, вземете Nano-IP за $8 на месец, със собствен IPv4.

Коментари

Още няма коментари. Бъди първият.

Остави коментар

Коментарите се модерират преди да се появят.