−25%

على الدفع السنوي لـ Windows حتى 31 أكتوبر. عرض الخطط

EQVPS
ابدأ الآن

كيف تجهّز VPS بنظام Alpine Linux: apk وdoas وOpenRC وجدار حماية

الخطوات الأولى على VPS جديد بنظام Alpine Linux 3.21: التحديث وإعادة التشغيل، وإنشاء مستخدم doas يستطيع الدخول فعلاً، وإيقاف دخول root وكلمة المرور عبر SSH، وإضافة ufw، وتشغيل cron والتحديثات اليومية. ومعها منفذ Docker الذي لا يحجبه ufw.

Alpine Linux أصغر صورة نقدّمها. على خوادمنا استهلك Alpine 3.21 جديد وهو خامل 55 MB من الذاكرة و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. إذا كان يجب الوصول إلى حاوية عبر وكيل عكسي على الخادم نفسه فقط، فانشرها على 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 لها 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 من الذاكرة و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 خاص.

التعليقات

لا تعليقات بعد. كن الأول.

اترك تعليقًا

تُراجَع التعليقات قبل ظهورها.