استكشاف أخطاء شبكة VPC
مقدمة
استكشاف أخطاء الشبكة مهارة أساسية. تعلمك هذه القسم طريقة منهجية لتشخيص مشاكل الاتصال.
طريقة التشخيص
┌─────────────────────────────────────────────────────────────┐
│ طريقة من 5 خطوات │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. تحديد العَرَض │
│ └─► ما الذي لا يعمل بالضبط؟ │
│ │
│ 2. التحقق من المسار │
│ └─► من أين يجب أن يمر المرور؟ │
│ │
│ 3. اختبار كل مكون │
│ └─► IGW → Route Table → NACL → SG → Instance │
│ │
│ 4. تحليل السجلات │
│ └─► VPC Flow Logs, CloudWatch │
│ │
│ 5. التصحيح والتحقق │
│ └─► تطبيق الإصلاح، اختبار مرة أخرى │
│ │
└─────────────────────────────────────────────────────────────┘
قائمة التحقق من التشخيص
مشكلة: "لا أستطيع الوصول إلى مثيلتي من الإنترنت"
┌─────────────────────────────────────────────────────────────┐
│ قائمة التحقق للوصول من الإنترنت → المثيل │
├─────────────────────────────────────────────────────────────┤
│ │
│ ☐ 1. هل لدى المثيل عنوان IP عام أو Elastic IP؟ │
│ aws ec2 describe-instances --instance-id i-xxx │
│ → تحقق من "PublicIpAddress" │
│ │
│ ☐ 2. هل لدى VPC بوابة إنترنت متصلة؟ │
│ aws ec2 describe-internet-gateways │
│ → تحقق من "Attachments" → "State: available" │
│ │
│ ☐ 3. هل لدى جدول المسار مسار إلى IGW؟ │
│ aws ec2 describe-route-tables --route-table-id rtb-xxx │
│ → تحقق من: 0.0.0.0/0 → igw-xxx │
│ │
│ ☐ 4. هل NACL يسمح بالمرور؟ │
│ aws ec2 describe-network-acls │
│ → Inbound و Outbound (المنافذ المؤقتة!) │
│ │
│ ☐ 5. هل مجموعة الأمان تسمح بالمنفذ؟ │
│ aws ec2 describe-security-groups --group-ids sg-xxx │
│ → تحقق من قاعدة inbound للمنفذ │
│ │
│ ☐ 6. هل المثيل قيد التشغيل؟ │
│ aws ec2 describe-instance-status --instance-id i-xxx │
│ → State: running, Status checks: passed │
│ │
│ ☐ 7. هل الخدمة تستمع على المنفذ الصحيح؟ │
│ (على المثيل) netstat -tlnp | grep :80 │
│ → يجب أن تستمع الخدمة على 0.0.0.0:80 │
│ │
└─────────────────────────────────────────────────────────────┘
مشكلة: "مثيلتي لا يمكنها الوصول إلى الإنترنت"
┌─────────────────────────────────────────────────────────────┐
│ قائمة التحقق للمثيل → الإنترنت │
├─────────────────────────────────────────────────────────────┤
│ │
│ الحالة 1: مثيل في Subnet عام │
│ ─────────────────────────────────── │
│ │
│ ☐ هل لدى المثيل عنوان IP عام؟ │
│ ☐ هل يوجد مسار 0.0.0.0/0 → igw-xxx؟ │
│ ☐ هل SG outbound يسمح بالمرور؟ │
│ ☐ هل NACL outbound يسمح؟ │
│ ☐ هل NACL inbound يسمح بالردود (المنافذ المؤقتة)؟ │
│ │
│ الحالة 2: مثيل في Subnet خاص │
│ ────────────────────────────────── │
│ │
│ ☐ هل يوجد NAT Gateway في subnet العام؟ │
│ ☐ هل يوجد مسار 0.0.0.0/0 → nat-xxx؟ │
│ ☐ هل NAT Gateway في حالة "available"؟ │
│ ☐ هل لدى NAT Gateway عنوان Elastic IP؟ │
│ ☐ هل SG outbound للمثيل يسمح؟ │
│ │
└─────────────────────────────────────────────────────────────┘
مشكلة: "المثيلات في نفس VPC لا تتواصل"
┌─────────────────────────────────────────────────────────────┐
│ قائمة التحقق للاتصال داخل VPC │
├─────────────────────────────────────────────────────────────┤
│ │
│ ☐ 1. هل المثيلات في نفس VPC؟ │
│ │
│ ☐ 2. هل يوجد مسار "local"؟ (عادة تلقائي) │
│ 10.0.0.0/16 → local │
│ │
│ ☐ 3. هل مجموعة الأمان SOURCE تسمح؟ │
│ قاعدة inbound: sg-destination أو CIDR subnet │
│ │
│ ☐ 4. هل مجموعة الأمان DESTINATION تسمح؟ │
│ قاعدة inbound للمنفذ والمصدر │
│ │
│ ☐ 5. هل NACL للـ subnets الاثنين يسمح؟ │
│ (تحقق من الاتجاهين) │
│ │
│ ☐ 6. هل تستخدم IP الخاص؟ │
│ لا تستخدم IP العام للاتصال داخل VPC │
│ │
└─────────────────────────────────────────────────────────────┘
سيناريوهات استكشاف الأخطاء
سيناريو 1: Timeout SSH
┌─────────────────────────────────────────────────────────────┐
│ سيناريو: SSH TIMEOUT │
├─────────────────────────────────────────────────────────────┤
│ │
│ العَرَض: ssh -i key.pem ec2-user@52.1.2.3 │
│ Connection timed out │
│ │
│ التشخيص: │
│ │
│ 1. Ping عنوان IP العام │
│ $ ping 52.1.2.3 │
│ → إذا كان timeout: مشكلة قبل المثيل │
│ │
│ 2. تحقق من مجموعة الأمان │
│ $ aws ec2 describe-security-groups --group-ids sg-xxx │
│ │
│ المشكلة المكتشفة: │
│ ┌────────────────────────────────────────────┐ │
│ │ قواعد Inbound: │ │
│ │ النوع: SSH، المنفذ: 22، المصدر: 10.0.0.0/16 │ │
│ │ │ │
│ │ ❌ المصدر محدود إلى VPC! │ │
│ │ عنوان IP العام الخاص بك غير مسموح │ │
│ └────────────────────────────────────────────┘ │
│ │
│ الحل: │
│ $ aws ec2 authorize-security-group-ingress \ │
│ --group-id sg-xxx \ │
│ --protocol tcp --port 22 \ │
│ --cidr عنوان_IP_الخاص_بك/32 │
│ │
└─────────────────────────────────────────────────────────────┘
سيناريو 2: موقع الويب غير متاح
┌─────────────────────────────────────────────────────────────┐
│ سيناريو: HTTP 502 / TIMEOUT │
├─────────────────────────────────────────────────────────────┤
│ │
│ العَرَض: curl http://52.1.2.3 → timeout │
│ │
│ التشخيص: │
│ │
│ 1. اختبار المنفذ من جهازك │
│ $ nc -zv 52.1.2.3 80 │
│ → إذا كان "Connection refused" = SG OK، الخدمة KO │
│ → إذا كان "timeout" = SG أو التوجيه KO │
│ │
│ 2. تحقق من جدول المسار │
│ $ aws ec2 describe-route-tables │
│ │
│ المشكلة المكتشفة: │
│ ┌────────────────────────────────────────────┐ │
│ │ المسارات: │ │
│ │ 10.0.0.0/16 → local │ │
│ │ │ │
│ │ ❌ لا يوجد مسار إلى IGW! │ │
│ │ الـ subnet خاص │ │
│ └────────────────────────────────────────────┘ │
│ │
│ الحل: │
│ $ aws ec2 create-route \ │
│ --route-table-id rtb-xxx \ │
│ --destination-cidr-block 0.0.0.0/0 \ │
│ --gateway-id igw-xxx │
│ │
└─────────────────────────────────────────────────────────────┘
سيناريو 3: التطبيق لا يمكنه الوصول إلى قاعدة البيانات
┌─────────────────────────────────────────────────────────────┐
│ سيناريو: APP → DB TIMEOUT │
├─────────────────────────────────────────────────────────────┤
│ │
│ العَرَض: خطأ في التطبيق "Cannot connect to database" │
│ │
│ التكوين: │
│ • خادم التطبيق: 10.0.11.5 (sg-app) │
│ • خادم قاعدة البيانات: 10.0.21.10 (sg-db) │
│ │
│ التشخيص: │
│ │
│ 1. من خادم التطبيق، اختبار الاتصال │
│ $ nc -zv 10.0.21.10 3306 │
│ → timeout │
│ │
│ 2. تحقق من SG لقاعدة البيانات │
│ $ aws ec2 describe-security-groups --group-ids sg-db │
│ │
│ المشكلة المكتشفة: │
│ ┌────────────────────────────────────────────┐ │
│ │ قواعد Inbound: │ │
│ │ النوع: MySQL، المنفذ: 3306، المصدر: sg-web │ │
│ │ │ │
│ │ ❌ sg-app غير مسموح! │ │
│ │ فقط sg-web يمكنه الوصول │ │
│ └────────────────────────────────────────────┘ │
│ │
│ الحل: │
│ $ aws ec2 authorize-security-group-ingress \ │
│ --group-id sg-db \ │
│ --protocol tcp --port 3306 \ │
│ --source-group sg-app │
│ │
└─────────────────────────────────────────────────────────────┘
سجلات تدفق VPC
تفعيل سجلات التدفق
# إنشاء مجموعة سجلات CloudWatch
aws logs create-log-group --log-group-name /aws/vpc/flow-logs
# تفعيل سجلات التدفق على VPC
aws ec2 create-flow-logs \
--resource-type VPC \
--resource-ids vpc-xxx \
--traffic-type ALL \
--log-destination-type cloud-watch-logs \
--log-group-name /aws/vpc/flow-logs \
--deliver-logs-permission-arn arn:aws:iam::xxx:role/flow-logs-role
قراءة سجلات التدفق
┌─────────────────────────────────────────────────────────────┐
│ تنسيق سجلات تدفق VPC │
├─────────────────────────────────────────────────────────────┤
│ │
│ version account-id interface-id srcaddr dstaddr │
│ srcport dstport protocol packets bytes start end │
│ action log-status │
│ │
│ مثال: │
│ 2 123456789012 eni-abc123 10.0.1.5 52.1.2.3 │
│ 54321 443 6 10 5000 1234567890 1234567900 │
│ ACCEPT OK │
│ │
│ التفسير: │
│ • المصدر: 10.0.1.5:54321 │
│ • الوجهة: 52.1.2.3:443 │
│ • البروتوكول: 6 (TCP) │
│ • الإجراء: ACCEPT (مسموح) │
│ │
│ الإجراءات الممكنة: │
│ • ACCEPT: المرور مسموح │
│ • REJECT: المرور محظور بواسطة SG أو NACL │
│ │
└─────────────────────────────────────────────────────────────┘
أدوات التشخيص
أوامر مفيدة
# التحقق من حالة المثيل
aws ec2 describe-instance-status --instance-id i-xxx
# التحقق من مجموعة الأمان المرفقة
aws ec2 describe-instances --instance-id i-xxx \
--query 'Reservations[].Instances[].SecurityGroups'
# التحقق من قواعد SG
aws ec2 describe-security-groups --group-ids sg-xxx
# التحقق من جدول المسار لـ subnet
aws ec2 describe-route-tables \
--filters "Name=association.subnet-id,Values=subnet-xxx"
# التحقق من NACL لـ subnet
aws ec2 describe-network-acls \
--filters "Name=association.subnet-id,Values=subnet-xxx"
اختبارات من المثيل
# اختبار الاتصال بالإنترنت
curl -I https://aws.amazon.com
# اختبار حل DNS
nslookup google.com
# اختبار منفذ محدد
nc -zv IP_DESTINATION PORT
# عرض المسارات
ip route
# عرض الاتصالات
netstat -tlnp
ss -tlnp
جدول استكشاف الأخطاء السريع
| العَرَض | السبب المحتمل | التحقق |
|---|---|---|
| Timeout من الإنترنت | SG، المسار، IGW | قائمة التحقق الكاملة |
| Connection refused | الخدمة غير مشغلة | netstat، systemctl |
| Host unreachable | مسار مفقود | جدول المسار |
| بطء/متقطع | NACL غير مهيأ بشكل صحيح | قواعد NACL |
| Intra-VPC timeout | SG بين المثيلات | قواعد SG المتقاطعة |
ملخص
┌─────────────────────────────────────────────────────────────┐
│ ملخص استكشاف الأخطاء │
├─────────────────────────────────────────────────────────────┤
│ │
│ ترتيب التحقق: │
│ │
│ 1. المثيل قيد التشغيل + فحوصات الحالة OK │
│ 2. وجود IP عام (إذا كان الوصول إلى الإنترنت) │
│ 3. IGW متصل بـ VPC │
│ 4. مسار 0.0.0.0/0 → igw (subnet عام) │
│ 5. NACL يسمح (+ المنافذ المؤقتة) │
│ 6. مجموعة الأمان تسمح │
│ 7. الخدمة تستمع على المنفذ │
│ │
│ الأدوات: │
│ • aws ec2 describe-* (حالة الموارد) │
│ • سجلات تدفق VPC (تحليل المرور) │
│ • nc، curl، ping (اختبارات الاتصال) │
│ │
└─────────────────────────────────────────────────────────────┘
القسم التالي: مختبر: استكشاف أخطاء VPC