اسپوف تانل یک تونل پروکسی در لایههای ۳ و ۴ شبکه (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های فیزیکی واقعی یکدیگر آگاه هستند و آنها را قادر میسازد تا علیرغم مسیریابی نامتقارن و جعلی، یک ارتباط منطقی برقرار کرده و حفظ کنند.
bash <(curl -Ls https://raw.githubusercontent.com/ParsaKSH/spoof-tunnel/main/panel/install.sh)
در این پیادهسازی، کلاینت و سرور توافق میکنند که از چه آیپیهایی به عنوان هویت جعلی استفاده کنند:
Client_Spoof_IP) مونتاژ کرده و مستقیما به آیپی واقعی سرور میفرستد.Server_Spoof_IP) به عنوان مبدا ایجاد کرده و به سمت آیپی واقعی کلاینت ارسال میکند.نتیجه این کار ایجاد دو جریان ترافیک یکطرفه (Unidirectional) در شبکه است. فایروالهای میانی قادر نخواهند بود این بسته های رفت و برگشتی را با هم مرتبط کنند، که این امر منجر به بایپس شدن کامل جداول conntrack و سیستمهای تشخیص الگو (Fingerprinting) میشود.
برای تزریق پکتها با هدرهای دلخواه کشفنشده در لایه ۳، اسپوف تانل از Raw Socketها (AF_INET و SOCK_RAW) استفاده میکند. تمامی فرآیند ساخت هدرهای IPv4/IPv6 و محاسبه چکسام (Checksum) مستقیماً در نرمافزار انجام میشود.
gopacket و pcap برای دور زدن کامل استک شبکه سیستمعامل کاربرد وسیعی دارند.ICMP Destination Unreachable/TCP RST ارسال کند)، از فیلترهای قدرتمند Berkeley Packet Filter در سطح کرنل استفاده میشود تا پکتهای متعلق به تونل مستقیما تحویل برنامه شوند و محدودیتهای مسیریابی محلی دور زده شود.تونل قادر است چانکهای داده رمزنگاری شده را به عنوان Payload درون پکتهای ICMP Echo Request (Type 8) و ICMP Echo Reply (Type 0) پنهان کند. در تجهیزات مانیتورینگ شبکه، این ترافیک صرفاً به عنوان یک عملیات پینگ مستمر یا ترافیک عیبیابی شبکه تفسیر میشود.
علاوه بر ICMP، میتوانید از ICMPv6 هم استفاده کنید، چرا که فایروال با قطع کردن کامل بستر IPv6، محدودیت های کمتری روی پروتکل ICMPv6 قرار داده، در نتیجه شما با استفاده از IPv4 میتوانید پکت خود را با protoی ICMPv6 عبور دهید.
ارسال به فرمت دیتانگرامهای استاندارد UDP انجام میگیرد. این حالت میتواند از پورتهای داینامیک مبدا استفاده کند تا ترافیک را شبیه به سرویسهای UDP معمول (مثل DNS)در اینترنت نشان دهد.
علاوه بر سه پروتکل دیگر، میتوانید از TCP ساده هم استفاده کنید، زیرا در بعضی اوقات فایروال ایران به طور کامل UDP و اکثر پروتکل های دیگر را مسدود کرده، اما TCP معمولا آخرین پروتکلیاست که به طور کامل بسته میشود.
📌 ویژگی های نسخه v1.0.3(منسوخ شده)
بدلیل اینکه متدهای ICMP و UDP هیچگونه ضمانتی برای تحویل، ترتیب یا یکپارچگی داده ندارند، اسپوف تانل یک لایه شبیه به TCP را به صورت سفارشی در Userspace پیادهسازی کرده است. این لایه برای جلوگیری از شکسته شدن هندشیکهای TLS و انتقال استریم دیتا ضروری است.
SeqDataPacket قرار میدهند که دارای یک شماره توالی افزایشی (Sequence Number) ۴ بایتی است. گیرنده نیز دریافت کلاستری از دادهها را از طریق AckPacketها و با استفاده از Bitmap های ۶۴ بیتی تایید میکند تا در مصرف پهنای باند شبکه صرفهجویی شود.RecvBuffer تمامی توالیها را در حافظه مدیریت میکند. پکتهای خارج از نوبت (Out-of-Order) موقتاً در بافر نگه داشته میشوند تا پکتهای قبلی دریافت شوند و دادهها کاملاً به صورت In-Order به سوکت مقصد (SOCKS5/Target) تحویل داده شوند.SendBuffer را بررسی میکند. هر پکتی که زمان retransmit_timeout آن منقضی شده باشد با الگوریتم Exponential Backoff مجددا تا سقف max_retries بازپخش میشود.ایجاد یک تونل کلاینت-سرور کاملا جدید برای هر کانکشن کوچک، تاخیر اولیه شدیدی (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 به مقصد.امنیت و لاپوشانی اطلاعات منحصرا با الگوریتم قدرتمند ChaCha20-Poly1305 AEAD تضمین میشود. ویژگی AEAD اطمینان حاصل میکند که هیچ حملهکننده از نوع MITM نتواند حتی یک بایت از ساختمان دیتای پنهان شده را رمزگشایی کرده یا تغییری در آن ایجاد کند (در غیر اینصورت کانکشن بلافاصله دراپ میشود).
مدیریت Nonceهای تصادفی در ابتدای نشست (Session) مانع از وقوع حملات Replay (بازپخش بستههای ضبط شده) میگردد، و احراز هویت تونل تنها از طریق کلید استاتیک Base64 مشترک امکان پذیر خواهد بود.
📌 ویژگی های نسخه v3 به بعد
هر کلاینت یا سرور میتواند بصورت نامتقارن با هر پروتکل انتقال به طرف مقابل داده های خود را ارسال کند، مثلا کلاینت با استفاده از TCP و سرور با استفاده از ICMPv6، بسته به جزئیات محدودیت سرورتان میتوانید آن را انتخاب کنید.
از نسخه 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) به ترتیب برای ارسال هر پکت، از یک آیپی جدید در لیستی که به آن دادید استفاده میکند. دلیل این قابلیت این است، که فایروال زیرساخت روی آیپی های وایت لیست شده، محدودیت پهنای باند یا حجم قرار داده است، در نتیجه وقتی از یک آیپی خاص استفاده کنید، محدودیت های آن آیپی بر کیفیت ارتباط شما نیز تاثیر منفی میگذارند. برای چگونگی به دست آوردن این لیست، سکشن مربوط به ابزار تست اسپوف را مطالعه کنید.
از نسخه v2 به بعد، بخش های high load هسته که وظیفه کار در سطح پکت و تغییر هدر آیپی را دارند، با راست بازنویسی شدهاند تا کمترین بار پردازشی و بیشترین پرفورمنس را فراهم کنند.
در حال حاضر ماژول تستر از دو پروتکل tcp, icmp پشتیبانی میکند که میتوانید بسته به نیاز از آن استفاده کنید.
شما میتوانید رنج آیپی ها یا تک آیپی های خود را به جهت امکان استفاده از آنها برای اسپوف تست کنید؛ ماژول رنج هارا استخراج کرده و با تک تک آن آیپی ها پکت اسپوف شده ارسال میکند. سمت receiver، منتظر دریافت پکت ها هست، درصورتی که پکتی از یک آیپی مورد تست به دستش رسید، آن را ذخیره میکند.
فرمت های ورودی پشتیبانی شده برای آیپی اسپوف: - تک آیپی ==> 192.168.1.1 - رنج آیپی ==> 192.168.1.1-192.168.1.255 - رنج آیپی با سابنت(CIDR) ==> 192.168.1.0/24
شما در هر طرف میتوانید مشخص کنید چه مقدار پکت لاس برای هر آیپی اسپوف مجاز است.
این ماژول برای کار کردن به دو سرور(node) احتیاج دارد، یک سمت نقش فرستنده را ایفا میکند و سمت دیگر پکت هارا برای تایید دریافت میکند. شیوه استفاده: - در مرحله اول، کلاینت(سرور ایران) را در حالت sender قرار دهید، پروتکل، فایل شامل رنج آیپی های اسپوف تست، آیپی تارگت(سرور، سرور خارج)، تعداد تلاش ها به ازای هر آیپی، بیتشرین میزان پکت لاس مجاز و تایم اوت را مشخص کنید. - حال سرور(سرور خارج) را در حالت receiver قرار دهید و موارد گفته شده در مرحله قبل را مشخص کنید. - طرف receiver را اجر کنید، سپس بلافاصله هست sender را اجرا کنید. - حال، بعد از گذشتن مدت تایم اوت، در سمت گیرنده، آیپی هایی که فرستنده توانسته با جعل آنها پکت خود را به گیرنده برساند مشخص شده است، همچنین پکت لاس هر آیپی مشخص شده است. - بعد از انجام این مرحله، دقیقا این کار را بصورت برعکس انجام دهید، یعنی کلاینت(سرور ایران) این بار نقش گیرنده را بازی کند و سرور(سرور خارج) نقش فرستنده را. - اگر سرور های شما قابلیت ارسال پکت اسپوف شده را داشته باشند، شما در هر طرف لیستی از آیپی ها دارید که میتوانید با آنها تانل خود را برقرار کنید. - توجه کنید که خروجی کلاینت در حالت reciever باید برای استفاده بعنوان اسپوف آیپی در سمت سرور استفاده شود، و خروجی سمت سرور در حالت receiver باید در اسپوف آیپی سمت کلاینت استفاده شود.
📌 پنل وب GUI
از نسخه v2 به بعد، در جهت سهولت در استفاده، پنل وب قرار داده شده است؛ میتوانید آن را با استفاده از اسکریپت نصب واقع در مسیر:
https://github.com/ParsaKSH/spoof-tunnel/blob/main/panel/install.sh
دانلود و نصب کنید، روی سرور های ایران باید عملیات داخل اسکریپت را بصورت دستی انجام دهید.
تمام قابلیت های هسته، از جمله خود تانل و ماژول tester در پنل پوشش داده شده اند.
📌 نسخه 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.
$ claude mcp add spoof-tunnel \
-- python -m otcore.mcp_server <graph>