گاهی لازم است ترافیک چند ماشین مجازی از یک ماشین مشخص عبور کند تا بتوانید آن را در یک نقطه بازرسی، محدود یا به مقصد دیگری هدایت کنید. به این ماشین، ماشین Gateway گفته می‌شود.

این راهنما نشان می‌دهد چطور ترافیک ماشین‌های A، B، C، D و … را از ماشین X عبور دهید. هر گام یک بخش «بررسی کنید» دارد که دقیقاً می‌گوید چه چیزی باید ببینید و اگر ندیدید یعنی چه.

آیا اصلاً به ماشین Gateway نیاز دارید؟

در حالت عادی خیر. دو نیاز رایجی که کاربران را به ساخت ماشین Gateway سوق می‌دهد، در ستون از قبل حل شده است:

  • دسترسی به اینترنت: هر VPC در ستون یک Gateway اینترنت دارد که برای تمام ماشین‌های آن VPC دسترسی اینترنت فراهم می‌کند، بدون آنکه لازم باشد به تک‌تک ماشین‌ها IP خارجی اختصاص دهید.
  • اعمال سیاست‌های شبکه: برای محدود کردن ترافیک ماشین‌ها لازم نیست ماشین جداگانه‌ای به‌عنوان دیوار آتش بسازید. «گروه دسترسی امن» (Security Group) دقیقاً برای همین کار طراحی شده و مدیریت آن ساده‌تر و مطمئن‌تر است.

ساخت ماشین Gateway فقط برای موارد خاص لازم است؛ مثلاً وقتی می‌خواهید ترافیک را از یک تانل به سایت دیگری هدایت کنید، یا به کنترلی نیاز دارید که در گروه دسترسی امن قابل بیان نیست.

این راهنما با چه ابزاری پیاده‌سازی شده است؟

تمام سناریوهای این راهنما با ابزارهای استاندارد Linux Kernel پیاده‌سازی شده‌اند: ip برای مدیریت Route و ساخت تانل، sysctl برای فعال کردن عبور بسته، و iptables برای NAT. بنابراین می‌توانید دستورها را مستقیماً روی هر ماشین مجازی با سیستم‌عامل Linux اجرا کنید.

اما مفاهیم پشت این دستورها به سیستم‌عامل خاصی وابسته نیستند. اگر ترجیح می‌دهید نقش Gateway را با pfSense، MikroTik یا هر دستگاه شبکه‌ی دیگری پیاده‌سازی کنید، خواندن این راهنما همچنان به کار شما می‌آید؛ چون آنچه باید بدانید در همه‌ی پیاده‌سازی‌ها یکسان است و فقط شکل نوشتن پیکربندی فرق می‌کند:

  • کدام تنظیم در پنل ستون انجام می‌شود و بدون آن هیچ پیکربندی‌ای روی خود دستگاه اثر نخواهد داشت.
  • چه ترافیکی باید SNAT شود و چرا.
  • در هر مرحله ترافیک کجا می‌تواند گم شود و چطور آن را ردیابی کنید.

توپولوژی نمونه

در تمام این راهنما از مقادیر زیر استفاده می‌شود. آن‌ها را با مقادیر خودتان جایگزین کنید.

نقشماشین‏IP داخلی‏IP خارجی
ماشین Gateway‏X192.168.50.224185.248.32.39
ماشین پشت Gateway‏A192.168.50.11ندارد
ماشین پشت Gateway‏B192.168.50.12ندارد
ماشین پشت Gateway‏C192.168.50.13ندارد

هر چهار ماشین در یک سابنت مشترک با CIDR برابر 192.168.50.0/24 قرار دارند و نام اینترفیس شبکه در داخل ماشین eth0 است.

پیش از شروع این را بخوانید

پرتکرارترین مشکل در راه‌اندازی ماشین Gateway این است: Route را درست اضافه کرده‌اید، عبور بسته روشن است و پیکربندی داخل ماشین بی‌عیب به نظر می‌رسد، اما هیچ ترافیکی عبور نمی‌کند و هیچ خطایی هم نمی‌بینید.

علتش این است که در شبکه‌ی ستون، یک ماشین به‌صورت پیش‌فرض اجازه ندارد ترافیک ماشین‌های دیگر را جابه‌جا کند. چنین بسته‌هایی بی‌صدا حذف می‌شوند؛ نه خطایی برمی‌گردد، نه لاگی ثبت می‌شود و نه در tcpdump روی خود ماشین Gateway چیزی دیده می‌شود.

این اجازه با دو تنظیم در پنل داده می‌شود: «آدرس‌های قابل فوروارد» و «گروه دسترسی امن». به همین دلیل گام‌های ۱ و ۲ این راهنما در پنل انجام می‌شوند و تا وقتی آن‌ها را تنظیم نکرده باشید، هیچ‌کدام از دستورهای داخل ماشین اثری نخواهند داشت.

۱. افزودن آدرس‌های قابل فوروارد

این نخستین و مهم‌ترین گام است و در پنل انجام می‌شود.

هر اینترفیس در شبکه‌ی ستون به‌صورت پیش‌فرض فقط مجاز است ترافیک مربوط به «IP داخلی» خودش را دریافت و ارسال کند. این محافظت پیش‌فرض است و خاموش نمی‌شود؛ هدفش این است که یک ماشین نتواند خود را جای ماشین دیگری جا بزند.

اما کار ماشین Gateway دقیقاً همین است: باید ترافیکی را جابه‌جا کند که نه مقصدش خودش است و نه مبدأش. بنابراین باید به شبکه اعلام کنید که این اینترفیس مجاز است ترافیک کدام Rangeها را عبور دهد. این فهرست در پنل با نام «آدرس‌های قابل فوروارد» (Forwardable Addresses) ارائه می‌شود.

این گام هرگز اختیاری نیست

تا زمانی که Range موردنظر را در «آدرس‌های قابل فوروارد» اضافه نکرده باشید، ترافیک اصلاً به ماشین Gateway تحویل داده نمی‌شود. یعنی حتی اگر Route، عبور بسته و SNAT را هم درست تنظیم کرده باشید، در tcpdump روی ماشین Gateway هیچ بسته‌ای نخواهید دید. این موضوع هم برای Gateway اینترنت صادق است و هم برای تانل.

این تنظیم روی کدام ماشین انجام می‌شود؟

فقط روی اینترفیس ماشین Gateway (X). روی ماشین‌های A، B، C و … هیچ تنظیمی لازم نیست، چون آن‌ها فقط ترافیک خودشان را می‌فرستند و دریافت می‌کنند.

تنظیم از طریق پنل

مسیر زیر را در پنل دنبال کنید:

سرویس‌های ستون › ماشین مجازی نسخه ۲ › لیست ماشین‌های مجازی › ‹ماشین Gateway› › تب «شبکه»

در کارت «اینترفیس‌ها»، اینترفیس موردنظر (مثلاً eth0) را پیدا کنید. در همین کارت ردیفی با عنوان «آدرس‌های قابل فوروارد» وجود دارد؛ با دکمه‌ی + کنار آن، Range موردنظر را اضافه کنید.

چه Rangeای باید اضافه شود؟

قاعده‌ی کلی: Range مقصدهایی که ترافیک آن‌ها قرار است از این ماشین عبور کند.

سناریو‏Rangeای که باید اضافه شود
‏Gateway خروج به اینترنت0.0.0.0/0 — تمام Range اینترنت
تانل به یک سایت دیگر‏CIDR سابنت سایت مقابل — در نمونه 172.16.0.0/16
ماشینی که هر دو نقش را دارد0.0.0.0/0 کافی است، چون همه‌ی Rangeها را در بر می‌گیرد

چرا برای اینترنت باید 0.0.0.0/0 باشد؟

ماشین‌های پشت Gateway به هر مقصدی در اینترنت درخواست می‌فرستند و شما از پیش نمی‌دانید آن مقصدها چه آدرس‌هایی هستند. بنابراین Rangeای که باید مجاز شود، کل فضای آدرس است. اگر به‌جای آن فقط CIDR سابنت داخلی خودتان را اضافه کنید، ترافیک اینترنت همچنان به ماشین Gateway تحویل داده نمی‌شود.

دقت کنید که این تنظیم گسترده است و به آن اینترفیس اجازه می‌دهد ترافیک هر مقصدی را عبور دهد. آن را فقط روی همان ماشینی اعمال کنید که واقعاً قرار است نقش Gateway را ایفا کند.

۲. بررسی گروه دسترسی امن

دومین چیزی که در سطح شبکه اعمال می‌شود و می‌تواند ترافیک شما را بی‌صدا حذف کند، «گروه دسترسی امن» (Security Group) است. هیچ ردی از آن داخل ماشین و در خروجی iptables دیده نمی‌شود.

گروه‌های دسترسی امن هر اینترفیس، در همان کارت «اینترفیس‌ها» در تب «شبکه» به‌صورت چند برچسب نمایش داده می‌شوند و با آیکون ویرایش کنارشان قابل تغییرند.

اگر این قابلیت را در پنل نمی‌بینید

«گروه دسترسی امن» ممکن است هنوز برای فضای کاری شما فعال نشده باشد. اگر در کارت «اینترفیس‌ها» چنین بخشی نمی‌بینید یا امکان ویرایش آن را ندارید، برای فعال‌سازی با تیم پشتیبانی ستون تماس بگیرید.

برای اینکه ماشین Gateway بتواند کار کند، گروه‌های دسترسی امن روی اینترفیس X باید هر دو جهت زیر را مجاز کنند:

  • ترافیک ورودی از سمت ماشین‌های A، B، C و … یعنی از داخل سابنت 192.168.50.0/24
  • ترافیک خروجی به سمت مقصدهایی که می‌خواهید ماشین‌های شما به آن‌ها دسترسی داشته باشند

تفاوت این مورد با آدرس‌های قابل فوروارد

هر دو در سطح شبکه اعمال می‌شوند و هر دو بی‌صدا حذف می‌کنند، ولی معیارشان فرق دارد. «آدرس‌های قابل فوروارد» مشخص می‌کند این اینترفیس ترافیک کدام Rangeها را مجاز است عبور دهد، در حالی که «گروه دسترسی امن» بر اساس مقصد، پورت و جهت تصمیم می‌گیرد. هر دو باید اجازه بدهند.

۳. فعال کردن عبور بسته روی ماشین Gateway

از اینجا به بعد، تنظیمات داخل خود ماشین انجام می‌شود.

به‌صورت پیش‌فرض، Linux Kernel بسته‌هایی را که مقصدشان خودِ ماشین نیست دور می‌ریزد. برای اینکه X بتواند نقش Gateway را بازی کند باید این رفتار را تغییر دهید:

sysctl -w net.ipv4.ip_forward=1

بررسی کنید: خروجی دستور زیر باید 1 باشد.

cat /proc/sys/net/ipv4/ip_forward

اگر مقدار 0 است، بسته‌های ماشین‌های دیگر به X می‌رسند ولی هرگز از آن خارج نمی‌شوند.

۴. تنظیم SNAT برای خروج به اینترنت

اگر هدف شما فقط هدایت ترافیک به یک تانل است، از این گام رد شوید و به گام بعد بروید. این گام مخصوص حالتی است که می‌خواهید ماشین X ترافیک بقیه را به اینترنت بفرستد.

وقتی روی یک ماشین «دسترسی به اینترنت» را فعال می‌کنید، یک نگاشت یک‌به‌یک (One-to-One NAT) بین IP داخلی آن ماشین و IP خارجی آن ساخته می‌شود. در توپولوژی نمونه، این نگاشت فقط بین 192.168.50.224 و 185.248.32.39 وجود دارد و بس.

نتیجه‌ی مستقیم این موضوع: بسته‌ای که با Source IP برابر 192.168.50.11 از X خارج شود هیچ نگاشتی ندارد، پس هرگز به اینترنت نمی‌رسد. بنابراین ماشین Gateway باید پیش از ارسال، Source IP ترافیک عبوری را به IP داخلی خودش تغییر دهد. به این کار SNAT گفته می‌شود:

iptables -t nat -A POSTROUTING -s 192.168.50.0/24 -o eth0 -j SNAT --to-source 192.168.50.224

رایج‌ترین اشتباه

مقدار --to-source باید IP داخلی ماشین Gateway باشد، نه IP خارجی آن. ماشین هرگز IP خارجی خود را نمی‌بیند؛ اگر روی X دستور ip addr را بزنید فقط 192.168.50.224 را می‌بینید، در حالی که پنل 185.248.32.39 را نشان می‌دهد. NAT بین IP داخلی و IP خارجی را خودِ شبکه انجام می‌دهد. اگر --to-source را برابر IP خارجی بگذارید، بسته‌ها حذف می‌شوند.

‏SNAT جایگزین آدرس‌های قابل فوروارد نیست

این دو مکمل یکدیگرند، نه جایگزین هم. «آدرس‌های قابل فوروارد» تعیین می‌کند که ترافیک اصلاً به ماشین X برسد، و SNAT تعیین می‌کند که پس از رسیدن، بتواند از آن خارج شود و به اینترنت راه پیدا کند. برای Gateway اینترنت به هر دو نیاز دارید.

۵. افزودن Route روی ماشین‌های پشت Gateway

روی هر یک از ماشین‌های A، B، C و … باید مشخص کنید که مسیر خروج از طریق X است.

توجه

اگر ماشین A هم‌اکنون IP خارجی دارد و شما از طریق آن به ماشین SSH زده‌اید، تغییر Route پیش‌فرض نشست فعلی شما را قطع می‌کند. پیش از اجرای دستور زیر، برای IP دستگاه خودتان یک Route اختصاصی از مسیر قبلی اضافه کنید یا از طریق کنسول (VNC) وارد شوید.

برای عبور دادن تمام ترافیک از Gateway:

ip route replace default via 192.168.50.224

برای عبور دادن بخشی از ترافیک — مثلاً فقط یک مقصد یا یک شبکه‌ی مشخص:

ip route add 10.20.0.0/16 via 192.168.50.224

بررسی کنید: روی ماشین A مسیری که Linux Kernel انتخاب می‌کند را ببینید.

ip route get 8.8.8.8

خروجی باید شامل via 192.168.50.224 باشد. اگر نبود، Route اعمال نشده است.

حالا مسیر واقعی بسته را دنبال کنید. روی ماشین X این دستور را اجرا کنید و همان لحظه روی ماشین A دستور ping 8.8.8.8 را بزنید:

tcpdump -ni eth0 icmp and host 8.8.8.8

سه حالت ممکن است ببینید:

  • هیچ بسته‌ای دیده نمی‌شود: بسته به X نرسیده است. یا Range 0.0.0.0/0 را در «آدرس‌های قابل فوروارد» اضافه نکرده‌اید (گام ۱)، یا گروه دسترسی امن ورودی را نمی‌پذیرد (گام ۲)، یا Route روی A اشتباه است.
  • فقط بسته‌هایی با مبدأ 192.168.50.11 دیده می‌شود: بسته به X رسیده ولی با همان Source IP ماشین A در حال خروج است، یعنی SNAT اعمال نشده. به گام ۴ برگردید.
  • بسته‌هایی با مبدأ 192.168.50.11 و بسته‌هایی با مبدأ 192.168.50.224 دیده می‌شود: همه‌چیز درست کار می‌کند.

اگر Source IP بازنویسی نشده، شمارنده‌ی قاعده را ببینید:

iptables -t nat -L POSTROUTING -nvx

اگر ستون‌های pkts و bytes برای قاعده‌ی شما صفر مانده‌اند، یعنی قاعده اصلاً match نشده است. دو علت رایج: نام اینترفیس در -o اشتباه است (با ip link بررسی کنید)، یا CIDR در -s شامل IP ماشین A نمی‌شود.

تأیید نهایی

روی ماشین A و سپس روی ماشین X این دستور را اجرا کنید:

curl ifconfig.io

اگر همه‌چیز درست تنظیم شده باشد، هر دو باید یک مقدار یکسان برگردانند: همان IP خارجی ماشین Gateway، یعنی 185.248.32.39 در توپولوژی نمونه.

اگر ماشین A پاسخی نگرفت، جدول زیر کمک می‌کند سریع به علت برسید:

نشانهکجا را ببینیدعلت محتمل
بسته اصلاً به X نمی‌رسدپنل، «آدرس‌های قابل فوروارد»‏Range 0.0.0.0/0 اضافه نشده است
بسته اصلاً به X نمی‌رسدپنل، گروه دسترسی امنترافیک ورودی از سابنت مجاز نشده است
بسته اصلاً به X نمی‌رسدip route get روی A‏Route روی A اشتباه است
بسته به X می‌رسد ولی خارج نمی‌شودcat /proc/sys/net/ipv4/ip_forwardعبور بسته فعال نیست
بسته با مبدأ IP ماشین A خارج می‌شودiptables -t nat -L POSTROUTING -nvxقاعده‌ی SNAT وجود ندارد یا match نمی‌شود

ماندگاری تنظیمات

توجه

دستورهای ip route، sysctl -w و iptables که در این راهنما آمده‌اند همگی موقتی هستند و پس از راه‌اندازی مجدد ماشین از بین می‌روند. پس از اینکه از درستی پیکربندی مطمئن شدید، آن‌ها را به‌شکل ماندگار در سیستم‌عامل خود ثبت کنید.

در مقابل، «آدرس‌های قابل فوروارد» و «گروه دسترسی امن» تنظیمات سمت پنل هستند و با راه‌اندازی مجدد ماشین از بین نمی‌روند.

مطالب مرتبط

اگر می‌خواهید از همین ماشین Gateway برای دسترسی به یک سایت دیگر از طریق تانل استفاده کنید، به تانل GRE به سایت دیگر مراجعه کنید.