−25%

روی پرداخت سالانه Windows، تا ۳۱ اکتبر. مشاهده پلن‌ها

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 رم و 153 MB دیسک مصرف می‌کرد، در برابر 313 MB و 2.7 GB برای Ubuntu 24.04. بهایش کنار گذاشتن ابزارهای آشناست. Alpine به‌جای apt از apk، به‌جای sudo از doas، به‌جای systemd از OpenRC و به‌جای glibc از musl استفاده می‌کند.

قدم‌های زیر همان ده دقیقهٔ اول روی 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 به‌جای sudo از doas استفاده می‌کند و ایمیج ما از قبل آن را برای گروه 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 تقریباً همهٔ رم را برای نرم‌افزار خودتان می‌گذارد. پلن Nano (2 vCPU، 1 GB، 15 GB، ماهی $3) برای یک سرویس کوچک یا چند کانتینر کافی است. این پلن NAT است، پس SSH از یک پورت اختصاصی وارد می‌شود. اگر پورت‌های 80 و 443 باید به اینترنت باز باشند، Nano-IP با ماهی $8 یک IPv4 اختصاصی دارد. برای پشته‌های سنگین‌تر Docker، Micro با ماهی $5 2 GB رم می‌دهد.

Alpine 3.21 در صفحهٔ Alpine VPS هست و روی همهٔ پلن‌های لینوکس در بخش VPS در دسترس است. پرداخت با USDT، USDC یا ETH روی شبکه‌های Base، Ethereum یا Polygon انجام می‌شود، بدون مدرک هویتی و کارت.

پرسش‌های متداول

چرا Alpine این‌قدر از Ubuntu یا Debian کوچک‌تر است؟

به‌جای glibc از musl، برای فرمان‌های پایه از BusyBox و به‌جای systemd از OpenRC استفاده می‌کند. روی سرورهای ما یک Alpine 3.21 تازه در حالت بیکار 55 MB رم و 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 با هر ایمیج پایه‌ای هم همین‌طور. فایل‌های اجرایی آمادهٔ لینوکس که برای glibc ساخته شده‌اند، روی musl اغلب اجرا نمی‌شوند. دنبال نسخهٔ Alpine یا musl بگردید یا برنامه را داخل Docker اجرا کنید. بستهٔ gcompat به بعضی فایل‌های اجرایی سادهٔ glibc کمک می‌کند.

چه پلنی برای Alpine کافی است؟

پلن Nano با 1 GB و ماهی $3 جای زیادی دارد: خود سیستم حدود 55 MB مصرف می‌کند. اگر پورت‌های 80 و 443 باید به اینترنت باز باشند، Nano-IP را با ماهی $8 و IPv4 اختصاصی بگیرید.

نظرات

هنوز نظری نیست. اولین نفر باشید.

یک نظر بگذارید

نظرات پیش از نمایش بررسی می‌شوند.