VPC: شبكتك الخاصة
افتح الشبكة اللي كانت سيرفراتك تشتغل فيها، وافهم نطاقات العناوين والشبكات الفرعية وبوابات الإنترنت وNAT وجداول التوجيه والوصول الآمن وجداري الحماية وسجلات الزيارات، ثم ابنِ VPC من الصفر.
- الفكرة الأساسية
- تعريف
- متى يُستخدم
- تنبيه
في هذا المقال
كل سيرفر شغّلناه في هذي السلسلة كان داخل شبكة ما بنيتها: الـ VPC الافتراضية اللي تنشئها AWS في كل Region. وهي تكفي للتجارب، بس التطبيق الحقيقي يحتاج تصميم تكون فيه قاعدة البيانات مخفية، ولكل طبقة مكانها.
وش هي VPC؟
VPC (Virtual Private Cloud) شبكتك الخاصة داخل Region واحدة. تمتد على كل مناطق التوفر فيها، وما يدخلها أو يطلع منها شي إلا اللي تسمح له. هذا التصميم الشائع:
نطاقات العناوين: كيف تقرأ CIDR
تكتب نطاق العناوين بصيغة CIDR، مثل 10.0.0.0/16. والرقم بعد الشرطة يقول كم بت ثابت من أصل 32، فكل ما صغر الرقم كبر النطاق:
| CIDR | عدد العناوين | استخدام شائع |
|---|---|---|
/32 |
1 | عنوان واحد |
/28 |
16 | أصغر VPC أو شبكة فرعية |
/24 |
256 | شبكة فرعية |
/16 |
65,536 | أكبر VPC |
/0 |
كل العناوين | 0.0.0.0/0 يعني أي مكان |
استخدم النطاقات الخاصة: 10.0.0.0/8 أو 172.16.0.0/12 أو 192.168.0.0/16. والـ VPC الافتراضية تستخدم 172.31.0.0/16.
الشبكات الفرعية (Subnets)
الـ Subnet جزء من نطاق الـ VPC، وأهم شي تعرفه عنها:
- تعيش في منطقة توفر واحدة. فعشان التوفر العالي تحتاج شبكات في منطقتين على الأقل.
- AWS تحجز 5 عناوين في كل شبكة: أول أربعة وآخر عنوان. فـ
/24يعطيك 251 عنوان مو 256. - "عامة" و"خاصة" مو إعداد. الشبكة تصير عامة لما يكون في جدول توجيهها طريق لبوابة الإنترنت.
جداول التوجيه وبوابة الإنترنت
بوابة الإنترنت (Internet Gateway) تربط الـ VPC بالإنترنت. وجدول التوجيه (Route Table) يحدد وين تروح كل زيارة. فجدول الشبكة العامة يكون كذا:
| الوجهة | الهدف | المعنى |
|---|---|---|
10.0.0.0/16 |
local |
داخل الـ VPC، وهذا موجود دايماً |
0.0.0.0/0 |
igw-... |
أي شي ثاني يروح للإنترنت |
وعشان يوصل أحد للسيرفر من الخارج، يحتاج عنوان عام كمان. وتذكر من الجزء الرابع إن كل عناوين IPv4 العامة مدفوعة.
NAT Gateway: طلوع بدون دخول
السيرفر في الشبكة الخاصة يحتاج يطلع أحياناً، مثلاً لتحميل التحديثات، بس ما تبي أحد يدخل عليه. هذا دور NAT Gateway: يجلس في الشبكة العامة، ويطلّع طلبات السيرفرات الخاصة بعنوانه هو، وما يقبل اتصال يبدأ من الخارج.
وجدول الشبكة الخاصة فيه 0.0.0.0/0 يشير لـ nat-... بدل بوابة الإنترنت. وعندك أكثر من شكل:
| الشكل | كيف يشتغل |
|---|---|
| NAT Gateway لمنطقة واحدة | لازم واحد في كل منطقة توفر، وإلا تعطلت الشبكات الخاصة في باقي المناطق لو طاحت منطقته |
| NAT Gateway إقليمي | أحدث، ويتوسع تلقائياً للمناطق اللي فيها سيرفراتك، ويُحسب لكل منطقة شغّالة |
| NAT Instance | سيرفر EC2 تديره بنفسك: تدفع على السيرفر بدل كل جيجابايت، وسرعته حسب حجمه، وما له تحويل تلقائي عند العطل، ولازم تطفي فحص Source/Destination. ممكن يكون أرخص للأحمال الصغيرة جداً، بس AWS توصي بـ NAT Gateway |
كيف توصل لسيرفر خاص؟
ما له عنوان عام، فكيف تدخل عليه؟
| الطريقة | كيف | ملاحظات |
|---|---|---|
| Bastion Host | سيرفر عام تدخل منه بـ SSH | قديمة: مفاتيح ومنفذ مفتوح وسيرفر زيادة تأمّنه |
| EC2 Instance Connect Endpoint | نقطة داخل شبكتك توصلك بالسيرفر بدون عنوان عام | مجانية، وبنستخدمها في التجربة |
| Session Manager | طرفية عبر خدمة SSM، بدون منفذ 22 | يحتاج دور IAM، ويسجّل الجلسات |
جدارين حماية: مجموعات الأمان وNACL
مجموعة الأمان تعرفها، وهي حول السيرفر. وفيه جدار ثاني اسمه NACL حول الشبكة الفرعية:
| مجموعة الأمان | NACL | |
|---|---|---|
| المستوى | السيرفر | الشبكة الفرعية |
| القواعد | سماح فقط | سماح ومنع |
| الحالة | تتذكر الاتصال، فالرد يطلع تلقائياً | ما تتذكر، فلازم تسمح للرد كمان |
| التقييم | كل القواعد | بالترتيب، وأول قاعدة تنطبق تكفي |
| الافتراضي | الدخول ممنوع والخروج مسموح | الافتراضية تسمح بالكل، والجديدة تمنع الكل |
وبما إن NACL ما تتذكر الاتصال، لازم تسمح لردود السيرفر عبر المنافذ المؤقتة (عادةً 1024-65535)، وهذا يسبب أخطاء كثيرة.
القاعدة العملية: خل NACL الافتراضية على حالها، واشتغل بمجموعات الأمان. واستخدم NACL لو تبي تمنع نطاق عناوين بسرعة، لأن مجموعة الأمان ما تقدر تمنع.
سجلات الزيارات (Flow Logs)
لما ما يوصل طلب وما تعرف ليش، Flow Logs تسجّل بيانات كل اتصال على مستوى VPC أو شبكة أو واجهة، وترسلها لـ CloudWatch Logs أو S3. والسطر يكون كذا:
2 123456789012 eni-0abc 203.0.113.7 10.0.1.5 49152 22 6 5 300 1730000000 1730000060 REJECT OK
يعني: من 203.0.113.7 إلى 10.0.1.5 على المنفذ 22، وانرفض. وكيف تشخّص:
- الدخول مرفوض: المشكلة في مجموعة الأمان أو NACL.
- الدخول مقبول والخروج مرفوض: المشكلة في NACL، لأن مجموعة الأمان تسمح للرد تلقائياً.
عملي: ابنِ VPC من الصفر
بنبني شبكة فيها عامة وخاصة، ونشوف بأعيننا إن الفرق كله في جدول التوجيه. كل الأوامر من CloudShell. أول شي الشبكة والفروع:
VPC=$(aws ec2 create-vpc --cidr-block 10.0.0.0/16 \
--tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=series-vpc}]' \
--query Vpc.VpcId --output text)
AZ=$(aws ec2 describe-availability-zones \
--query "AvailabilityZones[0].ZoneName" --output text)
PUBLIC=$(aws ec2 create-subnet --vpc-id $VPC --cidr-block 10.0.1.0/24 \
--availability-zone $AZ --query Subnet.SubnetId --output text)
PRIVATE=$(aws ec2 create-subnet --vpc-id $VPC --cidr-block 10.0.11.0/24 \
--availability-zone $AZ --query Subnet.SubnetId --output text)
الحين بوابة الإنترنت وجدول توجيه للشبكة العامة فقط:
IGW=$(aws ec2 create-internet-gateway \
--query InternetGateway.InternetGatewayId --output text)
aws ec2 attach-internet-gateway --vpc-id $VPC --internet-gateway-id $IGW
RT_PUBLIC=$(aws ec2 create-route-table --vpc-id $VPC \
--query RouteTable.RouteTableId --output text)
aws ec2 create-route --route-table-id $RT_PUBLIC \
--destination-cidr-block 0.0.0.0/0 --gateway-id $IGW
aws ec2 associate-route-table --route-table-id $RT_PUBLIC --subnet-id $PUBLIC
مجموعة أمان تسمح من داخل الشبكة فقط، ونقطة دخول حتى نوصل للسيرفرات بدون فتح منفذ للعالم:
SG=$(aws ec2 create-security-group --group-name series-sg \
--description "SSH and ping from inside the VPC" --vpc-id $VPC \
--query GroupId --output text)
aws ec2 authorize-security-group-ingress --group-id $SG \
--protocol tcp --port 22 --cidr 10.0.0.0/16
aws ec2 authorize-security-group-ingress --group-id $SG \
--protocol icmp --port -1 --cidr 10.0.0.0/16
aws ec2 create-instance-connect-endpoint --subnet-id $PRIVATE \
--security-group-ids $SG --no-preserve-client-ip
وسيرفر في كل شبكة:
AMI=$(aws ssm get-parameter \
--name /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64 \
--query Parameter.Value --output text)
aws ec2 run-instances --image-id $AMI --instance-type t3.micro \
--subnet-id $PUBLIC --security-group-ids $SG --associate-public-ip-address \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=public-server}]'
aws ec2 run-instances --image-id $AMI --instance-type t3.micro \
--subnet-id $PRIVATE --security-group-ids $SG \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=private-server}]'
انتظر كم دقيقة لين تجهز نقطة الدخول. ثم من EC2 حدد السيرفر، واضغط Connect، وفي EC2 Instance Connect اختر الاتصال عبر نقطة الدخول. وعلى كل سيرفر جرّب:
curl -m 5 https://checkip.amazonaws.com
public-server: يطبع عنوانه العام.private-server: ينتهي الوقت بدون جواب، لأن ما عنده طريق للإنترنت.
ومن الخاص جرّب ping على العنوان الخاص للعام، وبيرد لأن طريق local يربطهم.
أضف NAT Gateway
الحين خل الخاص يطلع للإنترنت. وهذي الخطوة مدفوعة بالساعة، فاحذفها بعد التجربة:
ALLOC=$(aws ec2 allocate-address --domain vpc \
--query AllocationId --output text)
NAT=$(aws ec2 create-nat-gateway --subnet-id $PUBLIC --allocation-id $ALLOC \
--query NatGateway.NatGatewayId --output text)
aws ec2 wait nat-gateway-available --nat-gateway-ids $NAT
RT_PRIVATE=$(aws ec2 create-route-table --vpc-id $VPC \
--query RouteTable.RouteTableId --output text)
aws ec2 create-route --route-table-id $RT_PRIVATE \
--destination-cidr-block 0.0.0.0/0 --nat-gateway-id $NAT
aws ec2 associate-route-table --route-table-id $RT_PRIVATE --subnet-id $PRIVATE
أعد نفس أمر curl على private-server. هذي المرة يطبع عنوان، وهو عنوان NAT Gateway مو عنوان السيرفر. فالسيرفر طلع للإنترنت، وما زال ما أحد يقدر يبدأ اتصال به.
الخلاصة
- VPC شبكتك الخاصة في Region، وتقسمها لشبكات فرعية في مناطق التوفر.
- الشبكة عامة لو في جدولها طريق لبوابة الإنترنت، وإلا فهي خاصة.
- NAT Gateway يخلي الخاصة تطلع بدون ما أحد يدخل، وانتبه لتكلفته.
- مجموعات الأمان تتذكر الاتصال وتسمح فقط، وNACL ما تتذكر وتقدر تمنع.
- Flow Logs تقول لك وين انرفض الاتصال.
اختبر نفسك
قبل ما تكمل، جرّب هذي الأسئلة عشان تتأكد إنك فهمت الجزء. كل سؤال موقف عملي، وبعد ما تجاوب يطلع لك الشرح.
السؤال 1 من 6
سيرفر جديد له عنوان عام، ومجموعة الأمان حقته تسمح بـ HTTPS من أي مكان، ومع هذا ما أحد يقدر يوصل له من الإنترنت. والـ VPC مربوط فيها بوابة إنترنت، وجدول توجيه الشبكة الفرعية فيه مسار local فقط. وش الناقص؟
اعرض الجواب
الجواب الصحيح: A
الشبكة الفرعية تصير عامة لما يكون جدول توجيهها يشير لبوابة إنترنت. وبدون هذا المسار، ما فيه طريق للخروج، حتى مع وجود عنوان عام.
- B: NAT يخلي السيرفرات الخاصة تطلع، وما يقبل اتصال يبدأ من الخارج.
- C: مجموعة الأمان تتذكر الاتصال، فالرد يطلع تلقائياً.
- D: Peering يربط شبكتين VPC، وما يعطي طريق للإنترنت.
للمراجعة: جداول التوجيه وبوابة الإنترنت في هذا الجزء، وEnable internet access for a VPC using an internet gateway في وثائق AWS.
السؤال 2 من 6
فريق يخطط لشبكة فرعية لازم تستوعب 30 سيرفر. والعناوين محدودة، فيبي أصغر نطاق يكفي. أي واحد يختار؟
اعرض الجواب
الجواب الصحيح: D
AWS تحجز 5 عناوين في كل شبكة فرعية. و/27 فيه 32، يبقى منها 27، فما يكفي. و/26 فيه 64، يبقى منها 59.
- A: أصغر شبكة فرعية تسمح فيها AWS هي
/28، فهذا ما ينشأ أصلاً. - B: هذا يبقى منه 11 عنوان بس.
- C: هذا يبقى منه 27 عنوان، ناقص ثلاثة عن المطلوب.
للمراجعة: الشبكات الفرعية (Subnets) في هذا الجزء، وSubnet CIDR blocks في وثائق AWS.
السؤال 3 من 6
تطبيق يشتغل في شبكات خاصة على منطقتي توفر، ويتشاركون NAT Gateway لمنطقة واحدة في المنطقة الأولى. ولما تعطلت هذي المنطقة، بقت سيرفرات المنطقة الثانية سليمة، بس انقطع عنها الإنترنت. وش يحل هذا؟
اعرض الجواب
الجواب الصحيح: B
الـ NAT Gateway لمنطقة واحدة يعيش في منطقته، فلو طاحت انقطع كل اللي يعتمدون عليه. ولما يكون فيه واحد في كل منطقة، يبقى العطل في منطقته. وRegional NAT Gateway يعطيك نفس النتيجة تلقائياً.
- A: الـ VPC لها بوابة إنترنت وحدة، والشبكات الخاصة ما توجّه لها.
- C: العناوين الزيادة ما تطلعه من المنطقة المعطلة.
- D: الـ NAT Gateway يجلس في الشبكة العامة، وهذا يقطعه عن الإنترنت.
للمراجعة: NAT Gateway: طلوع بدون دخول في هذا الجزء، وNAT gateway basics في وثائق AWS.
السؤال 4 من 6
عشان يمنع فريق نطاق عناوين مزعج، أنشأ NACL جديدة فيها قاعدة منع لهذا النطاق، وقاعدة سماح دخول للمنفذ 443. والحين ما أحد من الزوار يقدر يفتح الموقع. وFlow Logs تعرض الطلبات ACCEPT والردود REJECT. وش يسوي الفريق؟
اعرض الجواب
الجواب الصحيح: C
NACL ما تتذكر الاتصال، والجديدة تمنع كل شي ما سمحت له، فالردود تحتاج قاعدة خاصة فيها. والدخول المقبول مع الخروج المرفوض يشير مباشرة لـ NACL.
- A: مجموعة الأمان تسمح فقط، فما تقبل قاعدة منع.
- B: مجموعة الأمان تتذكر الاتصال، فكانت تخلي الرد يطلع من الأساس.
- D: هذا يمنع الطلبات كمان.
للمراجعة: جدارين حماية: مجموعات الأمان وNACL وسجلات الزيارات (Flow Logs) في هذا الجزء، وCustom network ACLs for your VPC في وثائق AWS.
السؤال 5 من 6
المهندسين يحتاجون طرفية على سيرفرات في شبكة خاصة. والسيرفرات لازم تبقى بدون عناوين عامة، والفريق ما يبي سيرفر زيادة يحدّثه ويأمّنه. أي خيارين يناسبون؟ (اختر اثنين.)
اعرض الجواب
الجواب الصحيح: C + E
الاثنين يوصلون للسيرفر بدون عنوان عام وبدون سيرفر زيادة تشغله. وSession Manager كمان ما يحتاج منفذ 22، ويسجّل الجلسات.
- A: هذا هو السيرفر الزيادة اللي الفريق ما يبيه.
- B: الـ NAT Gateway يطلّع الزيارات فقط، وما يقبل اتصال يبدأ من الخارج.
- D: هذا يعطي السيرفرات عناوين عامة، وهذا الممنوع بالضبط.
للمراجعة: كيف توصل لسيرفر خاص؟ في هذا الجزء، وSession Manager وEC2 Instance Connect Endpoint في وثائق AWS.
السؤال 6 من 6
فريق جهّز NAT Instance في شبكة عامة ووجّه جدول توجيه الشبكة الخاصة له، ومع هذا السيرفرات الخاصة ما توصل للإنترنت. ومجموعات الأمان تسمح بالزيارات. وش الأرجح إنه نسيه؟
اعرض الجواب
الجواب الصحيح: B
سيرفر EC2 لازم عادةً يكون مصدر زياراته أو وجهتها. والـ NAT Instance يمرر زيارات غيره، فلازم يكون هذا الفحص مطفي.
- A: السيرفرات الخاصة تطلع بعنوان الـ NAT Instance، وما تحتاج عناوين خاصة فيها.
- C: الشبكة العامة تحتاج مسارها لبوابة الإنترنت فقط، وهذا ما يضيف شي.
- D: الـ Gateway Endpoint يوصل لـ S3 وDynamoDB، مو للإنترنت.
للمراجعة: NAT Gateway: طلوع بدون دخول في هذا الجزء، وEnable private resources to communicate outside the VPC في وثائق AWS.
شبكتك الحين جاهزة، بس معزولة. في الجزء الرابع عشر نربطها بشبكات ثانية، وبخدمات AWS، وبمكتبك.