MCPcopy Index your code
hub / github.com/ParsaKSH/spoof-tunnel

github.com/ParsaKSH/spoof-tunnel @v3.0.2

Chat with this repo
repository ↗ · DeepWiki ↗ · release v3.0.2 ↗ · + Follow
341 symbols 758 edges 52 files 126 documented · 37%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Spoof Tunnel

English

اسپوف تانل یک تونل پروکسی در لایه‌های ۳ و ۴ شبکه (L3/L4) است که به صورت ویژه برای دور زدن فایروال‌های پردازش عمیق بسته‌ها (DPI) و سیستم‌های مانیتورینگ stateful از طریق تکنیک جعل آی‌پی دوطرفه (Mutual IP Spoofing) طراحی شده است.

پروتکل‌های تونل‌زنی سنتی، یک اتصال منطقی (Stateful) بین یک آی‌پی مشخص کلاینت و یک آی‌پی مشخص سرور برقرار می‌کنند. اسپوف تانل این وابستگی منطقی را با دستکاری فیلد Source IP درون هدر IP در هر دو سمت ارتباط کاملاً از بین می‌برد و شناسایی ترافیک را برای فایروال‌ها بسیار دشوار می‌سازد.

[!IMPORTANT]

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

برای تست این مورد، می‌توانید از دستور زیر بصورت موقتی روی هر یک از سرور های خود استفاده کنید:

iptables -t nat -A POSTROUTING -d target-ip -j SNAT --to-source spoof-ip

بعد:

ping target-ip

و در سرور مقابل از ابزاری مثل tcpdump استفاده کنید:

tcpdump icmp

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

همچنین می‌توانید از ابزار بسیار دقیق تر spoof-tester درون هسته و پنل استفاده کنید.(برای استفاده و تنظیمات تانل، حتما از آن استفاده کنید.)

چگونگی شکل گیری پروژه:

چگونه پروژه به وجود آمد: منشأ تونل جعلی مفهوم تونل جعل دو طرفه در واکنش به قطعی شدید اینترنت در ایران در پی قیام خونین 8 و 9 ژانویه 2026 (18-19 دی 1404) پدیدار شد. در طول این قطع کامل از اینترنت جهانی، هدف اصلی ما مهندسی معکوس دامنه و لایه دقیق محدودیت‌های تحمیلی بود.

پس از بررسی مسیرهای BGP برای پیشوندهای IP ایران، جزئیات شگفت‌انگیزی را مشاهده کردیم: برخلاف قطع اینترنت در افغانستان که مسیرهای BGP به سادگی ناپدید شدند، محدوده IP ایران همچنان به طور فعال در سطح جهانی اعلام می‌شد. این به شدت نشان داد که زیرساخت های فیزیکی بین المللی هنوز دست نخورده است.

متعاقباً، مشخص شد که برخی از نهادهای ایرانی وابسته به دولت توانستند آدرس‌های IP خاص خود را در لیست سفید قرار دهند و اتصال بین‌المللی خود را با موفقیت بازیابی کنند. این مشاهدات منجر به این فرضیه شد که محدودیت در لایه 3 اعمال می شود، به طور خاص فیلتر بر اساس srcIP و dstIP.

این فرضیه زمانی تایید شد که متوجه شدیم چند آدرس IP خارجی منتخب (مانند محدوده‌های خاص از Hetzner) هنوز هم می‌توانند اتصالات ورودی به ایران برقرار کنند. شواهد به وضوح نشان می‌دهند که «بلاک‌ اوت» یک قطع فیزیکی نیست، بلکه یک خط‌مشی سخت‌گیرانه و مبتنی بر لیست سفید فایروال لایه ۳ است.

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

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

نصب سریع(هسته تانل و پنل GUI):

bash <(curl -Ls https://raw.githubusercontent.com/ParsaKSH/spoof-tunnel/main/panel/install.sh)

۱. معماری هسته: Mutual IP Spoofing

۱.۱ جریان داده نامتقارن (Asymmetric Data Flow)

در این پیاده‌سازی، کلاینت و سرور توافق می‌کنند که از چه آی‌پی‌هایی به عنوان هویت جعلی استفاده کنند:

  • کلاینت به سرور (Upload): کلاینت پکت‌ها را با یک سورس آی‌پی جعلی (مانند Client_Spoof_IP) مونتاژ کرده و مستقیما به آی‌پی واقعی سرور می‌فرستد.
  • سرور به کلاینت (Download): سرور در پاسخ، پکت‌ها را با یک آی‌پی جعلی متفاوت (مانند Server_Spoof_IP) به عنوان مبدا ایجاد کرده و به سمت آی‌پی واقعی کلاینت ارسال می‌کند.

نتیجه این کار ایجاد دو جریان ترافیک یک‌طرفه (Unidirectional) در شبکه است. فایروال‌های میانی قادر نخواهند بود این بسته های رفت و برگشتی را با هم مرتبط کنند، که این امر منجر به بای‌پس شدن کامل جداول conntrack و سیستم‌های تشخیص الگو (Fingerprinting) می‌شود.

۱.۲ پیاده‌سازی سوکت خام (Raw Socket)

برای تزریق پکت‌ها با هدرهای دلخواه کشف‌نشده در لایه ۳، اسپوف تانل از Raw Socketها (AF_INET و SOCK_RAW) استفاده می‌کند. تمامی فرآیند ساخت هدرهای IPv4/IPv6 و محاسبه چک‌سام (Checksum) مستقیماً در نرم‌افزار انجام می‌شود.

  • کتابخانه‌های gopacket و pcap برای دور زدن کامل استک شبکه سیستم‌عامل کاربرد وسیعی دارند.
  • فیلترهای قدرتمند BPF: برای جلوگیری از اینکه سیستم‌عامل میزبان پکت‌های ورودی که آی‌پی آن‌ها با کارت‌شبکه لوکال هم‌خوانی ندارد را دراپ کند (و یا خطای ICMP Destination Unreachable/TCP RST ارسال کند)، از فیلترهای قدرتمند Berkeley Packet Filter در سطح کرنل استفاده می‌شود تا پکت‌های متعلق به تونل مستقیما تحویل برنامه شوند و محدودیت‌های مسیریابی محلی دور زده شود.

۲. پروتکل‌های انتقال (Transports)

۲.۱ حالت ICMP (ترافیک Echo)

تونل قادر است چانک‌های داده رمزنگاری شده را به عنوان Payload درون پکت‌های ICMP Echo Request (Type 8) و ICMP Echo Reply (Type 0) پنهان کند. در تجهیزات مانیتورینگ شبکه، این ترافیک صرفاً به عنوان یک عملیات پینگ مستمر یا ترافیک عیب‌یابی شبکه تفسیر می‌شود.

۲.۲ حالت ICMPv6

علاوه بر ICMP، می‌توانید از ICMPv6 هم استفاده کنید،‌ چرا که فایروال با قطع کردن کامل بستر IPv6، محدودیت های کمتری روی پروتکل ICMPv6‌ قرار داده،‌ در نتیجه شما با استفاده از IPv4 می‌توانید پکت خود را با protoی ICMPv6 عبور دهید.

۲.۳ حالت UDP

ارسال به فرمت دیتانگرام‌های استاندارد UDP انجام می‌گیرد. این حالت می‌تواند از پورت‌های داینامیک مبدا استفاده کند تا ترافیک را شبیه به سرویس‌های UDP معمول (مثل DNS)در اینترنت نشان دهد.

۲.۴ حالت TCP (SYN flag)

علاوه بر سه پروتکل دیگر، می‌توانید از TCP ساده هم استفاده کنید،‌ زیرا در بعضی اوقات فایروال ایران به طور کامل UDP و اکثر پروتکل های دیگر را مسدود کرده، اما TCP معمولا آخرین پروتکلی‌است که به طور کامل بسته می‌شود.


📌 ویژگی های نسخه v1.0.3(منسوخ شده)

۳. لایه تضمین تحویل (Reliability Layer)

بدلیل اینکه متدهای ICMP و UDP هیچگونه ضمانتی برای تحویل، ترتیب یا یکپارچگی داده ندارند، اسپوف تانل یک لایه شبیه به TCP را به صورت سفارشی در Userspace پیاده‌سازی کرده است. این لایه برای جلوگیری از شکسته شدن هندشیک‌های TLS و انتقال استریم دیتا ضروری است.

  • توالی پکت‌ها و تاییدیه (ACK): کلاینت و سرور داده‌ها را درون بلوک‌های SeqDataPacket قرار می‌دهند که دارای یک شماره توالی افزایشی (Sequence Number) ۴ بایتی است. گیرنده نیز دریافت کلاستری از داده‌ها را از طریق AckPacketها و با استفاده از Bitmap های ۶۴ بیتی تایید می‌کند تا در مصرف پهنای باند شبکه صرفه‌جویی شود.
  • کنترل جریان داده (بافرهای Send/Receive): ماژول RecvBuffer تمامی توالی‌ها را در حافظه مدیریت می‌کند. پکت‌های خارج از نوبت (Out-of-Order) موقتاً در بافر نگه داشته می‌شوند تا پکت‌های قبلی دریافت شوند و داده‌ها کاملاً به صورت In-Order به سوکت مقصد (SOCKS5/Target) تحویل داده شوند.
  • موتور ارسال مجدد (Retransmission Engine): یک Goroutine اختصاصی در پس‌زمینه، هر ۱۰۰ میلی‌ثانیه وضعیت SendBuffer را بررسی می‌کند. هر پکتی که زمان retransmit_timeout آن منقضی شده باشد با الگوریتم Exponential Backoff مجددا تا سقف max_retries بازپخش می‌شود.

۴. مالتی‌پلکسینگ (Session Multiplexing)

ایجاد یک تونل کلاینت-سرور کاملا جدید برای هر کانکشن کوچک، تاخیر اولیه شدیدی (INIT Overhead) ایجاد می‌کرد. اسپوف تانل برای رفع این مشکل دارای یک ماژول اکوسیستم داخلی (Multiplexer) است.

در این معماری، فقط یک "Master Session" منفرد روی لینک ناپایدار برقرار می‌ماند. هر کانکشن SOCKS5 اتصال یافته در پورت محلی کلاینت، منحصراً به یک شناسه ۴‌ بایتی مجازی StreamID نگاشت شده و تمامی داده‌های آن در قالب همان Master Session منتقل می‌شود.

  • کد 0x01 MuxStreamOpen: به همراه [StreamID:4][TargetLen:2][آدرس مقصد]
  • کد 0x02 MuxStreamData: به همراه [StreamID:4][داده خام]
  • کد 0x03 MuxStreamClose: به همراه [StreamID:4]
  • کد 0x04 MuxStreamAck: پاسخ سرور مبنی بر موفقیت در ریکوئست اتصال TCP به مقصد.

۵. رمزنگاری (Cryptography)

امنیت و لاپوشانی اطلاعات منحصرا با الگوریتم قدرتمند ChaCha20-Poly1305 AEAD تضمین می‌شود. ویژگی AEAD اطمینان حاصل می‌کند که هیچ حمله‌کننده از نوع MITM نتواند حتی یک بایت از ساختمان دیتای پنهان شده را رمزگشایی کرده یا تغییری در آن ایجاد کند (در غیر اینصورت کانکشن بلافاصله دراپ می‌شود).

مدیریت Nonce‌های تصادفی در ابتدای نشست (Session) مانع از وقوع حملات Replay (بازپخش بسته‌های ضبط شده) می‌گردد، و احراز هویت تونل تنها از طریق کلید استاتیک Base64 مشترک امکان پذیر خواهد بود.


📌 ویژگی های نسخه v3 به بعد

۶ پروتکل انتقال نامتقارن

هر کلاینت یا سرور می‌تواند بصورت نامتقارن با هر پروتکل انتقال به طرف مقابل داده های خود را ارسال کند، مثلا کلاینت با استفاده از TCP و سرور با استفاده از ICMPv6، بسته به جزئیات محدودیت سرورتان می‌توانید آن را انتخاب کنید.

۷ UDP-Pipe ساده

از نسخه v2 به بعد، در جهت افزایش کارایی و کاهش سر بار پردازشی،‌ هسته به یک udp-pipe ساده تبدیل شده است، روی یک پورت udp گوش می‌دهد، شما هر نوع ترافیک udp را به آن می‌فرستید،‌ هسته پکت را داخل تونل به سرور انتقال می‌دهد و در سرور به یک endpoint که شما تنظیم کرده‌اید فوروارد می‌کند.

در نتیجه قابلیت هایی مثل fec,chacha20-crypto,socks,ack and tcp-like system,... از هسته حذف شده اند.

بهترین راه حل، ایجاد آیپی4/6 لوکال با استفاده از wireguard است. می‌توانید اسکریپت ایجاد آیپی6 لوکال من با استفاده وایرگارد را مطالعه کنید: https://github.com/ParsaKSH/TAQ-BOSTAN/blob/main/wireguard.sh در سمت کلاینت، باید در مسیر /etc/wireguard/TAQBOSTANwg.conf مقدار آیپی را در endpoint برابر 127.0.0.1 قرار دهید، و پورتی که هسته کلاینت روی آن گوش می‌کند. mtu 1280 پیشنهاد می‌شود.

۸ امکان دادن لیست آیپی اسپوف

از نسخه v3 به بعد، این امکان فراهم شده است که به جای یک آیپی بعنوان آیپی اسپوف، از یک لیست آیپی استفاده کنید، هسته بصورت چرخشی(Round-Robin) به ترتیب برای ارسال هر پکت، از یک آیپی جدید در لیستی که به آن دادید استفاده می‌کند. دلیل این قابلیت این است، که فایروال زیرساخت روی آیپی های وایت لیست شده، محدودیت پهنای باند یا حجم قرار داده است، در نتیجه وقتی از یک آیپی خاص استفاده کنید،‌ محدودیت های آن آیپی بر کیفیت ارتباط شما نیز تاثیر منفی می‌گذارند. برای چگونگی به دست آوردن این لیست، سکشن مربوط به ابزار تست اسپوف را مطالعه کنید.

۹ بازنویسی ماژول های low-level با rust

از نسخه v2 به بعد،‌ بخش های high load هسته که وظیفه کار در سطح پکت و تغییر هدر آیپی را دارند، با راست بازنویسی شده‌اند تا کمترین بار پردازشی و بیشترین پرفورمنس را فراهم کنند.

۱۰ ابزار تست ارسال پکت اسپوف و پیدا کردن آیپی قابل اسپوف بصورت داخلی

۱۰.۱ ترنسپورت های ICMP , TCP

در حال حاضر ماژول تستر از دو پروتکل tcp, icmp پشتیبانی می‌کند که می‌توانید بسته به نیاز از آن استفاده کنید.

۱۰.۲ امکان دادن رنج آیپی برای تست

شما می‌توانید رنج آیپی ها یا تک آیپی های خود را به جهت امکان استفاده از آنها برای اسپوف تست کنید؛ ماژول رنج هارا استخراج کرده و با تک تک آن آیپی ها پکت اسپوف شده ارسال می‌کند. سمت receiver، منتظر دریافت پکت ها هست، درصورتی که پکتی از یک آیپی مورد تست به دستش رسید، آن را ذخیره می‌کند.

فرمت های ورودی پشتیبانی شده برای آیپی اسپوف: - تک آیپی ==> 192.168.1.1 - رنج آیپی ==> 192.168.1.1-192.168.1.255 - رنج آیپی با سابنت(CIDR) ==> 192.168.1.0/24

۱۰.۳ امکان مشخص کردن درصد پکت لاس مجاز

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

۱۰.۴ دو حالت sender و receiver

این ماژول برای کار کردن به دو سرور(node)‌ احتیاج دارد،‌ یک سمت نقش فرستنده را ایفا می‌کند و سمت دیگر پکت هارا برای تایید دریافت می‌کند. شیوه استفاده: - در مرحله اول، کلاینت(سرور ایران) را در حالت sender‌ قرار دهید، پروتکل،‌ فایل شامل رنج آیپی های اسپوف تست، آیپی تارگت(سرور، سرور خارج)، تعداد تلاش ها به ازای هر آیپی،‌ بیتشرین میزان پکت لاس مجاز و تایم اوت را مشخص کنید. - حال سرور(سرور خارج) را در حالت receiver‌ قرار دهید و موارد گفته شده در مرحله قبل را مشخص کنید. - طرف receiver را اجر کنید، سپس بلافاصله هست sender‌ را اجرا کنید. - حال،‌ بعد از گذشتن مدت تایم اوت، در سمت گیرنده، آیپی هایی که فرستنده توانسته با جعل آنها پکت خود را به گیرنده برساند مشخص شده است، همچنین پکت لاس هر آیپی مشخص شده است. - بعد از انجام این مرحله، دقیقا این کار را بصورت برعکس انجام دهید، یعنی کلاینت(سرور ایران) این بار نقش گیرنده را بازی کند و سرور(سرور خارج) نقش فرستنده را. - اگر سرور های شما قابلیت ارسال پکت اسپوف شده را داشته باشند، شما در هر طرف لیستی از آیپی ها دارید که می‌توانید با آنها تانل خود را برقرار کنید. - توجه کنید که خروجی کلاینت در حالت reciever باید برای استفاده بعنوان اسپوف آیپی در سمت سرور استفاده شود، و خروجی سمت سرور در حالت receiver باید در اسپوف آیپی سمت کلاینت استفاده شود.


📌 پنل وب GUI

از نسخه v2 به بعد، در جهت سهولت در استفاده،‌ پنل وب قرار داده شده است؛ می‌توانید آن را با استفاده از اسکریپت نصب واقع در مسیر: https://github.com/ParsaKSH/spoof-tunnel/blob/main/panel/install.sh دانلود و نصب کنید، روی سرور های ایران باید عملیات داخل اسکریپت را بصورت دستی انجام دهید.

تمام قابلیت های هسته، از جمله خود تانل و ماژول tester در پنل پوشش داده شده اند.

image image image


📌 نسخه v1.0.3(منسوخ)

راهنمای استفاده

۱. بیلد کردن باینری

اسپوف تانل به زبان Go نوشته شده است و توسط ابزار استاندارد این زبان کامپایل می‌شود:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o spoof ./cmd/spoof/

۲. تولید کلید‌های رمزنگاری

پیش از راه‌اندازی، باید یک جفت کلید خصوصی/عمومی (Private/Public Keys) با فرمت Base64 برای کلاینت و سرور اختصاصیِ خود ایجاد کنید.

./spoof keygen

کلید Private مشترک خود و Public Key تولید شده را در جای امنی یادداشت کنید. کلید عمومی سرور (Server Public Key) را باید درون فیلد peer_public_key کانفیگ کلاینت، و کلید عمومی کلاینت را درون همان فیلد در کانفیگ سرور قرار دهید.

۳. اجرای سرویس

نکته بسیار مهم: گوش دادن روی سوکت‌های خام (Raw Sockets) در لینوکس نیازمند سطح دسترسی سیستمی بالا است. باید باینری‌ها را قطعاً به همراه sudo و تحت یوزر Root ران کنید (یا دسترسی CAP_NET_RAW به آن بدهید).

در سمت سرور:

sudo ./spoof -c server-config.json

در سمت کلاینت:

sudo ./spoof -c client-config.json

به محض اتصال موفقیت آمیز، کلاینت یک پروکسی SOCKS5 روی پورت `127.

Extension points exported contracts — how you extend this code

Sender (Interface)
Sender sends spoofed packets over the wire. [4 implementers]
internal/transport/transport.go
DashInstance (Interface)
(no doc)
panel/frontend/app/dashboard/page.tsx
Receiver (Interface)
Receiver listens for incoming spoofed packets. [4 implementers]
internal/transport/transport.go
DashData (Interface)
(no doc)
panel/frontend/app/dashboard/page.tsx
SysData (Interface)
(no doc)
panel/frontend/app/dashboard/page.tsx
Instance (Interface)
(no doc)
panel/frontend/app/dashboard/tunnels/page.tsx

Core symbols most depended-on inside this repo

Error
called by 25
internal/transport/errors.go
request
called by 22
panel/frontend/lib/api.ts
Close
called by 22
internal/transport/transport.go
update
called by 15
panel/frontend/app/dashboard/tunnels/edit/page.tsx
firstStr
called by 14
internal/config/config.go
parseID
called by 10
panel/backend/internal/api/handlers.go
close
called by 10
rust/src/tcp_sender.rs
restoreICMPEchoReply
called by 10
internal/relay/utils.go

Shape

Function 145
Method 145
Struct 34
Class 10
Interface 6
TypeAlias 1

Languages

Go60%
Rust26%
TypeScript14%

Modules by API surface

panel/backend/internal/api/handlers.go29 symbols
panel/backend/internal/manager/tunnel.go25 symbols
rust/src/lib.rs24 symbols
internal/tester/runner.go17 symbols
internal/tester/iplist.go17 symbols
rust/src/tcp_sender.rs11 symbols
internal/transport/transport.go10 symbols
panel/frontend/app/dashboard/tunnels/edit/page.tsx9 symbols
panel/backend/internal/auth/auth.go9 symbols
internal/relay/remote.go9 symbols
internal/relay/local.go9 symbols
cmd/spoof/main.go9 symbols

For agents

$ claude mcp add spoof-tunnel \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page