هستهی دور زدن DPI برای Go، طراحیشده برای اجرا در محیط ترمینال بهصورت headless، بهعنوان یک پروکسی TCP محلی پایدار بین کلاینت شما و اندپوینت مقصد.
پیادهسازی تکنیک SNI-Spoofing توسط @patterniha. تمام اعتبار ایده و روش اصلی متعلق به @patterniha است.
راهنمای انگلیسی: README.md
کلاینت شما → SNISPF (127.0.0.1:LISTEN_PORT) → اندپوینت مقصد (CONNECT_IP:CONNECT_PORT)
SNISPF پیام TLS ClientHello خروجی را رهگیری کرده و پیش از ارسال، استراتژی دور زدن را روی آن اعمال میکند. تنظیمات کلاینت شما بدون تغییر باقی میماند — تمام منطق دور زدن درون SNISPF است.
go build -o snispf.exe ./cmd/snispf
.\snispf.exe --generate-config .\config.json
.\snispf.exe --config .\config.json --config-doctor
قبل از ادامه، تمام خطاهای گزارششده توسط config-doctor را برطرف کنید.
wrong_seqنیاز به ترمینال با دسترسی بالا دارد. در ویندوز، بهعنوان Administrator اجرا کنید. در لینوکس، بهعنوان root اجرا کنید یا ابتداCAP_NET_RAWرا اعطا کنید. جزئیات را در استراتژیهای دور زدن ببینید.
.\snispf.exe --config .\config.json
Address: 127.0.0.1
Port: 40443 (یا مقدار LISTEN_PORT تنظیمشده در کانفیگ)
سایر تنظیمات پروتکل کلاینت را بدون تغییر نگه دارید.
کانفیگ پیشفرض wrong_seq باید مینیمال و تکاندپوینت باشد. برای wrong_seq فیلدهای load balancing چنداندپوینتی را فعال نکنید.
{
"LISTEN_HOST": "127.0.0.1",
"LISTEN_PORT": 40443,
"LOG_LEVEL": "info",
"CONNECT_IP": "203.0.113.10",
"CONNECT_PORT": 443,
"FAKE_SNI": "edge-a.example.com",
"BYPASS_METHOD": "wrong_seq",
"FRAGMENT_STRATEGY": "sni_split",
"FRAGMENT_DELAY": 0.05,
"USE_TTL_TRICK": false,
"FAKE_SNI_METHOD": "raw_inject",
"WRONG_SEQ_CONFIRM_TIMEOUT_MS": 2000,
"INTERFACE": ""
}
| فیلد | توضیح |
|---|---|
LISTEN_HOST:LISTEN_PORT |
آدرس محلی که کلاینت شما به آن متصل میشود |
CONNECT_IP:CONNECT_PORT |
مقصد upstream که SNISPF به آن متصل میشود |
FAKE_SNI |
SNI مورد استفاده در استراتژیهای fake_sni و combined |
BYPASS_METHOD |
استراتژی: fragment، fake_sni، combined، یا wrong_seq |
FRAGMENT_STRATEGY |
نحوه تقسیم ClientHello (مثلاً sni_split) |
FRAGMENT_DELAY |
تأخیر بین فرگمنتها بر حسب ثانیه |
USE_TTL_TRICK |
ارسال ClientHello جعلی با TTL پایین پیش از ClientHello واقعی |
FAKE_SNI_METHOD |
روش SNI جعلی: raw_inject، prefix_fake و غیره |
WRONG_SEQ_CONFIRM_TIMEOUT_MS |
پنجره تأیید برای حالت wrong_seq (پیشفرض: ۲۰۰۰) |
INTERFACE |
نام رابط شبکه جهت اتصال تزریق پکت خام (مانند eth1 یا pppoe-wan). برای تشخیص خودکار خالی بگذارید. |
LOAD_BALANCE |
انتخاب اندپوینت: round_robin، random، failover |
ENDPOINT_PROBE |
حذف اندپوینتهای غیرقابلدسترس در هنگام راهاندازی |
AUTO_FAILOVER |
تلاش مجدد در صورت خطای اتصال |
FAILOVER_RETRIES |
تعداد تلاشهای failover |
PROBE_TIMEOUT_MS |
تایماوت probe اندپوینت بر حسب میلیثانیه |
LOG_LEVEL |
سطح لاگ: error، warn، info، debug |
اولویتبندی کانفیگ: اگر ENDPOINTS تعریف شده باشد، مقادیر اتصال از آن خوانده میشوند. فیلدهای سطح بالا (CONNECT_IP، CONNECT_PORT، FAKE_SNI) برای سازگاری با نسخههای قبلی باقی ماندهاند. در صورت تعارض ENDPOINTS[0] با فیلدهای سطح بالا، یک هشدار در لاگ راهاندازی ثبت میشود.
wrong_seq استراتژی پیشنهادی پیشفرض است. مؤثرترین روش دور زدن را ارائه میدهد، مشروط بر اینکه پیشنیازهای پلتفرم برآورده شده باشند. تنها در صورت عدم امکان، به استراتژیهای سادهتر بازگردید.
| استراتژی | نیاز به دسترسی بالا | توصیهشده برای |
|---|---|---|
wrong_seq |
بله — جدول زیر را ببینید | انتخاب پیشفرض هنگام برآوردهبودن پیشنیازها |
combined |
خیر (با degradation graceful) | زمانی که raw injection در دسترس نیست اما bypass قویتر نیاز است |
fake_sni |
خیر (با degradation graceful) | جایگزین سبکتر combined |
fragment |
خیر | عیبیابی، محیطهای محدود، یا آخرین راهحل |
| پلتفرم | fragment، fake_sni، combined |
wrong_seq |
|---|---|---|
| Linux | بدون دسترسی خاص | ترمینال privileged — root یا CAP_NET_RAW |
| Windows | عادی | ترمینال Administrator + WinDivert.dll + WinDivert64.sys در همان پوشهی فایل اجرایی |
| OpenWrt | عادی | Privileged — CAP_NET_RAW یا root + پشتیبانی از AF_PACKET |
ویندوز: بسته release ویندوز شامل
WinDivert.dllوWinDivert64.sysاست. این فایلها را در همان پوشهیsnispf.exeقرار دهید و از ترمینال Administrator اجرا کنید. بدون هر دو فایل،wrong_seqراهاندازی نمیشود و--infoدلیل آن را گزارش میدهد.لینوکس: یا بهعنوان root اجرا کنید، یا یکبار capability اعطا کنید:
sudo setcap cap_net_raw+ep ./snispf
محدودیتهای اضافی wrong_seq:
- دقیقاً یک اندپوینت فعال
- طول SNI ≤ ۲۱۹ بایت
- اندازه ClientHello جعلی ≤ ۱۴۶۰ بایت (هر دو توسط --config-doctor بررسی میشوند)
اگر load balancing/failover چنداندپوینتی میخواهید، بهجای wrong_seq از combined یا fake_sni یا fragment استفاده کنید.
AF_INET SOCK_RAW IPPROTO_RAW با فلگ IP_HDRINCL=1) برای تزریق پکتهای جعلی استفاده میکند. این ویژگی در لایه IP عمل میکند و به هستهی سیستمعامل اجازه میدهد تا فرآیند مسیریابی (Routing)، حل ARP/همسایگی و کپسولهسازی لایه ۲ را بهطور خودکار انجام دهد. در نتیجه، این روش با تمامی فناوریهای WAN—شامل PPPoE، اشتراک اینترنت گوشی از طریق USB (تترینگ RNDIS)، مودمهای USB، شبکههای VLAN و اترنت معمولی—بدون نیاز به هیچ کانفیگ اضافی کار میکند.send_method=ip_raw را در حالت فعال نشان میدهند و در صورت عدم دسترسی به مسیر خروجی، به روش لایه ۲ یعنی send_method=af_packet_fallback بازمیگردند."INTERFACE" در فایل کانفیگ، تزریق پکت را به یک رابط شبکه خاص (مانند "eth1" یا "pppoe-wan") محدود و پین کنید.INVALID شناسایی و مسدود کنند.bash
sysctl -w net.netfilter.nf_conntrack_tcp_be_liberal=1OUTPUT پکتهای حالت INVALID را بدون در نظر گرفتن تزریقهای محلی raw injector مسدود نکنند.برای بررسی قابلیتهای runtime پلتفرم: .\snispf.exe --info — این فلگ مستقل از کانفیگ است.
.\snispf.exe --config .\config.json
override یکبار مصرف فلگها (در کانفیگ ذخیره نمیشوند):
.\snispf.exe --config .\config.json --listen 0.0.0.0:40443 --connect 188.114.98.0:443 --sni auth.vercel.com --method combined
یک API کنترلی HTTP برای اپهای دسکتاپ، launcherها و اتوماسیون در معرض میگذارد.
.\snispf.exe --service --service-addr 127.0.0.1:8797
.\snispf.exe --service --service-addr 127.0.0.1:8797 --service-token your-token
آدرس پایه API: http://127.0.0.1:8797
| اندپوینت | متد | توضیح |
|---|---|---|
/v1/status |
GET | وضعیت worker، PID، زمان شروع |
/v1/start |
POST | اعتبارسنجی کانفیگ و راهاندازی worker |
/v1/stop |
POST | توقف worker |
/v1/health |
GET | TCP probe اندپوینت + شمارندههای wrong_seq |
/v1/validate |
GET | نتایج config doctor |
/v1/logs |
GET | tail لاگ (?limit=300&level=ALL) |
در صورت تنظیم token، هدر X-SNISPF-Token: <token> را با هر درخواست ارسال کنید.
ترتیب پیشنهادی عیبیابی: /v1/status ← /v1/validate ← /v1/health ← /v1/logs
مشخصات کامل درخواست/پاسخ: docs/api-contract.md
اجرای چند listener محلی در یک پروسه:
{
"BYPASS_METHOD": "wrong_seq",
"LISTENERS": [
{
"NAME": "edge-a",
"LISTEN_HOST": "127.0.0.1",
"LISTEN_PORT": 40443,
"CONNECT_IP": "104.19.229.21",
"CONNECT_PORT": 443,
"FAKE_SNI": "hcaptcha.com"
},
{
"NAME": "edge-b",
"LISTEN_HOST": "127.0.0.1",
"LISTEN_PORT": 40444,
"CONNECT_IP": "104.19.229.22",
"CONNECT_PORT": 443,
"FAKE_SNI": "hcaptcha.com",
"BYPASS_METHOD": "fragment"
}
]
}
هر listener بهطور مستقل اجرا میشود. وقتی LISTENERS تعریف شده باشد، مقادیر هر listener بر مقادیر پیشفرض سطح بالا اولویت دارند.
بستههای لینوکس شامل template سیستمد و اسکریپت نصب هستند:
sudo bash ./install_linux_service.sh install --binary ./snispf_linux_amd64 --config ./config.json
sudo bash ./install_linux_service.sh status
sudo bash ./install_linux_service.sh restart
sudo bash ./install_linux_service.sh logs --lines 120
یونیت پیشفرض مقادیر Restart=always و LimitNOFILE=65535 را تنظیم میکند.
ساخت و کپی بسته معماری مورد نظر به روتر:
powershell -ExecutionPolicy Bypass -File .\scripts\build_openwrt_matrix.ps1
scp ./release/openwrt/snispf_openwrt_x86_64_bundle.tar.gz root@192.168.1.1:/tmp/
نصب روی روتر:
ssh root@192.168.1.1
cd /tmp && tar -xzf snispf_openwrt_x86_64_bundle.tar.gz && cd snispf_openwrt_bundle
ash ./openwrt_snispf.sh install --binary ./snispf --config ./config.json
بسته شامل فایل اجرایی، openwrt_snispf.sh، و یک کانفیگ پیشفرض است.
Watchdog: بهصورت تعاملی نصب میشود (هر ۱ دقیقه). در صورت خرابی پروسه، نبود پورت listen، یا الگوهای تخریبشده در لاگ raw-injector، سرویس را ریستارت میکند. نصب اجباری یا تنظیم:
ash ./openwrt_snispf.sh watchdog-install
ash ./openwrt_snispf.sh install --binary ./snispf --config ./config.json --watchdog auto --post-restart-delay 20
عملیات مفید:
ash ./openwrt_snispf.sh status
ash ./openwrt_snispf.sh logs --follow
ash ./openwrt_snispf.sh monitor --watch 30 --interval 2
ash ./openwrt_snispf.sh doctor
برای wrong_seq روی OpenWrt:
setcap cap_net_raw+ep /path/to/snispf
توجه: اگر لاگها
socket: too many open filesنشان داد، با آخرین نسخهopenwrt_snispf.shمجدداً نصب کنید تا محدودیتnofileدر procd اعمال شود.
امکان اجرای SNISPF در Termux روی دستگاههای اندرویدی ARM64 وجود دارد. یک اسکریپت کمکی در مسیر scripts/termux.sh قرار گرفته است.
برای کاربران با دسترسی روت (توصیهشده برای استراتژی wrong_seq):
curl -s https://raw.githubusercontent.com/NaxonM/snispf-core/refs/heads/dev/scripts/termux.sh -o termux.sh && chmod +x termux.sh && bash termux.sh --install --root
برای کاربران بدون دسترسی روت:
curl -s https://raw.githubusercontent.com/NaxonM/snispf-core/refs/heads/dev/scripts/termux.sh -o termux.sh && chmod +x termux.sh && bash termux.sh --install
پس از نصب، یک دستور میانبر sni در محیط ترمینال ایجاد میشود:
sni run # شروع پروکسی (اجرا در پیشزمینه)
sni stop # توقف پروکسی
sni status # بررسی وضعیت
sni update # آپدیت فایل باینری
go build -o snispf.exe ./cmd/snispf
| هدف | دستور |
|---|---|
| Windows amd64 | powershell -ExecutionPolicy Bypass -File .\scripts\build_windows_amd64.ps1 |
| Linux amd64 (PowerShell) | powershell -ExecutionPolicy Bypass -File .\scripts\build_linux_amd64.ps1 |
| Linux amd64 (bash) | bash ./scripts/build_linux_amd64.sh |
| ماتریس release کامل | powershell -ExecutionPolicy Bypass -File .\scripts\build_release_matrix.ps1 |
| ماتریس OpenWrt (PowerShell) | powershell -ExecutionPolicy Bypass -File .\scripts\build_openwrt_matrix.ps1 |
| ماتریس OpenWrt (bash) | bash ./scripts/build_openwrt_matrix.sh |
تأیید صحت:
powershell -ExecutionPolicy Bypass -File .\scripts\verify_release.ps1
bash ./scripts/verify_release.sh
release/snispf_windows_amd64.exe، release/snispf_linux_amd64، release/snispf_linux_arm64release/snispf_*_bundle.{zip,tar.gz}release/openwrt/ — فایلهای اجرایی و بستههای per-arch، openwrt_snispf.sh، openwrt_default_config.jsonrelease/checksums.txt، release/release_manifest.jsonمعماریهای ماتریس OpenWrt: armv7، armv6، mipsle_softfloat، mips_softfloat، arm64، x86_64
Workflow: .github/workflows/release.yml
workflow_dispatch — ساختهای draft/testv1.2.3) — release کامل با checksum و manifest``` --config
$ claude mcp add snispf-core \
-- python -m otcore.mcp_server <graph>