NAT Gateway مقابل NAT Instance: أيهما تختار لإخراج حركة المرور من الشبكات الخاصة؟
عندما تحتاج instances الخاصة بك إلى تحميل تحديثات من الإنترنت دون أن تكون مكشوفة مباشرة، فأنت أمام خيارين رئيسيين في AWS: NAT Gateway المُدار بالكامل، أو NAT Instance تشغّله بنفسك على EC2. القرار يبدو بسيطاً في البداية، لكن في الإنتاج يظهر الفرق الحقيقي عند أول حادثة توافر أو عند مراجعة فاتورة الشهر.
ملخص سريع (TL;DR) — NAT Gateway مقابل NAT Instance
| المعيار | NAT Gateway | NAT Instance (EC2) |
|---|---|---|
| الإدارة | مُدار بالكامل من AWS | مسؤوليتك الكاملة |
| التوافر العالي | مدمج داخل كل Availability Zone | يتطلب بناء HA يدوياً |
| التوسع التلقائي | تلقائي | محدود بحجم الـ instance |
| Security Groups | غير مدعوم مباشرة | مدعوم |
| التكلفة عند حجم صغير | أعلى نسبياً | أقل إذا أُديرت بكفاءة |
| Port Forwarding | غير مدعوم | مدعوم |
| الخيار الموصى به للإنتاج | ✅ نعم | حالات استخدام خاصة فقط |
كيف يعمل NAT في AWS — الأساس قبل الاختيار
الـ NAT (Network Address Translation) يسمح للـ instances داخل الـ private subnet بإرسال طلبات إلى الإنترنت، مع منع الإنترنت من بدء اتصالات مباشرة معها. الـ instance الخاص يرسل الطلب إلى الـ NAT، الذي يستبدل عنوان IP المصدر الخاص بعنوان IP عام، ثم يعيد الاستجابة إلى الـ instance الأصلي.
في كلا الخيارين، يجب أن يكون الـ NAT موجوداً في public subnet مع Internet Gateway مرتبط بالـ VPC، وأن تشير الـ route table الخاصة بالـ private subnet إلى الـ NAT كـ default route للخروج.
10.0.1.5"] -->|"1. طلب HTTP"| RouteTable["Route Table
0.0.0.0/0 → NAT"] RouteTable -->|"2. توجيه"| NAT["NAT Gateway / Instance
Public Subnet"] NAT -->|"3. استبدال IP المصدر"| IGW["Internet Gateway"] IGW -->|"4. إلى الإنترنت"| Internet["الإنترنت"] Internet -->|"5. استجابة"| IGW IGW --> NAT NAT -->|"6. إعادة التوجيه"| PrivInst
- الـ private instance يرسل طلب HTTP إلى الإنترنت.
- الـ route table توجّه الحزمة إلى NAT (Gateway أو Instance) في الـ public subnet.
- الـ NAT يستبدل عنوان IP المصدر بعنوانه العام ويرسل الطلب عبر الـ Internet Gateway.
- الاستجابة تعود إلى الـ NAT الذي يعيد توجيهها إلى الـ private instance الأصلي.
NAT Gateway — الخيار المُدار
NAT Gateway خدمة مُدارة بالكامل من AWS. لا تحتاج إلى تثبيت نظام تشغيل، لا تصحيح أمني، لا مراقبة لصحة الـ instance. AWS تتولى التوسع التلقائي والتوافر داخل الـ Availability Zone التي تنشئه فيها.
فكّر في NAT Gateway كخط أنابيب مُدار — أنت تدفع مقابل الاستخدام، وAWS تضمن أن الأنبوب لن ينكسر.
إنشاء NAT Gateway عبر CLI
تحتاج أولاً إلى Elastic IP، ثم تنشئ الـ Gateway في الـ public subnet:
# تخصيص Elastic IP
aws ec2 allocate-address \
--domain vpc \
--region us-east-1
# إنشاء NAT Gateway (استبدل القيم بمعرفاتك الفعلية)
aws ec2 create-nat-gateway \
--subnet-id subnet-0abc123456789def0 \
--allocation-id eipalloc-0abc123456789def0 \
--region us-east-1
تحديث الـ Route Table للـ Private Subnet
aws ec2 create-route \
--route-table-id rtb-0abc123456789def0 \
--destination-cidr-block 0.0.0.0/0 \
--nat-gateway-id nat-0abc123456789def0 \
--region us-east-1
التحقق من حالة NAT Gateway
aws ec2 describe-nat-gateways \
--nat-gateway-ids nat-0abc123456789def0 \
--query 'NatGateways[*].{ID:NatGatewayId,State:State,SubnetId:SubnetId}' \
--output table \
--region us-east-1
نقطة عملياتية مهمة — NAT Gateway وتعدد الـ AZs
NAT Gateway يعمل داخل AZ واحد. إذا فشل ذلك الـ AZ، تتأثر الـ instances التي تعتمد عليه. الممارسة الصحيحة في الإنتاج هي إنشاء NAT Gateway منفصل في كل AZ تستخدمه، وتوجيه كل private subnet إلى الـ NAT Gateway الموجود في نفس الـ AZ.
هذا يعني تكلفة إضافية — لكنه يعني أيضاً أن فشل AZ واحد لا يوقف بقية بيئتك.
- كل AZ يحتوي على NAT Gateway مستقل في الـ public subnet الخاصة به.
- الـ private subnet في كل AZ تشير في الـ route table إلى NAT Gateway نفس الـ AZ.
- فشل AZ-B لا يؤثر على حركة المرور الخارجة من AZ-A أو AZ-C.
NAT Instance — التحكم الكامل بثمن التعقيد
NAT Instance هو EC2 instance عادي تُشغّل عليه ميزة IP forwarding وتضبط قواعد iptables لتنفيذ الـ NAT يدوياً. AWS كانت توفر AMIs جاهزة لهذا الغرض، لكن الموصى به الآن هو استخدام Amazon Linux 2 أو أي AMI تختاره مع تفعيل IP forwarding.
المتطلبات الأساسية لـ NAT Instance
أول شيء يفوت كثيراً من المهندسين: يجب تعطيل Source/Destination Check على الـ instance. بشكل افتراضي، EC2 يرفض الحزم التي ليس هو مصدرها أو وجهتها — وهذا بالضبط ما يفعله الـ NAT. إذا نسيت هذه الخطوة، لن يمر أي ترافيك وستقضي وقتاً طويلاً تتساءل لماذا.
# تعطيل Source/Destination Check على NAT Instance
aws ec2 modify-instance-attribute \
--instance-id i-0abc123456789def0 \
--no-source-dest-check \
--region us-east-1
تفعيل IP Forwarding وإعداد iptables
🔽 انقر لعرض أوامر إعداد NAT Instance
# على NAT Instance نفسه (Amazon Linux 2)
# تفعيل IP forwarding
sudo sysctl -w net.ipv4.ip_forward=1
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
# إعداد NAT باستخدام iptables
# استبدل eth0 بواجهة الشبكة الفعلية
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -j ACCEPT
sudo iptables -A FORWARD -o eth0 -j ACCEPT
# حفظ القواعد لتبقى بعد إعادة التشغيل
sudo service iptables save
Security Group لـ NAT Instance
على عكس NAT Gateway، يمكنك تطبيق Security Group على NAT Instance — وهذا أحد أسباب اختياره في حالات معينة. الحد الأدنى المطلوب:
# إنشاء Security Group للـ NAT Instance
aws ec2 create-security-group \
--group-name nat-instance-sg \
--description 'Security group for NAT Instance' \
--vpc-id vpc-0abc123456789def0 \
--region us-east-1
# السماح بحركة المرور الواردة من الـ private subnets
aws ec2 authorize-security-group-ingress \
--group-id sg-0abc123456789def0 \
--protocol -1 \
--port -1 \
--cidr 10.0.0.0/8 \
--region us-east-1
# السماح بحركة المرور الصادرة إلى الإنترنت
aws ec2 authorize-security-group-egress \
--group-id sg-0abc123456789def0 \
--protocol -1 \
--port -1 \
--cidr 0.0.0.0/0 \
--region us-east-1
تشخيص مشكلة حقيقية — عندما يبدو كل شيء صحيحاً لكن الترافيك لا يمر
سيناريو شائع: أنشأت NAT Instance، ضبطت الـ route table، لكن الـ private instances لا تستطيع الوصول إلى الإنترنت. الـ ping لا يعمل، الـ curl يتوقف. تبدأ بالتحقق من الـ route table — تبدو صحيحة. تتحقق من الـ Internet Gateway — مرتبط. تتحقق من Security Group الخاص بالـ private instance — يسمح بالخروج.
الخطأ الكلاسيكي هنا هو افتراض أن المشكلة في الـ private instance، بينما الجاني الفعلي هو Source/Destination Check الذي لم يُعطَّل على الـ NAT Instance. EC2 يرفض صامتاً الحزم التي تمر عبره لأنه ليس مصدرها أو وجهتها. لا رسالة خطأ واضحة، لا log مباشر يشير إلى هذا — فقط ترافيك يختفي.
# التحقق من حالة Source/Destination Check
aws ec2 describe-instances \
--instance-ids i-0abc123456789def0 \
--query 'Reservations[*].Instances[*].{InstanceId:InstanceId,SourceDestCheck:SourceDestCheck}' \
--output table \
--region us-east-1
إذا أظهر الناتج SourceDestCheck: true، فهذا هو السبب. أعد تشغيل الأمر السابق لتعطيله.
Source/Destination Check هو الفخ الأول لكل من يبني NAT Instance للمرة الأولى — وأحياناً للمرة الثانية أيضاً.
دليل القرار — أيهما تختار؟
أو Security Groups على NAT؟"} Q1 -->|لا - تطوير/اختبار| Q3{"التكلفة أولوية؟"} Q2 -->|لا| NATGW["✅ NAT Gateway
الخيار الموصى به"] Q2 -->|نعم| NATINST["NAT Instance
مع إدارة HA يدوياً"] Q3 -->|نعم| NATINST Q3 -->|لا| NATGW
اختر NAT Gateway إذا:
- بيئة إنتاج تتطلب توافراً عالياً دون تعقيد تشغيلي.
- فريقك لا يريد إدارة تصحيحات أمنية أو مراقبة صحة instance إضافي.
- حجم الترافيك متغير أو يصعب التنبؤ به.
- الأولوية هي الموثوقية وليس تحسين التكلفة على حساب الوقت التشغيلي.
اختر NAT Instance إذا:
- تحتاج إلى Port Forwarding أو تصفية ترافيك متقدمة.
- بيئة تطوير أو اختبار حيث التكلفة أهم من التوافر العالي.
- تحتاج إلى تطبيق Security Groups مباشرة على نقطة الخروج.
- لديك متطلبات تدقيق أو تسجيل مخصصة لا يوفرها NAT Gateway.
IAM — الصلاحيات المطلوبة لإدارة NAT Gateway
إذا كنت تدير NAT Gateway عبر أدوار IAM أو تفويض الصلاحيات لفريق، هذه الصلاحيات الدنيا المطلوبة:
🔽 انقر لعرض IAM Policy لإدارة NAT Gateway
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ManageNATGateway",
"Effect": "Allow",
"Action": [
"ec2:CreateNatGateway",
"ec2:DeleteNatGateway",
"ec2:DescribeNatGateways",
"ec2:AllocateAddress",
"ec2:ReleaseAddress",
"ec2:DescribeAddresses",
"ec2:CreateRoute",
"ec2:DeleteRoute",
"ec2:DescribeRouteTables"
],
"Resource": "*"
}
]
}
لاحظ أن عمليات مثل DescribeNatGateways وDescribeAddresses تتطلب "Resource": "*" لأنها لا تدعم تحديد ARN على مستوى المورد — تحقق دائماً من Service Authorization Reference قبل تضييق الصلاحيات.
مراقبة NAT Gateway عبر CloudWatch
NAT Gateway يرسل مقاييس إلى CloudWatch تلقائياً. المقاييس الأكثر أهمية في الإنتاج:
# عرض مقاييس NAT Gateway المتاحة
aws cloudwatch list-metrics \
--namespace AWS/NATGateway \
--dimensions Name=NatGatewayId,Value=nat-0abc123456789def0 \
--region us-east-1
# استعلام عن عدد الاتصالات النشطة
aws cloudwatch get-metric-statistics \
--namespace AWS/NATGateway \
--metric-name ActiveConnectionCount \
--dimensions Name=NatGatewayId,Value=nat-0abc123456789def0 \
--start-time 2024-01-01T00:00:00Z \
--end-time 2024-01-01T01:00:00Z \
--period 300 \
--statistics Maximum \
--region us-east-1
الخلاصة والخطوات التالية — NAT Gateway هو الافتراضي الصحيح
في معظم حالات الإنتاج، NAT Gateway هو الاختيار الصحيح. التكلفة الإضافية مقابل NAT Instance تُبرَّر بغياب عبء الإدارة التشغيلية، وبالتوافر المدمج الذي يصعب تحقيقه يدوياً بنفس الموثوقية. NAT Instance يبقى خياراً مشروعاً في سيناريوهات محددة — بيئات تطوير، متطلبات Port Forwarding، أو حين تحتاج إلى تصفية ترافيك متقدمة على نقطة الخروج.
الخطوات التالية الموصى بها:
- راجع التوثيق الرسمي لـ NAT Gateway للاطلاع على أحدث القيود والمواصفات.
- إذا كنت في بيئة متعددة الـ AZs، خطط لنشر NAT Gateway منفصل في كل AZ.
- فعّل VPC Flow Logs لمراقبة حركة المرور الخارجة وتشخيص أي مشكلات مستقبلية.
- راجع التكلفة الشهرية للـ NAT Gateway مقابل حجم البيانات المنقولة — التسعير يتغير، تحقق دائماً من صفحة تسعير VPC.
مسرد المصطلحات
| المصطلح | التعريف |
|---|---|
| NAT (Network Address Translation) | تقنية تستبدل عنوان IP المصدر الخاص بعنوان عام عند الخروج إلى الإنترنت. |
| Elastic IP | عنوان IPv4 عام ثابت تخصصه لحسابك في AWS، مطلوب لـ NAT Gateway. |
| Source/Destination Check | ميزة EC2 تتحقق أن الحزم الواردة أو الصادرة تخص الـ instance نفسه — يجب تعطيلها على NAT Instance. |
| Route Table | جدول يحدد كيفية توجيه حركة المرور داخل الـ VPC وخارجه. |
| Internet Gateway | مكوّن VPC يتيح الاتصال بين الـ VPC والإنترنت، مطلوب لكلا خياري الـ NAT. |
تعليقات
إرسال تعليق