برنامه نویسی

نحوه پیاده سازی شبکه مش روی AWS

مدتی پیش بود که در یک پروژه پیچیده گرینفیلد کار می کردم.

ما مجبور بودیم یک زیرساخت امن (از بسیاری جهات) طراحی کنیم، مطمئن شویم که تمام ترافیک در Rest و Transit رمزگذاری شده است و تعداد زیادی از خدمات را در AWS مستقر می‌کنیم. در حالی که تیم‌های توسعه‌دهنده روی ساخت برنامه‌ها کار می‌کردند، من روی آن الزامات تمرکز می‌کردم.

نیاز اصلی، طراحی و پیاده سازی یک شبکه مش مسطح بر روی AWS (با ترافیک رمزگذاری شده) بود. همه سرورهای مستقر شده، باید یک اتصال نقطه به نقطه به هر همتای دیگر در شبکه داشته باشند. علاوه بر این، برخی از سرورهای میزبانی شده در Azure و GCP باید بتوانند به Mesh بپیوندند. و برای افزودن پیچیدگی بیشتر، کلاینت‌های خارجی مانند لپ‌تاپ یا تلفن‌های همراه باید بتوانند به سرورها/خدمات خاص در Mesh دسترسی ایمن داشته باشند.

پس از جمع آوری تمام اطلاعات و صحبت با تعدادی از افراد برای اطمینان از اینکه همه الزامات به درستی مستند شده اند و به عقب ماندگی اضافه شده اند، زمان شروع کار برای PoC (Proof of Concept) فرا رسیده است.

یکی از ابزارهایی که به نظر کاندیدای مناسبی بود، Wireguard بود.

Wireguard چیست؟

WireGuard یک تونل شبکه ایمن است که در لایه 3 کار می کند و به عنوان یک رابط شبکه مجازی هسته برای لینوکس پیاده سازی شده است. از رمزنگاری پیشرفته‌تر استفاده می‌کند و هدف آن این است که سریع‌تر، ساده‌تر، ناب‌تر و مفیدتر از IPsec باشد. Wireguard در حال حاضر در حال توسعه شدید است، اما در حال حاضر ممکن است به عنوان امن ترین، ساده ترین و ساده ترین راه حل VPN در صنعت در نظر گرفته شود. به همین دلیل است که بسیاری از ارائه دهندگان خدمات VPN شروع به استفاده از آن کرده اند.
منبع: wireguard.com

پس از مطالعه مستندات و انجام برخی آزمایشات، تصمیم گرفتم به آن ادامه دهم. فرآیند راه اندازی Wireguard به عنوان VPN مستقیم است. شما باید آن را نصب کنید، کلیدهای مورد نیاز را تولید کنید، a ایجاد کنید wg0.conf فایل برای هر سرور، گروه های امنیتی مربوطه را در AWS پیکربندی کنید و VPN شما به سرعت راه اندازی و اجرا می شود.

اما در مورد ما، ما مجبور بودیم یک Mesh متشکل از 100 سرور بسازیم که بیشتر آنها بخشی از گروه های AutoScaling هستند. در نتیجه، ما گزینه ای برای پیکربندی نداشتیم wg0.conf به صورت دستی، هر بار که یک سرور مجبور بود به مش بپیوندد.

Wireguard چگونه کار می کند

WireGuard با رمزگذاری اتصال با استفاده از یک جفت کلید رمزنگاری کار می کند، هر سرور باید کلیدهای خصوصی و عمومی خود را داشته باشد و سپس کلیدهای عمومی را با بقیه مبادله کند.

را wg0.conf فایل حاوی تمام پارامترهای پیکربندی لازم برای رابط WireGuard است

در اینجا برخی از پارامترهای اصلی که می توان در آنها پیکربندی کرد آورده شده است wg0.conf:

PrivateKey: این پارامتر کلید خصوصی را برای رابط WireGuard تعریف می کند. برای احراز هویت و رمزگذاری ترافیک بین همتایان استفاده می شود.
ListenPort: این پارامتر پورتی را که WireGuard برای اتصالات ورودی به آن گوش خواهد داد (پیش‌فرض UDP 51820) تعریف می‌کند.
نشانی: این پارامتر آدرس IP و ماسک زیر شبکه را برای رابط WireGuard تعریف می کند.
همتا: این پارامتر پیکربندی یک همتا را در شبکه WireGuard تعریف می کند. این شامل کلید عمومی همتا، آدرس IP آن، IP های مجاز (محدوده IP که همتا می تواند به آن دسترسی داشته باشد) و گزینه های دیگری مانند تنظیمات نقطه پایانی را شامل می شود.

توضیحات تصویر

نمای کلی راه حل مش

من کار بر روی Spike خود را شروع کردم و پیدا کردن بهترین راه برای پیاده سازی چنین توپولوژی Mesh یک چالش بود. در ابتدا تعدادی نمونه EC2 را با استفاده از Terraform در چندین منطقه AWS مستقر کردم. پس از آن، فهرست خود را مرور کردم و شروع به ساختن و امتحان کردن چیزها کردم:

  • Terraform و Ansible: با موفقیت یک Mesh ایجاد شد، اما مدیریت همتایان جدید و به‌روزرسانی خودکار wg0.conf هنگام پیوستن آنها واقعاً دشوار بود. به این نتیجه رسیدم که برای تنظیمات استاتیک خوب است اما برای پویا نه.
  • Terraform، Hashicorp Vault و هزاران اسکریپت bash: امیدوار کننده به نظر می رسید، بیایید ببینیم چگونه کار می کند. هنگام اتصال گره ها از طریق wireguard، هر گره باید کلید عمومی و ip نقطه پایانی همه همتایان را بداند. در این سناریو، گره هایی با احراز هویت مناسب در Vault اجازه داشتند داده های خود را منتشر کنند و همچنین داده های اتصال را از سایر همتایان بخوانند. همه آنها می توانند داده های نقطه ملاقات را برای مش ما بخوانند (ساختار داده حاوی اطلاعات اساسی در مورد شبکه مش ما)، پیکربندی خود را در vault منتشر کنند، طاقچه پرس و جو را برای سایر گره های شناخته شده در نقطه ملاقات بخوانند و برای هر یک از آنها یک همتای محافظ سیم اضافه کنند. اگرچه کار می کرد، اما پشتیبانی از آن و عیب یابی، به خصوص پس از تحویل، واقعاً پیچیده بود.

سپس با ابزاری به نام Netmaker برخوردم. در مراحل اولیه توسعه بود، اما واقعا امیدوار کننده به نظر می رسید (از آن زمان، من تمام نسخه ها، از جمله نسخه فعلی 0.18.5 را که چند روز پیش منتشر شد، با پیشرفت ها و اصلاحات بزرگ آزمایش کردم).

نت میکر چیست؟

Netmaker بستری برای ایجاد شبکه های مجازی سریع و امن با WireGuard است. این ابزاری برای ایجاد و مدیریت شبکه های پوشش مجازی است. اگر حداقل دو ماشین با دسترسی به اینترنت دارید که باید آنها را با یک تونل امن یا هزاران سرور پراکنده در چندین مکان یا ارائه دهندگان ابری متصل کنید، Netmaker “ابزار” عالی است. این دستگاه ها را در هر کجا که هستند به طور ایمن به هم متصل می کند.
منبع: Netmaker.org

اکنون، پس از این مقدمه، بیایید ببینیم که چگونه می توانیم با استفاده از Netmaker و Wireguard یک شبکه مش ایمن در AWS ایجاد کنیم.

نحوه نصب Netmaker

  1. با راه اندازی یک VM با اوبونتو 20.04 یا آخرین نسخه با یک IP عمومی شروع کنید. (اوبونتو موردی است که در حال حاضر پشتیبانی می شود)
  2. پورت های 443، 80 و 51821-51830 (UDP) را روی گروه امنیتی باز کنید. می توانید این محدوده را کوچکتر کنید، اما به خاطر داشته باشید که برای هر شبکه ای که ایجاد می کنید باید یک پورت داشته باشید. (بعداً در مورد شبکه ها بیشتر توضیح خواهم داد)
  3. اسکریپت زیر را اجرا کنید:
sudo wget -qO /root/nm-quick-interactive.sh https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/nm-quick-interactive.sh && sudo chmod +x /root/nm-quick-interactive.sh && sudo /root/nm-quick-interactive.sh
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

شما باید به تعدادی سوال ساده پاسخ دهید و در انتها URL ورود به سیستم را نشان می دهید.

پس از تایپ URL، از شما خواسته می شود که یک نام کاربری و رمز عبور ایجاد کنید و زمانی که وارد می شوید این همان چیزی است که قرار است مشاهده کنید.

توضیحات تصویر

یک شبکه ایجاد کنید

اولین کاری که بعد از آن باید انجام دهیم این است که یک شبکه ایجاد کنیم و محدوده های IP را وارد کنیم که سرورهای ما برای برقراری ارتباط متقابل امن استفاده می کنند. (رابط Wireguard wg0، قرار است از یک آدرس IP برای آن محدوده استفاده کند)

روی کاشی «شبکه‌ها» در داشبورد یا در پانل ناوبری سمت چپ روی «شبکه‌ها» کلیک کنید.

در صفحه شبکه ها، روی دکمه “ایجاد شبکه” کلیک کنید.

یک نام شبکه به شما داده و سپس CIDR مورد نظر خود را وارد کنید. یا بر روی دکمه “Autofill” کلیک کنید و سپس نام و CIDR تولید شده توسط گزینه تکمیل خودکار را تغییر دهید.

توضیحات تصویر

توضیحات تصویر

کلیدها را ایجاد کنید

سپس با ایجاد کلیدهای مورد نیاز اقدام کنید. پس از اتمام، می‌توانیم ببینیم که راه‌های متعددی برای اضافه کردن یک همتا به شبکه مش ما وجود دارد

توضیحات تصویر

گره ها را ایجاد و پیکربندی کنید

بیشتر کار سخت انجام شده است. و اکنون زمان راه اندازی چند نمونه در AWS در چندین منطقه و پخش آنها در زیر شبکه های عمومی و خصوصی فرا رسیده است. در مورد ما تقریباً همه نمونه‌ها در زیرشبکه‌های خصوصی هستند، به استثنای سرور Netmaker و نمونه Azure.

من دوست دارم از Terraform با Gitlab Runners برای استقرار آزمایشی خود استفاده کنم و برای این نسخه ی نمایشی حدود 10 نمونه EC2 بسیار سریع راه اندازی شده و اجرا می شود (از نمونه های نقطه ای برای به حداقل رساندن هزینه ها استفاده می کردم). فقط به یاد داشته باشید که باید یک نمونه EC2 مستقل (بر اساس تقاضا) برای Netmaker مستقر کنید.

تمام گروه‌های امنیتی، برای گره‌ها، به گونه‌ای پیکربندی شده‌اند که به ترافیک ورودی (UDP) به پورت‌های 51820-51830 اجازه دهند.

توضیحات تصویر

و با کمک User Data و دستور زیر می‌توانیم گره‌ها را برای پیوستن به Mesh در طول فرآیند راه‌اندازی پیکربندی کنیم.
(باید eyJzZXJxxxyxxxxxxxxxxxxxxxxxcccccccccccvvvvvvv0000000== با توکن خود جایگزین کنید)

#!/bin/bash

sudo curl -Lo /etc/yum.repos.d/wireguard.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
sudo yum install epel-release
sudo amazon-linux-extras install -y epel && yum install -y wireguard-dkms wireguard-tools
curl -sL 'https://rpm.netmaker.org/gpg.key' | sudo tee /tmp/gpg.key
curl -sL 'https://rpm.netmaker.org/netclient-repo' | sudo tee /etc/yum.repos.d/netclient.repo
sudo rpm --import /tmp/gpg.key
sudo yum check-update
sudo yum install -y netclient
netclient register -t eyJzZXJxxxyxxxxxxxxxxxxxxxxcccccccccccvvvvvvv0000000==
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پس از چند دقیقه، نمونه های خود را آماده و اجرا می کنیم، به طور کامل با Wireguard و Netclient پیکربندی شده اند (همه آنها به طور خودکار به شبکه Mesh ما ملحق شده اند).

توضیحات تصویر

حالا بیایید یک سرور دیگر راه اندازی کنیم اما این بار در… Azure

توضیحات تصویر

وقت آن است که رابط کاربری گرافیکی Netmaker خود را بررسی کنیم و مطمئن شویم که همه گره ها به هم متصل شده اند. اگر فوراً نشان داده نشدند، جای نگرانی نیست. ممکن است حداکثر 5 دقیقه طول بکشد تا نمایش داده شود. در مورد ما اکنون همه گره ها با وضعیت سالم قابل مشاهده هستند.

توضیحات تصویر

در این مرحله ما با موفقیت یک شبکه Mesh مسطح را نه تنها بین نمونه‌های AWS بلکه با یک سرور در یک ارائه‌دهنده ابری متفاوت اجرا و پیکربندی کرده‌ایم. تمام ترافیک بین آنها در حمل و نقل با استفاده از Wireguard رمزگذاری می شود.

نمودار مش / تجسم

بیایید ببینیم شبکه مش ما در این مرحله چگونه به نظر می رسد

توضیحات تصویرمش سیم محافظ

توضیحات تصویرسرور Netmaker به عنوان گره ورودی استفاده می شود

شبکه مش ما را تست کنید

در مورد اجرای برخی از تست‌ها برای تأیید اینکه همه چیز طبق انتظار کار می‌کند چطور؟

توضیحات تصویر

توضیحات تصویر

لیست های کنترل دسترسی

به طور پیش فرض، Netmaker یک “مش کامل” ایجاد می کند، به این معنی که هر گره در شبکه ما می تواند با هر گره دیگری صحبت کند. اما یک ویژگی خوب وجود دارد که می توانید از آن برای فعال/غیرفعال کردن هر گونه اتصال همتا به همتا در شبکه استفاده کنید.

با کلیک بر روی “ACLs” در نوار کناری یا با کلیک کردن بر روی یک گره در لیست گره می توان به ویژگی ACL دسترسی پیدا کرد.

توضیحات تصویر

اضافه کردن مشتریان خارجی

مواردی وجود دارد که مشتریان خارجی نیاز به دسترسی به برخی خدمات در حال اجرا در گره ها دارند. این می تواند یک تلفن همراه، یک لپ تاپ/تبلت یا یک دستگاه اینترنت اشیا باشد.

ما می توانیم با ایجاد یک Ingress به آن برسیم. (و پس از اتصال به Ingress، می توانیم به تمام سرورهای شبکه دسترسی پیدا کنیم.)

توضیحات تصویر

مرحله بعدی ایجاد تنظیمات مشتری است. سپس مشتریان می توانند با اسکن یک کد QR یا با وارد کردن پیکربندی Wireguard به مش ما بپیوندند (لطفاً توجه داشته باشید که مشتری Wireguard باید در تلفن همراه، لپ تاپ و غیره نصب شده باشد)

توضیحات تصویر

در مورد ما، من پیکربندی را در لپ تاپ خود دانلود کرده ام و با استفاده از سرویس گیرنده Wireguard متصل شده ام.

توضیحات تصویر

برای این نسخه ی نمایشی، من Apache را در یک نمونه AWS EC2 و در یک ماشین مجازی Azure نصب کرده ام. همانطور که می بینید، من می توانم از طریق لپ تاپ خود، از طریق یک تونل امن، با استفاده از IP های 10.141.xx به هر دو دسترسی داشته باشم (شبکه مش CIDR)

توضیحات تصویرآپاچی در حال اجرا بر روی AWS EC2

توضیحات تصویرآپاچی روی نمونه Azure اجرا می شود

نتیجه

این فقط یک مورد استفاده از استفاده است نت میکر و وایرگارد برای ایجاد یک شبکه مش ایمن در AWS. همانطور که در زیر مشاهده می کنید موارد بیشتری وجود دارد و ما در پست های بعدی قصد داریم در مورد برخی از آنها صحبت کنیم.

  • ایجاد یک شبکه بزرگ مبتنی بر WireGuard (Mesh) را خودکار کنید
  • دسترسی ایمن به شبکه خانگی یا اداری
  • دسترسی از راه دور به منابعی مانند AWS VPC یا خوشه K8S ارائه دهید
  • خوشه هایی ایجاد کنید که محیط ها را در بر می گیرند
  • از یک منبع خارجی به یک خوشه از راه دور دسترسی داشته باشید
  • دسترسی از راه دور به یک منبع خارجی از یک خوشه
  • شبکه ایمن دستگاه های IoT را مدیریت کنید

امیدوارم این پست برای شما مفید بوده باشد. برای هر سوالی با من تماس بگیرید

لینک های مفید:
وایرگارد
نت میکر

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا