چند وقت پیش داشتم دنبال یه راه میگشتم که بتونم بدون باز کردن پورت روی سرور خونگیم، از بیرون بهش وصل بشم. سرور خونگی پشت یه CGNAT بود و باز کردن پورت روش اصلاً شدنی نبود. همون موقع بود که با GSocket آشنا شدم.
📩 با عضویت در خبرنامه، جدیدترین مطالب و آموزشها را مستقیم در ایمیل خود دریافت کنید.
GSocket یه ابزار شبکهست برای اتصال دو تا ماشین از طریق اینترنت، حتی وقتی هر دو (یا حتی هر دوشون همزمان) پشت NAT یا فایروال باشن. ایدهش خیلی سادهست.
بهجای اینکه پورت باز کنی، هر دو طرف به یه سرور relay وصل میشن و اون سرور دو طرف رو به هم وصل میکنه.
یعنی نه تو سمت سرور باید پورت باز کنی، نه سمت لپتاپت. هر دوتون فقط یه اتصال خروجی (outbound) به سرورهای GSocket برقرار میکنید و بعدش خودشون یه راه پیدا میکنن که مستقیم (P2P) به هم وصل بشن. اگه دو ماشین رو یه شبکه محلی باشن، حتی از همون مسیر LAN رد میشه و نیازی به اینترنت خارجی نیست 😅.
کاربردهای رایج
- دسترسی به سرور یا سرور خونگی بدون باز کردن پورت
- ساختن یه reverse shell پایدار از پشت فایروال
- انتقال فایل بین دو سیستم
- دور زدن CGNAT (همون مشکلی که خودم باهاش درگیر بودم)
جریان کار کلی
یه طرف (مثلاً سرورت) توی حالت listen قرار میگیره:
bash
gsocket -l
طرف دوم (مثلاً لپتاپت) با یه پسورد/توکن مشترک بهش وصل میشه:
bash
gsocket
هر دو طرف باید یه secret یکسان داشته باشن، همون چیزی که GSocket ازش برای پیدا کردن جفتشون توی شبکه relay استفاده میکنه. ارتباطی که برقرار میشه هم end-to-end رمزنگاری شدهست، یعنی سرور relay فقط داده رو رد میکنه و نمیتونه محتواش رو بخونه.
یه مثال ساده با gs-netcat
خود ابزار gsocket بیشتر شبیه یه لایه انتقالی عمل میکنه، ولی چیزی که معمولاً واقعاً باهاش کار میکنید gs-netcat هست، یه نسخه از netcat که روی همین شبکه GSocket کار میکنه.
طرف A (مثلاً سرور، حالت listen):
bash
gs-netcat -s MySecret -l
طرف B (از هر جای دنیا، حالت اتصال):
bash
gs-netcat -s MySecret
فلگ -s همون secret مشترکه که هر دو طرف باید یکی باشه، و -l یعنی این طرف منتظر اتصال میمونه. همینقدر ساده. اگه پسورد ضعیف بذارید کسی دیگه ممکنه شانسی همون رو حدس بزنه و وصل بشه، برای همین بهتره یه رشته تصادفی و بلند استفاده کنید (خود ابزار هم با gs-netcat -g میتونه براتون بسازه).
اگه بخواید یه shell تعاملی واقعی بگیرید (نه فقط یه لوله داده)، کافیه فلگ -i رو هم اضافه کنید:
bash
gs-netcat -s MySecret -l -i
این دقیقاً همون سناریوی reverse shell پایداره؛ سروری که پشت فایروال نشسته منتظر میمونه، و شما از هر جایی که باشید بهش وصل میشید بدون اینکه لازم باشه IP اون سرور رو حتی بدونید.
دسترسی به یه سرویس روی پورت خاص
فرض کنید یه سرور PHP یا Node روی پورت داخلی سرورتون بالاست و میخواید بدون باز کردن پورت از بیرون بهش وصل بشید. اینجا از حالت port-forward استفاده میکنید:
bash
# روی سرور
gs-netcat -s MySecret -l -d 127.0.0.1 -p 3000
Code language: CSS (css)
bash
# روی لپتاپ
gs-netcat -s MySecret -p 3000
Code language: PHP (php)
الان میتونید روی لپتاپتون به 127.0.0.1:3000 وصل بشید، انگار سرویس داخل سرور دقیقاً همینجا رو سیستم خودتونه.
میخواید دقیقتر برای یه کاربرد خاص توضیح بدم؟ مثلاً دسترسی به سرور PHP/Node از لپتاپ، یا ساختن یه reverse shell همیشهروشن روی VPS؟ بگید سناریوتون چیه.

