برو به محتوای اصلی
اسکریپت

Ngrok چیه و کارش چیه؟

yasin

Ngrok چیست؟

Ngrok یه پراکسی معکوس (Reverse Proxy) توزیع‌شده در سطح جهانی است که باعث می‌شه اپلیکیشن‌ها و سرویس‌های شبکه‌ای توی هر جایی که اجرا بشن، ایمن‌تر، محافظت‌شده‌تر و سریع‌تر باشن. می‌تونی Ngrok رو مثل یه دروازه‌ی اصلی برای اپلیکیشن‌هات در نظر بگیری.

Ngrok وابسته به محیط خاصی نیست، چون می‌تونه ترافیک رو بدون نیاز به تغییر در تنظیمات شبکه، به هر سرویسی که در هر جایی اجرا شده، هدایت کنه. مهم نیست که برنامه‌ات روی AWS، Azure، Heroku، یک کلاستر Kubernetes محلی، Raspberry Pi یا حتی لپ‌تاپت اجرا شده باشه، Ngrok به یه شکل کار می‌کنه و اتصالش رو برقرار می‌کنه.

Ngrok یه پلتفرم یکپارچه برای مدیریت ورودی‌ها (Unified Ingress Platform) است، چون تمام ابزارهای لازم برای انتقال ترافیک از سرویس‌های شما به اینترنت رو در خودش ترکیب می‌کنه. Ngrok همه‌چیز رو در قالب یه سرویس ارائه می‌ده، از جمله:

  • پراکسی معکوس (Reverse Proxy)
  • لود بالانسر (Load Balancer)
  • گیت‌وی API (API Gateway)
  • فایروال (Firewall)
  • شبکه تحویل محتوا (CDN)
  • محافظت در برابر حملات DDoS

Ngrok چه کاربردهایی دارد؟

۱. توسعه و تست (Development and Testing)

  • تست Webhook:
    با اجرای Ngrok روی سیستم خودت، یه لینک عمومی دریافت می‌کنی که می‌تونه وب‌هوک‌ها رو مستقیماً به اپلیکیشنی که در حال توسعه‌اش هستی، ارسال کنه.
    علاوه بر این، می‌تونی درخواست‌ها رو بررسی کنی و دوباره ارسالشون کنی تا روند توسعه سریع‌تر بشه.
  • پیش‌نمایش محلی (Local Previews):
    اگه بخوای یه وب‌سایتی که روی کامپیوترت اجرا شده رو به مشتری یا همکارات نشون بدی، نیازی نیست اون رو روی یه سرور استیجینگ قرار بدی.
    کافیه Ngrok رو اجرا کنی و یه لینک عمومی موقت بگیری که از هرجایی قابل دسترسی باشه.
  • تست بک‌اند موبایل:
    اگه یه اپلیکیشن موبایل در حال توسعه داری و سرورش رو روی لوکال‌ات اجرا کردی، با Ngrok می‌تونی اپلیکیشن موبایلت رو به بک‌اند لوکال وصل کنی و بدون نیاز به دیپلوی، تستش کنی.

اتصال به شبکه‌های خارجی (Ingress to External Networks)

  • اتصال به APIهای موجود در شبکه‌های مشتریان:
    می‌تونی عامل سبک وزن Ngrok یا کنترلر Kubernetes رو توی محیط مشتری اجرا کنی تا بدون نیاز به پیکربندی پیچیده‌ی شبکه، به APIهای داخل شبکه‌ی اون‌ها وصل بشی.
  • اتصال به APIهای روی دستگاه‌ها:
    اگه دستگاه‌هایی داری که یه API داخلی دارن، می‌تونی Ngrok رو به‌عنوان یه سرویس روی اون‌ها اجرا کنی و یه لینک امن براشون ایجاد کنی تا سرویس ابری‌ات بتونه اون‌ها رو مدیریت و کنترل کنه.
  • اتصال به APIهای محیط‌های توسعه‌ی لوکال:
    می‌تونی Ngrok رو به‌عنوان یه کتابخونه توی CLI خودت اضافه کنی تا تجربه‌ی توسعه‌ی لوکال رو برای برنامه‌نویس‌هایی که از ابزار تو استفاده می‌کنن، بهتر و راحت‌تر کنی.

اتصال به سرویس‌های پروداکشن (Production Ingress)

  • API Gateway:
    می‌تونی از ماژول‌های HTTP Ngrok استفاده کنی تا APIهای پروداکشنت رو ایمن، محافظت و بهینه‌سازی کنی و ترافیک ورودی رو مدیریت کنی.
  • ورودی به سرویس‌های Kubernetes:
    با اجرای Ngrok Kubernetes Operator می‌تونی برای سرویس‌های در حال اجرای Kubernetes در هر کلاستری یه ورودی ایجاد کنی.
  • پراکسی مبتنی بر احراز هویت (Identity-Aware Proxy):
    می‌تونی از ماژول‌های OAuth، SAML یا OpenID Connect Ngrok استفاده کنی تا احراز هویت اپلیکیشنت رو به یه ارائه‌دهنده‌ی هویت (Identity Provider) متصل کنی.
  • لود بالانسر (Load Balancer):
    از Ngrok Edges می‌تونی برای بالانس کردن ترافیک، بهبود مقیاس‌پذیری و مدیریت Failover استفاده کنی. همچنین، برای دیپلوی‌های Blue/Green و Canary هم کاربرد داره.

Ngrok چگونه کار می‌کند؟

Ngrok یه شبکه‌ی جهانی از سرورها داره که بهش می‌گن "Ngrok Edge". این سرورها درخواست‌های دریافتی از اینترنت رو پردازش می‌کنن و اون‌ها رو به سرویس‌های بالادستی (Upstream Services) توی سیستم شما ارسال می‌کنن.

URLهایی که Ngrok ترافیک رو روی اون‌ها دریافت می‌کنه، در واقع نقاط پایانی (Endpoints) شما هستن. شما می‌تونید ماژول‌های مختلفی رو برای Ngrok تنظیم کنید تا ترافیک ورودی رو احراز هویت، بهینه‌سازی و سریع‌تر کنه قبل از این که به سرویس‌های شما برسه.

برخلاف پراکسی‌های معکوس سنتی که ترافیک رو به IP آدرس‌های مشخصی ارسال می‌کنن، Ngrok این کار رو متفاوت انجام می‌ده:
✅ به جای ارسال مستقیم درخواست‌ها به IP، از یه نرم‌افزار کوچک به نام "Agent" استفاده می‌کنه که در کنار سرویس شما اجرا می‌شه.
✅ این Agent به سرویس جهانی Ngrok از طریق اتصال امن و پایدار TLS وصل می‌شه.
✅ وقتی یه درخواست روی Endpoints شما در Ngrok Edge دریافت شد، از طریق همین اتصال TLS به Agent فرستاده می‌شه و در نهایت به سرویس بالادستی (Upstream Service) شما تحویل داده می‌شه.

روش‌های اجرای Ngrok Agent

شما می‌تونید Agent نرم‌افزاری Ngrok رو در قالب‌های مختلف اجرا کنید:

1️⃣ به‌عنوان یک سرویس پس‌زمینه:

  • می‌تونید Agent رو به‌عنوان یه پردازش کوچک در سیستم‌عامل اجرا کنید که در پس‌زمینه فعال بمونه و همیشه به Ngrok متصل باشه.

2️⃣ به‌صورت CLI (تعامل از طریق خط فرمان):

  • می‌تونید Agent رو به‌صورت خط فرمان (CLI) به‌طور موقت اجرا کنید تا در هنگام توسعه و تست به Ngrok وصل بشید.

3️⃣ به‌عنوان یک SDK داخل اپلیکیشن:

  • می‌تونید Agent SDK رو مستقیماً توی اپلیکیشن خودتون جاسازی کنید که یه آبجکت مشابه سوکت (Socket-Like Object) برمی‌گردونه.

4️⃣ به‌عنوان کنترلر Kubernetes:

  • توی محیط Kubernetes می‌تونید Ngrok Kubernetes Operator رو اجرا کنید تا ورودی‌های (Ingress) لازم برای سرویس‌های شما رو مدیریت کنه.

Ngrok در مقابل پراکسی‌های معکوس سنتی

برخلاف پراکسی‌های معکوس سنتی که ترافیک رو به یه آدرس IP مشخص هدایت می‌کنن، Ngrok این کارو یه جور دیگه انجام می‌ده. اون اتصال‌ها رو از طریق یه نرم‌افزار سبک به اسم Agent که کنار سرویس شما اجرا می‌شه، به سرویس بالادستی‌تون ارسال می‌کنه.

این مدل منحصر‌به‌فرد چندتا مزیت مهم نسبت به روش‌های سنتی داره:

اول، این معماری باعث می‌شه بتونی سرویس‌هات رو هر جایی اجرا کنی، فرقی نمی‌کنه که روی یه ابر مثل AWS یا Azure، یه پلتفرم مثل Heroku، یه دیتاسنتر داخلی، یه Raspberry Pi توی خونه‌ات، یا حتی روی لپ‌تاپت باشه.

دوم، باعث می‌شه بدون نیاز به تنظیمات پیچیده شبکه، ورودی (Ingress) بسازی. دیگه لازم نیست با چیزایی مثل DNS، آدرس‌های IP، گواهینامه‌های SSL یا تنظیم پورت‌ها درگیر بشی. Ngrok خودش همه‌ی این کارها رو روی سرورهای Edge خودش انجام می‌ده و برات اوکی می‌کنه.

سوم، Ngrok می‌تونه از حملات جلوگیری کنه و احراز هویت رو اجباری کنه، بدون این که نگران این باشی که کسی با پیدا کردن آدرس IP بالادستی‌ات، مستقیم به سرورت وصل بشه و Ngrok رو دور بزنه.


شروع سریع

این راهنمای سریع بهت یاد می‌ده چطور با استفاده از Ngrok Agent اپلیکیشن لوکالت رو روی اینترنت قرار بدی و امنیتش رو حفظ کنی تا فقط خودت بهش دسترسی داشته باشی.

فرض بر اینه که اپلیکیشن خودت از قبل روی لوکال اجرا شده و آماده‌ی متصل شدن به Ngrok هست.

مرحله ۱: نصب Ngrok

برای ویندوز:

اگه از ویندوز استفاده می‌کنی، این دستور رو توی Command Prompt با دسترسی Administrator اجرا کن:

choco install ngrok

اگه این روش برات جواب نداد، می‌تونی فایل نصب Ngrok رو از صفحه‌ی دانلود Ngrok دریافت کنی.

همچنین، توی داشبورد Ngrok (بخش Setup & Installation) می‌تونی راهنمای نصب مخصوص سیستم‌عامل خودت رو ببینی.

Ngrok یه ابزار خط فرمان (CLI) سبکه که روی همه‌ی سیستم‌عامل‌های اصلی بدون وابستگی اضافه اجرا می‌شه. برای تست این که درست نصب شده، این دستور رو توی ترمینال اجرا کن:

ngrok help

اگه Ngrok به‌درستی نصب شده باشه، متن راهنمای دستوراتش رو نمایش می‌ده.

مرحله ۲: اتصال Ngrok به حساب کاربری

حالا باید Ngrok Agent رو به حساب کاربری Ngrok خودت متصل کنی.

1️⃣ اگه هنوز حساب کاربری نداری، اول توی سایت Ngrok ثبت‌نام کن.
2️⃣ بعد از ورود به داشبورد Ngrok، "Authtoken" مخصوص حسابت رو کپی کن.
3️⃣ دستور زیر رو توی ترمینال اجرا کن و به‌جای <TOKEN>، همون "Authtoken" کپی‌شده رو بذار:

ngrok config add-authtoken <TOKEN>

4️⃣ اگه به داشبورد Ngrok بری (بخش Setup & Installation)، می‌تونی دستور تنظیمات مخصوص حسابت رو ببینی.

مرحله ۳: آنلاین کردن اپلیکیشن

برای اجرای Ngrok و آنلاین کردن اپلیکیشنت، این دستور رو توی ترمینال اجرا کن:

ngrok http http://localhost:8080

فرض بر اینه که اپلیکیشن وب‌ات روی http://localhost:8080 اجرا شده.
اگه روی پورت یا آدرس دیگه‌ای در حال اجراست، توی دستور بالا اون رو تغییر بده.

بعد از اجرای دستور، توی ترمینال یه چیزی شبیه به این می‌بینی:

ngrok                                                                   (Ctrl+C to quit)

Session Status                online
Account                       inconshreveable (Plan: Free)
Version                       3.0.0
Region                        United States (us)
Latency                       78ms
Web Interface                 http://127.0.0.1:4040
Forwarding                    https://84c5df474.ngrok-free.dev -> http://localhost:8080

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00

حالا لینک Forwarding که توی خروجی نمایش داده شده رو توی مرورگر باز کن تا اپلیکیشن لوکالت رو به‌صورت آنلاین ببینی.

این لینک برای هر کسی توی اینترنت قابل دسترسه. می‌تونی اون رو برای یه دوست بفرستی تا تستش کنه.

اپلیکیشنت از طریق HTTPS هم در دسترسه (توی مرورگر کنار آدرسش علامت قفل می‌بینی). گواهینامه‌ی SSL به‌صورت خودکار توسط Ngrok مدیریت می‌شه.

مرحله ۴: همیشه از یک دامنه‌ی ثابت استفاده کن

اگه می‌خوای هر بار که Ngrok رو اجرا می‌کنی، همون URL ثابت رو داشته باشی و تغییر نکنه، باید یه دامنه‌ی استاتیک (Static Domain) توی داشبورد Ngrok بسازی.

مراحل کار:
1️⃣ اول Ngrok رو متوقف کن (با زدن Ctrl + C توی ترمینال).
2️⃣ بعدش دوباره Ngrok رو اجرا کن و از فلگ --url برای تنظیم دامنه‌ی ثابتت استفاده کن:

ngrok http 8080 --url jumpy-red-mollusk.ngrok-free.app

حالا هر بار که Ngrok رو اجرا کنی، اپلیکیشن لوکالت روی همین دامنه‌ی ثابت در دسترس خواهد بود.

مرحله ۵: ایمن‌سازی اپلیکیشن

شاید نخوای که همه بتونن به اپلیکیشنت دسترسی داشته باشن.
Ngrok می‌تونه بدون نیاز به هیچ تغییری در کد، سریعاً یه سیستم احراز هویت به اپلیکیشنت اضافه کنه.

اگه مثلاً حساب گوگل تو alan@example.com باشه، می‌تونی دسترسی رو فقط برای خودت محدود کنی. کافیه Ngrok رو با این دستور اجرا کنی:

ngrok http http://localhost:8080 --oauth=google --oauth-allow-email=alan@example.com

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

نکته:
وقتی Ngrok رو دوباره اجرا می‌کنی، اگه --url رو مشخص نکنی، لینک اپلیکیشنت تغییر می‌کنه. پس حتماً بعد از هر بار راه‌اندازی مجدد، لینک جدید رو چک کن.

اگه حساب گوگل نداری یا دنبال یه روش ساده‌تر برای احراز هویت هستی، می‌تونی اپلیکیشنت رو با یه نام کاربری و رمز عبور محافظت کنی.

برای این کار، Ngrok رو با این دستور اجرا کن:

ngrok http http://localhost:8080 --basic-auth 'username:a-very-secure-password'

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

Ngrok از روش‌های مختلف احراز هویت پشتیبانی می‌کنه، از جمله:

  • OAuth (همونی که همین الان استفاده کردیم)
  • Basic Auth (همونی که همین الان استفاده کردیم)
  • محدود کردن دسترسی بر اساس IP
  • تأیید اعتبار Webhook
  • TLS دوطرفه (Mutual TLS)
  • OpenID Connect
  • SAML

اجرای Ngrok به‌صورت مداوم

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

  • استفاده از Docker: با Docker می‌تونی Ngrok رو داخل یه کانتینر اجرا کنی تا مدیریت و اجرای اون راحت‌تر بشه.
  • اجرای Ngrok به‌عنوان یک سرویس در Linux (Systemd): اگه سیستم‌عاملت از Systemd استفاده می‌کنه، می‌تونی یه سرویس Systemd ایجاد کنی که به‌صورت خودکار Ngrok رو اجرا و مدیریت کنه.
  • اجرای Ngrok به‌عنوان یک سرویس در ویندوز: توی ویندوز می‌تونی یه سرویس پس‌زمینه ایجاد کنی که Ngrok رو به‌طور خودکار اجرا و مدیریت کنه.
  • استفاده از Tmux برای جدا کردن سشن Ngrok از ترمینال (اختیاری): اگه با Tmux آشنا هستی، می‌تونی سشن Ngrok رو از ترمینال جدا کنی تا حتی بعد از بستن پنجره‌ی ترمینال همچنان اجرا بمونه. (این روش برای کاربران پیشرفته پیشنهاد می‌شه).