الـ VPS الجديد اللي لسه اشتريته زي باب مفيش له قفل، وكل سكريبت كيدز (Script Kiddies) في الدنيا بيدقوا عليه. المقال ده هياخدك بإيدك وتقفل الباب ده بإحكام، عشان مشروعك (openclaw) ما يجريش يمين وشمال ويبوظ لك الدنيا.

0. كلام أول أيه؟

لما تشتري VPS جديد، وتاخد الـ IP والـ root password وأنت طيران من الفرحة… بعد كده؟

ناس كتير بتعمل إيه؟ بتنزل السوفتوير على طول وتبدأ ترفع المشاريع.

دي عادة خطيرة جداً.

الـ VPS بتاعك ليه عنوان IP عام (Public IP)، ومعنى كده إن أي حد في الدنيا يقدر يحاول يتصل بيه. وفي الإعدادات اللي بتيجي على طول من الشركة:

  • البورت (Port) مفتوح للعلن وهو 22
  • اسم اليوزر معروف للكل وهو root
  • ومفيش حاجة بتحميك غير الباسوورد

كل يوم في ملايين السكريبتات الأوتوماتيكية بتمسح رنج الـ IPs، وتحاول تكسر الباسووردات بالقوة (Brute-force). سيرفرك من أول لحظة ما يشتغل فيها، بيبقى تحت الهجوم.

عشان كده، أول حاجة لازم تعملها لما تاخد الـ VPS، مش تنزل سوفتوير، لا، ده لازم تعمل إعدادات أمان أساسية (Security Initialization).


1. إحنا هدفنا إيه؟

الهدف من المقال ده هو:

  • ✅ إعداد وصول عن بُعد آمن: الدخول عبر مفاتيح SSH + استخدام منفذ غير افتراضي
  • ✅ إنشاء مستخدم عادي: تجنّب استخدام root مباشرة
  • ✅ ضبط الجدار الناري: فتح المنافذ الضرورية فقط
  • ✅ تفعيل تسريع الشبكة: BBR لجعل شبكتك تنطلق بسرعة الصاروخ
  • ✅ منع اختراق القوة الغاشمة: fail2ban لحظر عناوين IP الخبيثة تلقائيًا

بعد الانتهاء من هذه الخطوات، سيكون لديك VPS مبني على أساس متين، وتقدر ترتاح وتنشر عليه مختلف الخدمات وأنت مطمئن.


2. التخطيط والتفكير

ليه محتاجين نعمل كل الإعدادات دي؟

الـ VPS اللي لسه اشتريته زي بالظبط شقة لسه استلمتها “على الطوب”:

الوضع الافتراضي المخاطرة الحل اللي نطبقه
الدخول بحساب root صلاحيات واسعة، أخطاء مميتة إنشاء مستخدم عادي + sudo
الدخول بكلمة المرور قابلية الاختراق بالـ Brute Force الدخول بمفاتيح SSH
المنفذ الافتراضي 22 هدف رئيسي للماسحات الضوئية تغييره لمنفذ غير قياسي
الجدار الناري مغلق كل المنافذ مكشوفة للعالم استخدام UFW لفتح الضروري فقط
الشبكة الأصلية فقدان حزم عالٍ وزمن استجابة كبير خوارزمية تحكم الازدحام BBR

الخطوات الإجمالية

VPS初始化流程

راح نمشي على هذا الترتيب خطوة بخطوة، ومع كل خطوة رح نشرح ليش نسويها بهذا الشكل.

3. خطوات التنفيذ

3.1 أول دخول وتحديث النظام

جلب عنوان IP للخادم

بعد ما تشتري VPS، مزود الخدمة راح يعطيك:

  • عنوان IP: مثل 192.168.1.100
  • المنفذ (Port): عادة يكون 22 (بعض مزودي الخدمة قد يغيرونه لمنفذ آخر)
  • اسم المستخدم: غالباً يكون root
  • كلمة المرور: سلسلة عشوائية من الأحرف

VPS 服务商后台的登录信息页面

الاتصال عبر SSH

لمستخدمي Mac / Linux: افتح موجه الأوامر (Terminal)، واكتب مباشرة:

1
2
ssh root@你的服务器IP
# 例如:ssh [email protected]

لمستخدمي Windows:

  • ويندوز 10/11 يأتي مدمجاً معه OpenSSH، فتقدر تستخدم نفس الأمر السابق مباشرة في PowerShell أو CMD
  • أو تستخدم أدوات زي Termius و MobaXterm

أول مرة تتصل فيها، رح يظهر لك تنبيه لتأكيد البصمة (Fingerprint):

1
2
3
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

هذا التنبيه basically بيقول لك: “أنا لا أعرف هذا الجهاز، هل أنت متأكد إنك تريد الاتصال به؟”

اكتب yes ثم اضغط Enter. بعدها اكتب كلمة المرور (انتبه: أثناء الكتابة مش رح تظهر أي أحرف على الشاشة، هذا تصميم أمان طبيعي), واضغط Enter.

首次 SSH 连接的完整过程,包含指纹确认

إذا شفت رسالة مشابهة لهذي، معناته إنك نجحت في تسجيل الدخول:

1
2
3
Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.x.x-x-generic x86_64)
...
root@hostname:~#

💡 ليش لازم نتأكد من البصمة؟

عشان نحمي نفسنا من هجوم “الرجل في الوسط” (Man-in-the-Middle). أول ما تتصل بالخادم، سجّل بصمته. إذا تغيرت البصمة في أي مرة جاية لما تتصل، معناها أن هناك احتمال واحد يسوّي نفسه خادمك ويسرق بياناتك.

登录成功了

تعرّف على خادمك

أول ما تسجّل دخول، خذ لك لفة وافهم الوضع الأساسي لهالجهاز:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看系统版本
cat /etc/os-release

# 查看内核版本
uname -r

# 查看 CPU 核心数和型号
nproc
lscpu | grep "Model name"

# 查看内存
free -h

# 查看磁盘
df -h

服务器基本信息输出

احفظ هالمعلومات ببالكم، رح تحتاجونها بعدين لما تجون تحلون أي مشكلة.

تحديث النظام

خلصنا من معلومات الخادم، أول شي لازم نسويه الحين هو تحديث النظام. صورة النظام بالخادم الجديد يمكن تكون من قبل كم شهر، ومن وقتها يمكن صدرت تحديثات أمنية:

1
2
# 更新软件包列表 + 升级所有软件 + 清理
apt update && apt full-upgrade -y && apt autoremove -y && apt autoclean

شرح المعطيات:

  • apt update: تحديث فهرس الحزم (Packages)
  • apt full-upgrade: ترقية كل البرامج، بما فيها النواة (Kernel)
  • -y: تأكيد تلقائي، عشان ما تدخل “yes” يدوي
  • apt autoremove: حذف الاعتماديات (Dependencies) اللي صارت مو ضرورية
  • apt autoclean: تنظيف الكاش لحزم التثبيت اللي انزّلت

apt update 和 apt upgrade 执行过程

⏱️ هالخطوة ممكن تاخذ كم دقيقة، يعتمد على حجم التحديثات. أحياناً بالوسط يطلب منك تأكيد، بشكل عام بس اتبع المنطق اللي يطلبه وروح فيها.

التحقق من الحاجة لإعادة التشغيل

بعد تحديث النواة، غالباً تحتاج تسوي ريستارت عشان التغييرات تاخذ مفعولها:

1
2
# 检查是否需要重启
cat /var/run/reboot-required 2>/dev/null && echo ">>> 需要重启" || echo ">>> 无需重启"

是否需要重启

إذا طلع لك تنبيه إنه لازم ريستارت:

1
reboot

بعد الريستارت، لازم تعرف اتصال SSH من جديد.

تثبيت الأدوات المستخدمة بكثرة

1
apt install -y sudo curl wget git vim htop tree unzip net-tools ufw fail2ban neofetch

وظيفة هذه الأدوات:

الأداة الاستخدام
sudo يتيح للمستخدم العادي تنفيذ أوامر المدير (admin)
curl / wget تنزيل الملفات
git التحكم في الإصدارات (Version Control)
vim محرر نصوص
htop مراقب عمليات (Process Monitor) أجمل وأسهل
tree عرض هيكل المجلدات على شكل شجرة
net-tools أدوات شبكة (مثل ifconfig و netstat وغيرها)
ufw جدار حماية (Firewall) بسيط وسهل الاستخدام
fail2ban حماية من هجمات التخمين العنيف (Brute-force)
neofetch عرض معلومات النظام بشكل أنيق
neofetch 显示的系统信息

3.2 إنشاء مستخدم غير root

ليه ما نستخدمش root بشكل مباشر؟

صلاحيات مستخدم root كبيرة جداً، ولو زلّت يدك بـ rm -rf / ممكن تودي كل حاجة في لحظة. المفروض في الاستخدام اليومي تعتمد على مستخدم عادي، ولما تحتاج صلاحيات المدير تستخدم sudo.

openclaw ده وحش بجد، إزاي نجرؤ نسيبه يستخدم root؟

إنشاء المستخدم

1
2
# 创建用户(把 ittinker 换成你想要的用户名)
adduser ittinker

النظام هيطلب منك تعين كلمة المرور وتدخل شوية معلومات:

1
2
3
4
5
6
7
8
New password:              # 输入密码(不会显示)
Retype new password: # 再输入一次
Full Name []: # 可以直接回车跳过
Room Number []: # 回车跳过
Work Phone []: # 回车跳过
Home Phone []: # 回车跳过
Other []: # 回车跳过
Is the information correct? [Y/n] # 输入 Y 确认

adduser 创建用户的完整交互过程

منح صلاحيات sudo

1
2
# 把用户加入 sudo 组, ittinker 换成你自己上面创建的那个用户
usermod -aG sudo ittinker

نتأكد من نجاحها:

1
2
3
4
5
# 切换到新用户 ittinker 换成你自己上面创建的那个用户
su - ittinker

# 测试 sudo 是否生效
sudo whoami

لو النتيجة root، يبقى تم ضبط sudo بنجاح.
测试sudo

💡 نصيحة صغيرة

تقدر ترجع لمستخدم root عن طريق كتابة exit. في الخطوات الجاية هنكمل الإعداد باستخدام root، وبعد ما نخلص نرجع للمستخدم العادي.


3.3 ضبط تسجيل الدخول بمفتاح SSH

المصادقة بالمفتاح مقابل المصادقة بكلمة المرور

SSH密钥认证原理

المصادقة بالمفتاح أمن بكتير من كلمة المرور:

  • كلمة المرور ممكن تتكسر بالـ Brute Force، لكن المفتاح ده مستحيل تقريباً
  • مش هتحط كلمة المرور كل مرة، فأسهل وأسرع
  • حتى لو اتسرقت كلمة المرور، من غير المفتاح الخاص مينقدرش يسجل دخول

الخطوة الأولى: توليد زوج المفاتيح على جهازك المحلي

نفّذ الأمر ده على جهازك (مش السيرفر):

1
2
# 生成 ED25519 密钥(推荐,更安全更快)
ssh-keygen -t ed25519 -C "[email protected]"

هيطلب منك:

1
Enter file in which to save the key (/Users/你/.ssh/id_ed25519):

اضغط Enter على طول عشان تستخدم المسار الافتراضي. إحنا هنا استخدمنا ./ittinker ، يعني الملف هيتبلش في المسار الحالي واسمه ittinker

1
Enter passphrase (empty for no passphrase):

تقدر تضع كلمة مرور للمفتاح (طبقة حماية زيادة)، أو تضغط Enter على طول وتسيبه فاضي.

本地生成 SSH 密钥的过程

بعد ما يخلص التوليد، هتلاقي ملفين في مجلد ~/.ssh/ (دي الأسماء الافتراضية، لو ضغطت Enter قبل كده هيكونوا بالشكل ده):

  • id_ed25519: المفتاح الخاص، إياك يفشخ ولا يتسرب!
  • id_ed25519.pub: المفتاح العام، ده اللي لازم ترفعه على السيرفر

💡 ed25519 مقابل RSA

ed25519 هو الخوارزمية الموصى بيها حالياً، أكثر أماناً من RSA التقليدي ومفتاحه أقصر. لو نظامك قديم شوية وما بيدعمهوش، تقدر تستخدم ssh-keygen -t rsa -b 4096.

تفصيلة صغيرة، المفتاح اللي بيولّده ed25519 صغير حجمه، أما بتاع rsa فملفه كبير أوي، سألت الـ AI عرفت إن الحجم مالهوش علاقة، الموضوع كله بيعتمد على الخوارزمية نفسها.

الخطوة التانية: ارفع المفتاح العام على السيرفر

الطريقة الأولى: استخدام ssh-copy-id (الموصى بيها)

1
2
# 在你的电脑上执行
ssh-copy-id -i ~/.ssh/id_ed25519.pub yourname@你的服务器IP

بعد ما تدخل كلمة المرور، المفتاح العام هيتنسخ على السيرفر أوتوماتيك.

ssh-copy-id 执行成功

الطريقة التانية: النسخ اليدوي

لو ssh-copy-id مش متاح، تقدر تعملها يدويًا:

1
2
# 1. 在你的电脑上,查看公钥内容
cat ~/.ssh/id_ed25519.pub

انسخ الناتج (سلسلة طويلة من النص تبدأ بـ ssh-ed25519).

1
2
3
4
5
6
7
8
9
10
11
# 2. 在服务器上,为新用户创建 .ssh 目录, ittinker 换成你刚刚创建的用户名
mkdir -p /home/ittinker/.ssh
chmod 700 /home/ittinker/.ssh

# 3. 创建 authorized_keys 文件并粘贴公钥
vim /home/ittinker/.ssh/authorized_keys
# 按 i 进入编辑模式,粘贴公钥,按 Esc,输入 :wq 保存退出

# 4. 设置正确的权限
chmod 600 /home/ittinker/.ssh/authorized_keys
chown -R ittinker:ittinker /home/ittinker/.ssh

⚠️ الصلاحيات مهمة جدًا!

SSH صارم جدًا بخصوص صلاحيات الملفات:

  • مجلد .ssh: 700 (المستخدم بس اللي يقدر يدخله)
  • ملف authorized_keys: 600 (المستخدم بس اللي يقدر يقرأه ويكتب فيه)

لو الصلاحيات مش صحيحة، SSH رح يرفض تسجيل الدخول بالمفتاح.

الخطوة الثالثة: اختبار تسجيل الدخول بالمفتاح

افتح نافذة Terminal جديدة (سيب النافذة القديمة مفتوحة، عشان لو في أي غلطة تقدر ترجع وتعدلها)، وجرّب تسجيل الدخول بالمفتاح:

1
ssh ittinker@你的服务器IP

لو قدرت تسجل دخول من غير ما تكتب باسوورد، يبقى المفتاح اشتغل تمام! 🎉

(لو حطيت passphrase للمفتاح الخاص، رح يطلب منك باسوورد المفتاح، وده شيء طبيعي)
使用密钥成功登录(无需服务器密码)

هنا ضفنا بارامتر ‎-i‎، لأن المفتاح ده مش في المسار الافتراضي، إحنا حطينه في المسار الحالي. لو ما حددناه، النظام هيستخدم المفتاح الافتراضي.


3.4 تقوية أمان SSH

دلوقتي تسجيل الدخول بالمفتاح شغال، يلا نشدّد أمان SSH:

  1. غيّر البورت الافتراضي (عشان تتجنب السكان)
  2. أوقف تسجيل الدخول بالباسوورد
  3. امنع الدخول المباشر بحساب root

تعديل ملف إعدادات SSH

1
2
3
4
5
# 备份原配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

# 编辑配置
nano /etc/ssh/sshd_config

修改前

ابحث عن الإعدادات التالية وقم بتعديلها (بعضها قد يكون مُعلّمًا كتعليق، فقط احذف # من أمامها):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 修改端口(选一个 1024-65535 之间的数字)
Port 22000

# 禁止 root 登录
PermitRootLogin no

# 允许密钥登录
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# 禁止密码登录(确保密钥登录测试成功后再改!)
PasswordAuthentication no

# 使用更安全的 SSH2 协议
Protocol 2

# 最大认证尝试次数
MaxAuthTries 3

# 客户端超时设置
ClientAliveInterval 300
ClientAliveCountMax 2

修改后的 sshd_config 关键配置

احفظ الملف واخرج (ctrl + o).

للحفظ في Nano اضغط ctrl + o، سيطلب منك تأكيد اسم الملف، اضغط Enter مباشرة، وللخروج اضغط ctrl + x

إعادة تشغيل خدمة SSH

1
systemctl restart sshd.service

⚠️ تذكير مهم!

لا تغلق نافذة الطرفية الحالية! أولاً، اختبر الإعدادات الجديدة في نافذة جديدة للتأكد من إمكانية تسجيل الدخول بشكل طبيعي:

1
ssh -p 22000 yourname@你的服务器IP

إذا نجح تسجيل الدخول، حينها يمكنك إغلاق النافذة القديمة. أما إذا لم تتمكن من الدخول، فلا تزال لديك الفرصة لإصلاح الإعدادات من النافذة القديمة.

إذا كنت قد اشتريت خادمًا خفيفًا (Light Server)، فغالبًا لن تتمكن من تغيير هذا المنفذ، بينما خوادم ECS التقليدية تسمح بتعديله، انتبه لهذه النقطة.


3.5 إعداد جدار حماية UFW

UFW防火墙规则

UFW (Uncomplicated Firewall) هو أداة جدار الحماية الافتراضية في Ubuntu، إعداداتها بسيطة لكنها قوية جدًا.

الإعدادات الأساسية

1
2
3
4
5
6
7
8
9
10
11
# 设置默认策略:拒绝所有入站,允许所有出站
ufw default deny incoming
ufw default allow outgoing

# 允许 SSH(使用你设置的端口)
ufw allow 22000/tcp comment 'SSH'
ufw allow 22/tcp comment 'SSH' # 如果是轻量服务器,还是开22端口

# 允许 HTTP 和 HTTPS
ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'

تفعيل جدار الحماية

1
ufw enable

ستظهر لك رسالة:

1
Command may disrupt existing ssh connections. Proceed with operation (y|n)?

اكتب y للتأكيد.

التحقق من الحالة

1
ufw status verbose

ufw status 的输出结果

23022 كان خطأ مطبعي مني، اعتمدوا على وضعكم الفعلي وخلاص

المخرجات ستكون شبيهة بـ:

1
2
3
4
5
6
7
8
9
10
11
12
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)

To Action From
-- ------ ----
22000/tcp (SSH) ALLOW IN Anywhere
80/tcp (HTTP) ALLOW IN Anywhere
443/tcp (HTTPS) ALLOW IN Anywhere
22000/tcp (SSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (HTTP (v6)) ALLOW IN Anywhere (v6)
443/tcp (HTTPS (v6)) ALLOW IN Anywhere (v6)

مرجع سريع للأوامر الشائعة

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看状态
ufw status

# 添加规则
ufw allow 8080/tcp

# 删除规则
ufw delete allow 8080/tcp

# 允许特定 IP 访问所有端口
ufw allow from 192.168.1.100

# 禁用防火墙(不推荐)
ufw disable

# 重置所有规则
ufw reset

3.6 تفعيل تسريع BBR

BBR (اختصار لـ Bottleneck Bandwidth and Round-trip propagation time) هو خوارزمية تحكم في ازدحام TCP طوّرتها Google، ويمكنها تحسين أداء الشبكة بشكل ملحوظ.

التفعيل بنقرة واحدة

1
2
3
4
5
6
# 添加 BBR 配置
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

# 使配置生效
sysctl -p

التحقق من التفعيل

1
2
# 查看当前拥塞控制算法
sysctl net.ipv4.tcp_congestion_control

المخرجات المتوقعة:

1
net.ipv4.tcp_congestion_control = bbr
1
2
# 确认 BBR 模块已加载
lsmod | grep bbr

المخرجات ستكون شبيهة بـ:

1
tcp_bbr    20480  3

💡 تأثير BBR

بعد تفعيل BBR، خصوصًا في البيئات غير المستقرة أو ذات زمن الاستجابة العالي، ستلاحظ بوضوح:

  • سرعة تحميل أسرع
  • عمليات SSH أكثر سلاسة
  • تحميل أسرع لصفحات الويب

bbr 开启


3.7 إعداد fail2ban للحماية من محاولات الاختراق بالقوة

fail2ban راح يراقب ملفات السجلات (logs)، وأول ما يلاحظ IP فشل في تسجيل الدخول عدة مرات، راح يحظره تلقائيًا.

الإعداد الأساسي

1
2
3
4
5
# 复制默认配置(不要直接修改 jail.conf)
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# 编辑配置
vim /etc/fail2ban/jail.local

ابحث عن قسم [sshd]، وتأكد من الإعدادات التالية:

1
2
3
4
5
6
7
8
[sshd]
enabled = true
port = 22000 # 改成你的 SSH 端口
filter = sshd
logpath = /var/log/auth.log
maxretry = 3 # 最大尝试次数
bantime = 3600 # 封禁时间(秒),这里是 1 小时
findtime = 600 # 在这个时间窗口内

fail2ban

تشغيل الخدمة

1
2
3
4
5
# 重启 fail2ban
systemctl restart fail2ban

# 设置开机自启
systemctl enable fail2ban

التحقق من الحالة

1
2
3
4
5
# 查看 fail2ban 状态
fail2ban-client status

# 查看 SSH 监控状态
fail2ban-client status sshd

fail2ban-client status sshd 的输出

المخرجات ستكون مشابهة لـ:

1
2
3
4
5
6
7
8
9
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:

أوامر شائعة

1
2
3
4
5
6
7
8
# 手动封禁 IP
fail2ban-client set sshd banip 1.2.3.4

# 手动解封 IP
fail2ban-client set sshd unbanip 1.2.3.4

# 查看被封禁的 IP
fail2ban-client status sshd

3.8 [اختياري] إدارة عدة خوادم عبر SSH Config

لو عندك أكتر من خادم، كل مرة تكتب ssh -p 22000 user@ip هتبقى مزعجة. تقدر تبسط الموضوع باستخدام SSH Config.

ملف الإعدادات

على جهازك المحلي قم بتعديل ~/.ssh/config:

1
vim ~/.ssh/config

أضف الإعدادات التالية:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 第一台服务器
Host vps1
HostName 192.168.1.100
User yourname
Port 22000
IdentityFile ~/.ssh/id_ed25519

# 第二台服务器
Host vps2
HostName 192.168.1.101
User admin
Port 22222
IdentityFile ~/.ssh/id_ed25519

# 通用设置(应用于所有连接)
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes

طريقة الاستخدام

دلوقتي تقدر تتصل مباشرة باستخدام الاسم المستعار:

1
2
3
4
5
# 连接第一台服务器
ssh vps1

# 连接第二台服务器
ssh vps2

ودي بتعفيك من حفظ الـ IP والبورت واسم المستخدم في كل مرة!


3.9 [اختياري] السماح لـ Cloudflare فقط بالوصول

لو موقعك شغال بالكامل خلف Cloudflare، تقدر تظبط الإعدادات عشان تسمح بس لـ IP بتاع Cloudflare يوصل لبورتات 80/443، وده هيزود الأمان.

⚠️ ملاحظة: الإعداد ده بيتطلب يكون دومينك متوصّل بالفعل على Cloudflare CDN.

سكربت الإعداد التلقائي

1
2
3
4
5
6
7
8
# 下载脚本
wget -O ~/.cloudflare-ufw.sh https://gist.githubusercontent.com/Xm798/12560579ce11f62027ea8da1fae37456/raw/b07ac8cfe09badf02fc70e2d8bc2da68cabbda50/cloudflare-ufw.sh

# 添加执行权限
chmod +x ~/.cloudflare-ufw.sh

# 执行脚本
~/.cloudflare-ufw.sh

السكربت ده هيقوم بـ:

  1. جلب أحدث نطاقات IP الرسمية من Cloudflare
  2. إضافة قواعد UFW للسماح فقط لهذه الـ IP بالوصول إلى المنفذين 80/443
  3. إعادة تحميل UFW

ضبط التحديث التلقائي

نطاقات IP الخاصة بـ Cloudflare قد تتغير مع الوقت، لذا خلي النظام يسحبها ويحدّثها تلقائياً كل أسبوع:

1
2
# 添加 cron 任务(每周一凌晨执行)
(crontab -l 2>/dev/null; echo "0 0 * * 1 /root/.cloudflare-ufw.sh > /dev/null 2>&1") | crontab -

3.10 ضبط المنطقة الزمنية

غالباً المنطقة الزمنية الافتراضية تكون UTC، فالأفضل تغييرها لمنطقتك عشان تقدر تقرأ السجلات (Logs) بكل راحة:

1
2
3
4
5
6
7
8
# 查看当前时区
timedatectl

# 设置为上海时区(中国用户)
sudo timedatectl set-timezone Asia/Shanghai

# 验证
date

设置时区


3.11 [اختياري] تفعيل التحديثات الأمنية التلقائية

خلِّ النظام يركّب التحصينات الأمنية لوحده، وريّح راسك من التدخل اليدوي في كل مرة:

1
2
3
4
5
# 安装自动更新工具
sudo apt install -y unattended-upgrades

# 配置
sudo dpkg-reconfigure --priority=low unattended-upgrades

اختار “Yes” عشان تفعيل التحديث التلقائي.

💡 الميزة دي بتركّب التحديثات الأمنية بشكل تلقائي، لكنها ما بترقّيك لإصدار رئيسي جديد، فاعتمد عليها وأنت مطمن.


4. الخلاصة

قائمة التحقق النهائية

بعد ما تخلص كل اللي فوق، مرّر على القائمة دي عشان تتأكد إن كل شيء تمام:

عنصر الفحص الأمر النتيجة المتوقعة
النظام محدّث apt update && apt list --upgradable لا توجد حزم للترقية
المستخدم العادي يستطيع استخدام sudo sudo whoami المخرجات root
تسجيل الدخول بالمفتاح يعمل ssh yourname@ip -p port الدخول بدون كلمة مرور
تسجيل الدخول بكلمة المرور معطّل grep PasswordAuth /etc/ssh/sshd_config PasswordAuthentication no
منفذ SSH تم تغييره grep Port /etc/ssh/sshd_config المنفذ الذي حددته
الجدار الناري مفعّل ufw status Status: active
BBR مفعّل sysctl net.ipv4.tcp_congestion_control = bbr
fail2ban يعمل systemctl status fail2ban active (running)
المنطقة الزمنية مضبوطة timedatectl Asia/Shanghai أو منطقتك الزمنية
إعدادات SSH المحلية cat ~/.ssh/config تم ضبط اسم مستعار للخادم

مواقع الملفات المهمة

1
2
3
4
/etc/ssh/sshd_config        # SSH 服务端配置
~/.ssh/authorized_keys # 允许登录的公钥
~/.ssh/config # 本地 SSH 客户端配置(在你电脑上)
/etc/fail2ban/jail.local # fail2ban 配置

أفضل ممارسات الأمان

  1. تحديث النظام بانتظام: apt update && apt upgrade
  2. مراجعة سجلات تسجيل الدخول دوريًا: lastb (محاولات الدخول الفاشلة)، last (محاولات الدخول الناجحة)
  3. متابعة حالات الحظر في fail2ban أولاً بأول
  4. النسخ الاحتياطي قبل تعديل أي ملف إعدادات مهم

5. سجل الأخطاء والمشاكل

س1: فشل تسجيل الدخول بالمفتاح، ولا يزال يطلب كلمة المرور؟

الأسباب المحتملة:

  1. مشكلة في الصلاحيات (الأكثر شيوعاً)

    1
    2
    3
    # 检查并修复权限
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
  2. لم يتم نسخ المفتاح العام بشكل صحيح

    1
    2
    3
    # 检查 authorized_keys 内容
    cat ~/.ssh/authorized_keys
    # 应该是一行完整的公钥,以 ssh-ed25519 或 ssh-rsa 开头
  3. تدخل SELinux (في أنظمة CentOS/RHEL)

    1
    restorecon -Rv ~/.ssh

س2: بعد تغيير المنفذ لم تعد قادراً على الاتصال؟

خطوات التشخيص:

  1. تأكد من أن المنفذ الجديد مفتوح في الجدار الناري:

    1
    ufw status | grep 你的端口
  2. تأكد من أن إعدادات SSH صحيحة:

    1
    grep Port /etc/ssh/sshd_config
  3. تأكد من أن خدمة SSH قيد التشغيل:

    1
    systemctl status sshd
  4. إذا لم تستطع الاتصال إطلاقاً، استخدم VNC/لوحة التحكم الخاصة بمزود الخدمة لتسجيل الدخول وإصلاح المشكلة.

س2.5: تغيير المنفذ لا يطبق إطلاقاً؟ (الخوادم السحابية الخفيفة)

الظاهرة: قمت بتغيير /etc/ssh/sshd_config، وبعد إعادة تشغيل الخدمة بقي المنفذ 22 يعمل، والمنفذ الجديد لم يُطبّق.

طريقة التشخيص:

bash

1
2
# 查看是谁在监听 22 端口
netstat -lntp | grep :22

إذا كان المخرج مشابهاً لـ:

1
tcp  0  0.0.0.0:22  0.0.0.0:*  LISTEN  1/init

هذا يعني أن المنفذ 22 يُستمع إليه بواسطة init (PID 1)، وليس بواسطة عملية sshd.

السبب: في بعض مزودي الخدمات السحابية، الـ SSH في «خوادم التطبيقات الخفيفة» أو «حاويات الـ instances» يتم إدارته عبر بروكسي على مستوى المنصة، وبالتالي إعدادات sshd داخل خادمك ما رح تنفع ولن تعمل.

الحل:

نوع الـ instance طريقة تعديل منفذ SSH
ECS تقليدي تعديل sshd_config ✅
خادم خفيف ممكن تحتاج تعدله من لوحة تحكم السحابة، أو إنه ما يدعم التعديل إطلاقاً
حاوية (Container instance) عادةً ما يدعم التعديل

إذا كان الـ instance بتاعك ما يدعم تغيير المنفذ، تدابير الأمان الأخرى تصبح أهم بكثير:

  • ✅ إنشاء مستخدم عادي + تعطيل تسجيل الدخول عبر root
  • ✅ تسجيل الدخول للـ SSH بمفتاح (Key) + تعطيل الدخول بكلمة المرور
  • ✅ fail2ban للحماية من محاولات الاختراق العنيفة (Brute-force)

لو طبقت هذي الإجراءات صح، مستوى الأمان بتاعك لسه عالي جداً.

س3: fail2ban حظرني أنا؟

1
2
3
4
5
# 用 VNC 登录后解封
fail2ban-client set sshd unbanip 你的IP

# 把你的 IP 加入白名单,编辑 jail.local
ignoreip = 127.0.0.1/8 ::1 你的IP

س4: بعد تفعيل UFW ما قدرت أدخل على الموقع؟

1
2
3
4
5
6
# 检查 80/443 是否开放
ufw status

# 如果没有,添加规则
ufw allow 80/tcp
ufw allow 443/tcp

س5: لما شغّلت أمر قال إنه ما يقدر يلاقي sudo؟

تثبيت Debian المصغّر (Minimal) ممكن ما يكون فيه sudo، سجّل دخولك كـ root وثبّته:

1
2
apt install sudo
usermod -aG sudo ittinker

6. سكربت تهيئة بضغطة واحدة (استخدمه بعد ما تعتاد على الخطوات)

إذا صرت تعرف الخطوات اللي فوق كويس، تقدر تستخدم هذا السكربت عشان تعمل تهيئة (Initialization) بسرعة.

⚠️ ملاحظة: قبل تشغيل السكريبت، تأكد أولاً أنك جهّزت مفتاح SSH العام.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/bin/bash
# VPS 初始化脚本
# 使用方法:以 root 身份运行

set -e

# === 配置区域(根据你的需求修改)===
NEW_USER="ittinker" # 新用户名
NEW_SSH_PORT="22000" # 新 SSH 端口
TIMEZONE="Asia/Shanghai" # 时区
# =====================================

echo "=== VPS 初始化脚本 ==="
echo ""

# 1. 更新系统
echo "[1/8] 更新系统..."
apt update && apt upgrade -y

# 2. 安装基础工具
echo "[2/8] 安装基础工具..."
apt install -y sudo curl wget git vim htop tree unzip net-tools ufw fail2ban neofetch

# 3. 创建新用户
echo "[3/8] 创建用户 $NEW_USER..."
if id "$NEW_USER" &>/dev/null; then
echo "用户已存在,跳过创建"
else
adduser --gecos "" $NEW_USER
usermod -aG sudo $NEW_USER
fi

# 4. 配置 SSH 目录
echo "[4/8] 配置 SSH 目录..."
mkdir -p /home/$NEW_USER/.ssh
chmod 700 /home/$NEW_USER/.ssh
touch /home/$NEW_USER/.ssh/authorized_keys
chmod 600 /home/$NEW_USER/.ssh/authorized_keys
chown -R $NEW_USER:$NEW_USER /home/$NEW_USER/.ssh

echo ""
echo ">>> 请将你的公钥粘贴到下面(粘贴后按 Ctrl+D 结束):"
cat >> /home/$NEW_USER/.ssh/authorized_keys
echo ""

# 5. 修改 SSH 配置
echo "[5/8] 修改 SSH 配置..."
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sed -i "s/^#*Port .*/Port $NEW_SSH_PORT/" /etc/ssh/sshd_config
sed -i "s/^#*PermitRootLogin .*/PermitRootLogin no/" /etc/ssh/sshd_config
sed -i "s/^#*PasswordAuthentication .*/PasswordAuthentication no/" /etc/ssh/sshd_config
sed -i "s/^#*PermitEmptyPasswords .*/PermitEmptyPasswords no/" /etc/ssh/sshd_config

# 6. 配置防火墙
echo "[6/8] 配置防火墙..."
ufw default deny incoming
ufw default allow outgoing
ufw allow $NEW_SSH_PORT/tcp
ufw allow 80/tcp
ufw allow 443/tcp
echo "y" | ufw enable

# 7. 开启 BBR
echo "[7/8] 开启 BBR..."
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

# 8. 设置时区
echo "[8/8] 设置时区..."
timedatectl set-timezone $TIMEZONE

# 重启 SSH
systemctl restart sshd

echo ""
echo "=========================================="
echo " ✅ 初始化完成!"
echo "=========================================="
echo ""
echo " 新 SSH 端口: $NEW_SSH_PORT"
echo " 新用户: $NEW_USER"
echo " 时区: $TIMEZONE"
echo ""
echo " 请使用以下命令登录:"
echo " ssh -p $NEW_SSH_PORT $NEW_USER@$(curl -s ifconfig.me 2>/dev/null || echo '你的IP')"
echo ""
echo " ⚠️ 重要:请先测试新配置能否登录,再关闭当前终端!"
echo ""

7. بعد كل ده، الأمان اتحسّن قد إيه؟

الخطوة عملنا إيه ليه مهم
تحديث النظام تثبيت أحدث التحديثات إصلاح الثغرات المعروفة
إنشاء مستخدم جديد بطلنا نستخدم root مباشرة تقليل مخاطر الأخطاء البشرية
مفاتيح SSH استبدلنا الباسورد بمفاتيح مستحيل يتخترق بالـ brute-force
تغيير البورت بعدنا عن بورت 22 الافتراضي تقليل فرصة إن السيرفر يتمسح
تعطيل الباسورد ال登录 بالمفتاح بس قفل باب هجمات الباسورد نهائياً
تعطيل root root مابيقدرش يدخل مباشرة تصعيب المهمة على الهاكرز
جدار حماية UFW فتحنا البورتات اللازمة بس تقليل مساحة الهجوم
تسريع BBR تحسين أداء الشبكة رفع سرعة الوصول
fail2ban حظر تلقائي للـ IPs الخبيثة منع الهجمات المستمرة

بعد كل ده، أمان سيرفرك بقى أحسن من 90% من الـ VPSs اللي موجودة.


إشعار للمقال الجاي

في المقال الجاي هنتكلم عن مرجع سريع لإعداد ال登录 بمفاتيح SSH، وهنشرح بالتفصيل:

  • طرق توليد المفاتيح على أنظمة تشغيل مختلفة
  • إدارة أكتر من مفتاح
  • إعداد SSH Agent
  • إعدادات عملاء SSH الشائعة

آخر تحديث لهذا المقال: يناير 2026

سلسلة صندوق أدوات المطوّر المستقل، تابعنا!