GSocket چیست؟ دور زدن NAT و فایروال بدون باز کردن پورت

این مثال‌ها برای اتصال به سیستم‌هایی است که مالک آن‌ها هستید یا اجازهٔ مدیریتشان را دارید. راز مشترک را با gs-netcat -g تولید و به‌صورت امن در فایل secret.txt هر دو دستگاه ذخیره کنید؛ آن را داخل فرمان یا مخزن عمومی ننویسید.

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

خبرنامه

چند وقت پیش داشتم دنبال یه راه می‌گشتم که بتونم بدون باز کردن پورت روی سرور خونگیم، از بیرون بهش وصل بشم. سرور خونگی پشت یه CGNAT بود و باز کردن پورت روش اصلاً شدنی نبود. همون موقع بود که با GSocket آشنا شدم.

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

به‌جای اینکه پورت باز کنی، هر دو طرف به یه سرور relay وصل می‌شن و اون سرور دو طرف رو به هم وصل می‌کنه.

هر دو طرف اتصال خروجی به شبکهٔ Global Socket برقرار می‌کنند. در این روش، بازکردن پورت ورودی روی NAT لازم نیست؛ بااین‌حال دسترسی خروجی شبکه به سرویس relay باید ممکن باشد. اتصال مستقیم P2P یا بی‌نیازی از اینترنت را نباید برای این مثال فرض کرد.

کاربردهای رایج

  • دسترسی به سرور یا سرور خونگی بدون باز کردن پورت
  • ساختن یه reverse shell پایدار از پشت فایروال
  • انتقال فایل بین دو سیستم
  • دور زدن CGNAT (همون مشکلی که خودم باهاش درگیر بودم)

جریان کار کلی

یه طرف (مثلاً سرورت) توی حالت listen قرار می‌گیره:

gs-netcat -k secret.txt -l

طرف دوم (مثلاً لپ‌تاپت) با یه پسورد/توکن مشترک بهش وصل می‌شه:

gs-netcat -k secret.txt

هر دو طرف باید یه secret یکسان داشته باشن، همون چیزی که GSocket ازش برای پیدا کردن جفت‌شون توی شبکه relay استفاده می‌کنه. ارتباطی که برقرار می‌شه هم end-to-end رمزنگاری شده‌ست، یعنی سرور relay فقط داده رو رد می‌کنه و نمی‌تونه محتواش رو بخونه.

یه مثال ساده با gs-netcat

خود ابزار gsocket بیشتر شبیه یه لایه انتقالی عمل می‌کنه، ولی چیزی که معمولاً واقعاً باهاش کار می‌کنید gs-netcat هست، یه نسخه از netcat که روی همین شبکه GSocket کار می‌کنه.

طرف A (مثلاً سرور، حالت listen):

gs-netcat -k secret.txt -l

طرف B (از هر جای دنیا، حالت اتصال):

gs-netcat -k secret.txt

فلگ -k راز مشترک را از فایل می‌خواند؛ فایل هر دو طرف باید محتوای یکسان داشته باشد. -l یعنی این طرف منتظر اتصال می‌ماند. همین‌قدر ساده. اگه پسورد ضعیف بذارید کسی دیگه ممکنه شانسی همون رو حدس بزنه و وصل بشه، برای همین بهتره یه رشته تصادفی و بلند استفاده کنید (خود ابزار هم با gs-netcat -g می‌تونه براتون بسازه).

اگه بخواید یه shell تعاملی واقعی بگیرید (نه فقط یه لوله داده)، کافیه فلگ -i رو هم اضافه کنید:

gs-netcat -k secret.txt -l -i

این دقیقاً همون سناریوی reverse shell پایداره؛ سروری که پشت فایروال نشسته منتظر می‌مونه، و شما از هر جایی که باشید بهش وصل می‌شید بدون اینکه لازم باشه IP اون سرور رو حتی بدونید.

دسترسی به یه سرویس روی پورت خاص

فرض کنید یه سرور PHP یا Node روی پورت داخلی سرورتون بالاست و می‌خواید بدون باز کردن پورت از بیرون بهش وصل بشید. اینجا از حالت port-forward استفاده می‌کنید:

# روی سرور
gs-netcat -k secret.txt -l -d 127.0.0.1 -p 3000
# روی لپ‌تاپ
gs-netcat -k secret.txt -p 3000

الان می‌تونید روی لپ‌تاپتون به 127.0.0.1:3000 وصل بشید، انگار سرویس داخل سرور دقیقاً همین‌جا رو سیستم خودتونه.

مرجع: مستندات رسمی؛ نسخهٔ مستندات را با نسخهٔ پروژهٔ خود تطبیق دهید.

بروزرسانی‌های خبرنامه

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

پاسخی بگذارید

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