پرش به مطلب اصلی

IpManipulator

📖 معرفی کلی

ویژگیمقدارتوضیح
نوع نودTunnel (دو‌جهته)ترافیک از هر دو جهت عبور می‌کند و کانکشن مفهومی ندارد.
لایه شبکهلایه ۳کار با بسته‌ها (Packet) بدون تغییر اندازه‌ی آن‌ها
موقعیت در زنجیروسط زنجیرفقط در وسط زنجیر قابل استفاده است
وابستگینود قبل و بعدبرای دریافت/ارسال داده ضروری است

این نود یکی از اصلی‌ترین نودهای لایه ۳ واتروال است؛ معمولاً ترفندهایی که می‌خواهیم روی پکت‌ها برای عبور از فیلترینگ اعمال کنیم را در این نود پیاده‌سازی می‌کنیم.

در نسخهٔ کنونی واتروال، این نود از ۳ ترفند پشتیبانی می‌کند که در ادامه به هر کدام می‌پردازیم.

عملکرد

ساختار کلی استفاده از این نود:

{
"name": "node_name",
"type": "IpManipulator",
"settings": {
// per trick settings
},
"next": "next_node_name"
}

ترفند شماره ۱: تغییر IP Payload Identifier

هر پکت لایهٔ IP (چه نسخه ۴ و چه نسخه ۶) یک payload حمل می‌کند که نوع آن با یک عدد به نام identifier مشخص می‌شود.

این عدد مشخص می‌کند که پکت، دادهٔ TCP، UDP، ICMP، IGMP و ... را حمل می‌کند.

لیست کامل این اعداد در لینک زیر موجود است:

📋 پروتکل‌های IP

در این ترفند، پکت‌هایی که از سمت چپ به راست عبور می‌کنند بررسی می‌شوند؛ اگر پکت از نوع TCP بود (identifier = 6)، مقدار آن را به یک عدد دیگر تغییر می‌دهیم.

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

برای این کار، این تنظیم را ست کنید:

{
"protoswap-tcp": <number>
}

این نود هنگام برگشت پکت (مسیر راست به چپ) عمل معکوس را انجام می‌دهد؛ یعنی اگر identifier با آن عدد برابر بود، آن را به شمارهٔ ۶ (TCP) برمی‌گرداند.

این روش تونل در عمل خوب بوده و من بیش از ۲ ماه از آن استفاده کرده‌ام و مشکلی نخورده‌ام (اگرچه توسط برخی دوستان مشکلاتی مانند فیلتر شدن یا «IranAccess» گزارش شده است).

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

همچنین دقت کنید عددی که انتخاب می‌کنید در احتمال فیلتر شدن مؤثر است. شخصاً دیده‌ام برخی اعداد بی‌معنا باعث می‌شوند بین ۱ تا ۳ روز IP سرور خارج فیلتر شود، اما برخی اعداد منطقی تا این لحظه برای من بدون مشکل (فیلتر یا اکسس) بوده‌اند.

اگر بخواهید روشی مثل WireGuard (که UDP است) را تونل کنید و از این مزیت استفاده کنید، کافی است تنظیم زیر را اضافه کنید:

{
"protoswap-udp": <number>
}

می‌توانید هر دو تنظیم را همزمان داشته باشید و هم TCP و هم UDP را تغییر دهید؛ اما دقت کنید:

  • protoswap-udp
  • protoswap-tcp

نباید با هم یکسان باشند! ⚠️

همچنین در سمت سرور خارج باید همین نود با همین تنظیمات فعال باشد تا آنجا پکت‌ها به شکل صحیح برگردانده شوند.


ترفند شماره ۲: بازی با بیت‌های پروتکل TCP

می‌توانید با تغییر بیت‌های TCP فایروال را در پردازش پکت‌ها گیج کنید.

برای این کار به تنظیمات زیر دسترسی دارید. به‌عنوان مثال:

"up-tcp-bit-ack": "packet->fin",
"up-tcp-bit-fin": "packet->ack",

"dw-tcp-bit-fin": "packet->ack",
"dw-tcp-bit-ack": "packet->fin"

📝 توضیحات:

به ابتدای تنظیمات دقت کنید:

  • up: تنظیمات پکت‌هایی که از سمت چپ به راست این نود حرکت می‌کنند
  • dw: تنظیمات پکت‌هایی که از سمت راست به چپ این نود حرکت می‌کنند

⚡ نکتهٔ مهم: اعمال تغییر بیت‌ها به‌صورت همزمان انجام می‌شود و خط‌به‌خط نیست.

🔄 مثال:

  • "up-tcp-bit-ack": "packet->fin" یعنی بیت ack مقدارش از بیت fin پکت اصلی خوانده شود.
  • پکت اصلی تا پایان عملیات تغییر نمی‌کند؛ بنابراین در خط بعدی می‌توانیم از مقدار ack پکت اصلی برای ساختن بیت fin پکت جدید استفاده کنیم.

در سمت سرور خارج باید بیت‌ها را به حالت اول برگردانید و سپس پکت را به سیستم‌عامل تحویل دهید. در مثال ما این تنظیمات لازم است:

"up-tcp-bit-ack": "packet->fin",
"up-tcp-bit-fin": "packet->ack",

"dw-tcp-bit-fin": "packet->ack",
"dw-tcp-bit-ack": "packet->fin"

توضیحات تکمیلی:

می‌توانید تمام بیت‌ها را تغییر دهید؛ تنظیمات در اختیار شماست:

"up-tcp-bit-cwr": <string>,
"up-tcp-bit-ece": <string>,
"up-tcp-bit-urg": <string>,
"up-tcp-bit-ack": <string>,
"up-tcp-bit-psh": <string>,
"up-tcp-bit-rst": <string>,
"up-tcp-bit-syn": <string>,
"up-tcp-bit-fin": <string>,

"dw-tcp-bit-cwr": <string>,
"dw-tcp-bit-ece": <string>,
"dw-tcp-bit-urg": <string>,
"dw-tcp-bit-ack": <string>,
"dw-tcp-bit-psh": <string>,
"dw-tcp-bit-rst": <string>,
"dw-tcp-bit-syn": <string>,
"dw-tcp-bit-fin": <string>

و هر کدام را می‌توانید به این شکل‌ها ست کنید:

"off", "on", "packet->cwr", "packet->ece", "packet->urg", "packet->ack", "packet->psh", "packet->rst", "packet->syn", "packet->fin"

🧩 ترفند تکه‌تکه کردن پکت‌ها (SNI Blender)

با همین نود IpManipulator می‌توانید پکت‌های TlsClientHello را به پکت‌های لایهٔ IP تکه‌تکه کنید.

🎯 کاربردها

  • 🔒 برای تونل زدن، دامنه را مخفی کنید
  • ☁️ تونل به Cloudflare
  • 🌐 در حالت «سرورلس»، سایت‌های پشت CDN مثل یوتیوب را باز کنید

🔄 تفاوت با روش‌های دیگر

این روش با fragmenting معرفی‌شده توسط gfw-knocker متفاوت است.

⚙️ نحوهٔ کار

  1. پکت ClientHello به پکت‌های لایهٔ IP تکه‌تکه می‌شود
  2. سپس با ترتیب تصادفی ارسال می‌شود
  3. تعداد پکت‌ها در تنظیمات قابل تغییر است (عدد ۴ معمولاً مناسب است)

📊 نتایج تست

  • ❌ همراه اول: در برخی فایروال‌ها این نوع پکت کلاً drop می‌شود
  • ✅ ایرانسل: باعث باز شدن سایت‌های فیلتر پشت CDN شد (یوتیوب و ...)
  • 🖥️ تست روی ویندوز: چون نیازی به سرور نداشت

⚠️ هشدار: روی همهٔ شبکه‌ها جواب نمی‌دهد، اما روشی جدید و قابل بررسی است.

🛠️ پیاده‌سازی

برای این ترفند، در سرور خارج واتروال کاری انجام نمی‌دهد. در سرور ایران، کانفیگ شما به‌صورت عادی به پورت ۴۴۳ سرور خارج وصل می‌شود.

⚠️ نیاز: کانفیگی که دست کاربر است باید TLS داشته باشد. اگر ندارد، باید در واتروال به زنجیر نودهای TlsClient/TlsServer را اضافه کنید.

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

اگر در خود Xray، TLS فعال باشد (یعنی کانفیگ کاربر هم TLS است) نیازی نیست واتروال در سرور خارج اجرا شود.

در غیر این صورت باید با واتروال یک TLS tunnel بسازید که در این حالت، در سرور خارج نیز برای نود TlsServer لازم است واتروال اجرا شود.

اگر قصد تونل به Cloudflare را دارید، واتروال فقط روی سرور ایران کافی است اجرا شود.

امیدوارم توضیحات این بخش واضح بوده باشد؛ درک کامل آن نیازمند آشنایی بیشتر با شبکه و TLS است.

می‌توانید لینک این آموزش را به یک مدل هوش مصنوعی بدهید تا دربارهٔ بخش‌های مختلف آن سؤال کنید و جزئیات بیشتری بگیرید.

برای فعال‌سازی این قابلیت، این مقادیر را تنظیم کنید:

"sni-blender": true,
"sni-blender-packets": 4

📝 نکته: در اینجا تنها کافی است IP سرور ایران و خارج را تنظیم کنید.

💻 استفاده در ویندوز

در حالت سرورلس نیز می‌توانید همین کانفیگ را روی ویندوز اجرا کنید، اما باید:

  • روتینگ ویندوز را تغییر دهید (دستور دارد)
  • پکت‌های دریافتی از IPهای مختلف را capture کنید

🚧 وضعیت توسعه در ویندوز

🔧 وضعیت فعلی: فعلاً به‌صورت دستی برای تست انجام شده است. چون کد کامل نیست، توضیح آن را به نسخهٔ بعدی موکول می‌کنیم.