مختبر: استكشاف أخطاء VPC
هدف المختبر
يضعك هذا المختبر في دور مسؤول السحابة الذي يجب عليه تشخيص وحل مشاكل الاتصال بالشبكة. ستقوم بتحليل سيناريوهات واقعية واقتراح حلول.
يعتمد هذا المختبر على تحليل السيناريوهات. يجب عليك تحديد المشكلة واقتراح الحل قبل النظر إلى الإجابة.
الجزء 1: دراسة حالة
الهندسة المرجعية
جميع الأسئلة تعتمد على هذه الهندسة:
┌─────────────────────────────────────────────────────────────────────────┐
│ هندسة التجارة الإلكترونية │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ الإنترنت │
│ │ │
│ ┌──────▼──────┐ │
│ │ IGW │ │
│ │ igw-abc123 │ │
│ └──────┬──────┘ │
│ │ │
│ ┌──────────────────────────────┼──────────────────────────────┐ │
│ │ VPC │ (10.0.0.0/16) │ │
│ │ │ │ │
│ │ ┌──────────────────────────┴────────────────────────────┐ │ │
│ │ │ الشبكة الفرعية العامة │ │ │
│ │ │ 10.0.1.0/24 │ │ │
│ │ │ rtb-public │ │ │
│ │ │ │ │ │
│ │ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │
│ │ │ │ BASTION │ │ NAT Gateway │ │ │ │
│ │ │ │ 10.0.1.10 │ │ 10.0.1.50 │ │ │ │
│ │ │ │ sg-bastion │ │ nat-xyz789 │ │ │ │
│ │ │ │ IP: 52.1.2.3 │ │ EIP: 52.4.5.6 │ │ │ │
│ │ │ └─────────────────┘ └─────────────────┘ │ │ │
│ │ │ │ │ │
│ │ └────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌────────────────────────────────────────────────────────┐ │ │
│ │ │ الشبكة الفرعية الخاصة بالتطبيق │ │ │
│ │ │ 10.0.11.0/24 │ │ │
│ │ │ rtb-private │ │ │
│ │ │ │ │ │
│ │ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │
│ │ │ │ WEB SERVER │ │ API SERVER │ │ │ │
│ │ │ │ 10.0.11.20 │ │ 10.0.11.30 │ │ │ │
│ │ │ │ sg-web │ │ sg-api │ │ │ │
│ │ │ └─────────────────┘ └─────────────────┘ │ │ │
│ │ │ │ │ │
│ │ └────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌────────────────────────────────────────────────────────┐ │ │
│ │ │ الشبكة الفرعية الخاصة بقاعدة البيانات │ │ │
│ │ │ 10.0.21.0/24 │ │ │
│ │ │ rtb-database │ │ │
│ │ │ │ │ │
│ │ │ ┌─────────────────┐ │ │ │
│ │ │ │ DATABASE │ │ │ │
│ │ │ │ 10.0.21.10 │ │ │ │
│ │ │ │ sg-database │ │ │ │
│ │ │ │ MySQL:3306 │ │ │ │
│ │ │ └─────────────────┘ │ │ │
│ │ │ │ │ │
│ │ └────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────────────┘
التكوين الحالي
جداول التوجيه:
rtb-public:
┌─────────────────────┬───────────────┐
│ الوجهة │ الهدف │
├─────────────────────┼───────────────┤
│ 10.0.0.0/16 │ local │
│ 0.0.0.0/0 │ igw-abc123 │
└─────────────────────┴───────────────┘
rtb-private:
┌─────────────────────┬───────────────┐
│ الوجهة │ الهدف │
├─────────────────────┼───────────────┤
│ 10.0.0.0/16 │ local │
│ 0.0.0.0/0 │ nat-xyz789 │
└─────────────────────┴───────────────┘
rtb-database:
┌─────────────────────┬───────────────┐
│ الوجهة │ الهدف │
├─────────────────────┼───────────────┤
│ 10.0.0.0/16 │ local │
└─────────────────────┴───────────────┘
مجموعات الأمان:
sg-bastion:
┌────────────────────────────────────────────────────┐
│ الوارد: SSH (22) من 0.0.0.0/0 │
│ الصادر: كل حركة المرور إلى 0.0.0.0/0 │
└────────────────────────────────────────────────────┘
sg-web:
┌────────────────────────────────────────────────────┐
│ الوارد: HTTP (80) من 0.0.0.0/0 │
│ الوارد: SSH (22) من sg-bastion │
│ الصادر: كل حركة المرور إلى 0.0.0.0/0 │
└────────────────────────────────────────────────────┘
sg-api:
┌────────────────────────────────────────────────────┐
│ الوارد: TCP (8080) من sg-web │
│ الوارد: SSH (22) من sg-bastion │
│ الصادر: كل حركة المرور إلى 0.0.0.0/0 │
└────────────────────────────────────────────────────┘
sg-database:
┌────────────────────────────────────────────────────┐
│ الوارد: MySQL (3306) من sg-api │
│ الصادر: كل حركة المرور إلى 0.0.0.0/0 │
└────────────────────────────────────────────────────┘
الجزء 2: تمارين استكشاف الأخطاء
تمرين 1: SSH إلى الباستيون
الأعراض: لا يمكن لمسؤول الاتصال عبر SSH إلى الباستيون من مكتبه (IP: 203.0.113.50).
$ ssh -i key.pem ec2-user@52.1.2.3
Connection timed out
الأسئلة:
- ما هو السبب الأكثر احتمالاً للمشكلة؟
- ما الأمر الذي ستستخدمه للتحقق؟
- ما هو الحل؟
💡 حل تمرين 1
التحليل:
مجموعة الأمان sg-bastion تسمح بـ SSH من 0.0.0.0/0، لذا فالمشكلة ليست هنا.
لنقم بالتحقق:
- ✅ جدول التوجيه rtb-public يحتوي على مسار إلى IGW
- ✅ IGW مرتبط
- ❓ هل لدى الباستيون عنوان IP عام؟
التحقق:
aws ec2 describe-instances --instance-id i-bastion \
--query 'Reservations[].Instances[].PublicIpAddress'
المشكلة المحتملة: الباستيون ليس لديه عنوان IP عام أو أن العنوان تغير بعد إعادة التشغيل.
الحل:
# الخيار 1: تخصيص عنوان Elastic IP
aws ec2 allocate-address --domain vpc
aws ec2 associate-address --instance-id i-bastion --allocation-id eipalloc-xxx
# الخيار 2: تفعيل التخصيص التلقائي لعنوان IP العام على الشبكة الفرعية
تمرين 2: خادم الويب غير متاح
الأعراض: الموقع غير متاح من الإنترنت.
$ curl http://10.0.11.20
curl: (7) Failed to connect to 10.0.11.20 port 80: No route to host
الأسئلة:
- لماذا يستخدم المسؤول عنوان IP الخاص من الإنترنت؟
- ما هي المشكلة الحقيقية في الهندسة هنا؟
- كيف يجب أن تكون الهندسة مهيأة؟
💡 حل تمرين 2
التحليل:
خادم الويب موجود في شبكة فرعية خاصة (10.0.11.0/24)!
المشاكل المحددة:
- المسؤول يحاول الوصول إلى عنوان IP خاص من الإنترنت (مستحيل)
- خادم الويب ليس لديه عنوان IP عام
- حتى مع وجود عنوان IP عام، لا يوجد مسار IGW على هذه الشبكة الفرعية
الهندسة غير الصحيحة: لا ينبغي أن يكون خادم الويب الموجه للجمهور في شبكة فرعية خاصة.
الحلول الممكنة:
الخيار A (موصى به): إضافة موازن تحميل
الإنترنت → ALB (شبكة فرعية عامة) → خادم الويب (شبكة فرعية خاصة)
الخيار B: نقل خادم الويب إلى شبكة فرعية عامة
الإنترنت → IGW → خادم الويب (شبكة فرعية عامة مع IP عام)
للخيار A:
- إنشاء موازن تحميل للتطبيق في الشبكة الفرعية العامة
- تكوين مجموعة أهداف مع خادم الويب
- تحديث sg-web لقبول حركة المرور من sg-alb
تمرين 3: API لا يمكنه الوصول إلى قاعدة البيانات
الأعراض: لا يمكن لخادم API الاتصال بـ MySQL.
$ mysql -h 10.0.21.10 -u app -p
ERROR 2003 (HY000): Can't connect to MySQL server on '10.0.21.10' (110)
الأسئلة:
- قم بسرد جميع الأسباب المحتملة.
- كيف تتحقق من كل فرضية؟
- ما هو السبب الأكثر احتمالاً بالنظر إلى التكوين؟
💡 حل تمرين 3
الفرضيات والتحقق:
| الفرضية | التحقق | النتيجة |
|---|---|---|
| SG API → DB | هل sg-database يسمح لـ sg-api؟ | ❌ يسمح لـ sg-api |
| المسار | هل يوجد مسار محلي؟ | ✅ نعم (10.0.0.0/16 → local) |
| تشغيل MySQL | هل خدمة MySQL قيد التشغيل؟ | للتحقق |
| الاستماع على المنفذ | هل MySQL يستمع على 0.0.0.0:3306؟ | للتحقق |
المشكلة المحددة:
عند النظر إلى sg-database:
الوارد: MySQL (3306) من sg-api
هذا صحيح. لكن دعونا ننظر إلى sg-api:
الوارد: TCP (8080) من sg-web
sg-api ليس لديه وصول صادر صريح إلى MySQL؟ لا، لديه Outbound: All traffic لذا فهو موافق.
التحقق الأعمق: هل خادم API موجود بالفعل في sg-api؟
aws ec2 describe-instances --filters "Name=private-ip-address,Values=10.0.11.30" \
--query 'Reservations[].Instances[].SecurityGroups'
السبب المحتمل: ربما لم يتم إرفاق خادم API بمجموعة الأمان الصحيحة!
تمرين 4: خادم الويب لا يمكنه تثبيت الحزم
الأعراض: لا يمكن لخادم الويب تنفيذ yum update.
$ sudo yum update
Loaded plugins: priorities, update-motd, upgrade-helper
Could not retrieve mirrorlist https://... error was
12: Timeout on ...
الأسئلة:
- لماذا لا يمكن للخادم الوصول إلى الإنترنت؟
- تحقق من تكوين الشبكة.
- اقترح الحل.
💡 حل تمرين 4
التحليل:
خادم الويب موجود في الشبكة الفرعية الخاصة (10.0.11.0/24) التي تستخدم rtb-private.
rtb-private:
10.0.0.0/16 → local
0.0.0.0/0 → nat-xyz789
المسار إلى NAT Gateway موجود! دعونا نتحقق:
قائمة التحقق من NAT Gateway:
- هل NAT Gateway في حالة "متاح"؟
aws ec2 describe-nat-gateways --nat-gateway-ids nat-xyz789
-
هل NAT Gateway في شبكة فرعية مع IGW؟
- NAT في 10.0.1.0/24 (عام) ✅
-
هل لدى NAT Gateway عنوان Elastic IP؟
- EIP: 52.4.5.6 ✅
-
هل تحتوي الشبكة الفرعية العامة على المسار إلى IGW؟
- 0.0.0.0/0 → igw-abc123 ✅
إذا كان كل شيء موافقًا من جانب NAT، تحقق من:
-
مجموعة الأمان لـ NAT Gateway؟
- NAT Gateway ليس لديه SG (إنها خدمة مُدارة)
-
هل NACL للشبكة الفرعية الخاصة يسمح بالخروج؟
السبب المحتمل: NACL مقيد على الشبكة الفرعية الخاصة الذي يحجب حركة المرور الصادرة أو المنافذ المؤقتة الواردة.
الحل:
# تحقق من NACL
aws ec2 describe-network-acls \
--filters "Name=association.subnet-id,Values=subnet-private"
# تأكد من أن القواعد تسمح بـ:
# الصادر: 0.0.0.0/0 (كل حركة المرور)
# الوارد: المنافذ المؤقتة 1024-65535 (للردود)
تمرين 5: قاعدة البيانات لا تتلقى اتصالات
الأعراض: بعد تصحيح التمرين 3، تظهر سجلات قاعدة البيانات 0 اتصالات.
التكوين الإضافي المكشوف:
NACL للشبكة الفرعية لقاعدة البيانات (acl-db):
┌────────┬──────────┬───────────┬─────────────┬────────┐
│ رقم القاعدة │ النوع │ المنفذ │ المصدر/الوجهة │ الإجراء │
├────────┼──────────┼───────────┼─────────────┼────────┤
│ 100 │ الوارد │ 3306 │ 10.0.1.0/24 │ ALLOW │
│ * │ الوارد │ الكل │ 0.0.0.0/0 │ DENY │
├────────┼──────────┼───────────┼─────────────┼────────┤
│ 100 │ الصادر │ 1024-65535│ 10.0.1.0/24 │ ALLOW │
│ * │ الصادر │ الكل │ 0.0.0.0/0 │ DENY │
└────────┴──────────┴───────────┴─────────────┴────────┘
الأسئلة:
- ما هي المشكلة مع هذا NACL؟
- لماذا يتم حجب اتصالات API؟
- صحح NACL.
💡 حل تمرين 5
المشكلة:
NACL يسمح بحركة مرور MySQL (3306) فقط من 10.0.1.0/24 (الشبكة الفرعية العامة).
لكن خادم API موجود في 10.0.11.0/24 (الشبكة الفرعية الخاصة بالتطبيق)!
القاعدة 100 الوارد: 3306 من 10.0.1.0/24 → لا يشمل 10.0.11.0/24
الحل:
# إضافة قاعدة للشبكة الفرعية للتطبيق
aws ec2 create-network-acl-entry \
--network-acl-id acl-db \
--rule-number 110 \
--protocol tcp \
--port-range From=3306,To=3306 \
--cidr-block 10.0.11.0/24 \
--rule-action allow \
--ingress
# إضافة القاعدة الصادرة المقابلة
aws ec2 create-network-acl-entry \
--network-acl-id acl-db \
--rule-number 110 \
--protocol tcp \
--port-range From=1024,To=65535 \
--cidr-block 10.0.11.0/24 \
--rule-action allow \
--egress
الدرس المستفاد: NACLs غير متزامنة ودقيقة جدًا بشأن المصادر/الوجهات.
الجزء 3: تمرين شامل
مهمتك
قم بتوثيق إجراء استكشاف الأخطاء الكامل لفريقك.
قم بإنشاء مستند يحتوي على:
-
مخطط تدفق التشخيص: شجرة قرار للمشاكل الشائعة
-
أوامر التحقق: قائمة بأوامر AWS CLI الأساسية
-
قائمة تحقق سريعة: قائمة تحقق لكل نوع من المشاكل
-
الدروس المستفادة: الأخطاء الشائعة وكيفية تجنبها
قالب التسليم
# إجراء استكشاف أخطاء شبكة VPC
## 1. مخطط تدفق التشخيص
[أدخل مخططك]
## 2. أوامر التحقق
### حالة المثيلات
```bash
[أوامرك]
مجموعات الأمان
[أوامرك]
المسارات
[أوامرك]
3. قائمة التحقق حسب الأعراض
انتهاء المهلة من الإنترنت
- ...
- ...
انتهاء المهلة إلى الإنترنت
- ...
- ...
4. الدروس المستفادة
| الخطأ الشائع | كيفية تجنبه |
|---|---|
| ... | ... |
## معايير التقييم
| المعيار | النقاط |
|---------|--------|
| تحليل التمارين 1-5 بشكل صحيح | /50 |
| مخطط تدفق واضح وكامل | /15 |
| أوامر ذات صلة | /15 |
| قائمة تحقق قابلة للاستخدام | /10 |
| دروس مستفادة ذات صلة | /10 |
| **المجموع** | **/100** |
---
*الأسبوع القادم: [نشر الويب](../module_07/index.mdx)*