MCPcopy Index your code
hub / github.com/NaxonM/snispf-core

github.com/NaxonM/snispf-core @v0.1.8

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.1.8 ↗ · + Follow
218 symbols 541 edges 33 files 34 documented · 16%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

SNISPF Core

هسته‌ی دور زدن 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 است.


شروع سریع

۱. ساخت (Build)

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 بدون دسترسی خاص ترمینال privilegedroot یا CAP_NET_RAW
Windows عادی ترمینال Administrator + WinDivert.dll + WinDivert64.sys در همان پوشه‌ی فایل اجرایی
OpenWrt عادی PrivilegedCAP_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 استفاده کنید.

سازگاری جهانی با انواع شبکه (WAN) و تاب‌آوری بالا (wrong_seq)

  • پشتیبانی جهانی از انواع WAN (لینوکس / OpenWrt): هسته‌ی SNISPF اکنون از سوکت خام لایه ۳ (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 بازمی‌گردند.
  • در محیط‌های مسیریابی پیچیده (مانند multi-WAN یا mwan3)، می‌توانید با استفاده از فیلد "INTERFACE" در فایل کانفیگ، تزریق پکت را به یک رابط شبکه خاص (مانند "eth1" یا "pppoe-wan") محدود و پین کنید.
  • تاب‌آوری در تغییر پویا آی‌پی و سوئیچ VPN (ویندوز): در ویندوز، ابزار WinDivert اکنون به‌طور دوره‌ای آی‌پی محلی (Source IP) فعال را به سمت مقصد نهایی مجدداً شناسایی می‌کند و از فیلترینگ سمت کاربر استفاده می‌نماید. این تغییر به برنامه اجازه می‌دهد بدون قطع اتصالات جاری، با تغییرات پویای DHCP، سوئیچ بین کارت‌های شبکه و خاموش/روشن شدن VPN سازگار شود.
  • عیب‌یابی افت پکت توسط فایروال یا روتر: روترها یا فایروال‌هایی که ویژگی Connection Tracking (یا conntrack) را به‌طور سخت‌گیرانه‌ای اعمال می‌کنند ممکن است پکت‌های توالی جعلی را به عنوان INVALID شناسایی و مسدود کنند.
  • برای جلوگیری از حذف فریم‌های خارج از پنجره TCP توسط netfilter conntrack، حالت لیبرال را فعال کنید: bash sysctl -w net.netfilter.nf_conntrack_tcp_be_liberal=1
  • مطمئن شوید قوانین فایروال در زنجیره OUTPUT پکت‌های حالت INVALID را بدون در نظر گرفتن تزریق‌های محلی raw injector مسدود نکنند.

برای بررسی قابلیت‌های runtime پلتفرم: .\snispf.exe --info — این فلگ مستقل از کانفیگ است.


حالت‌های اجرا

حالت مستقیم (Direct mode)

.\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

حالت Service API

یک 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

اجرای چند 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 را تنظیم می‌کند.


استقرار روی OpenWrt

ساخت و کپی بسته معماری مورد نظر به روتر:

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 اعمال شود.


استقرار روی Termux (اندروید)

امکان اجرای 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

اسکریپت‌های cross-build

هدف دستور
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

  • فایل‌های اجرایی: release/snispf_windows_amd64.exe، release/snispf_linux_amd64، release/snispf_linux_arm64
  • بسته‌ها: release/snispf_*_bundle.{zip,tar.gz}
  • OpenWrt: release/openwrt/ — فایل‌های اجرایی و بسته‌های per-arch، openwrt_snispf.sh، openwrt_default_config.json
  • متادیتا: release/checksums.txt، release/release_manifest.json

معماری‌های ماتریس OpenWrt: armv7، armv6، mipsle_softfloat، mips_softfloat، arm64، x86_64

GitHub Actions

Workflow: .github/workflows/release.yml

  • workflow_dispatch — ساخت‌های draft/test
  • Push tag (مثلاً v1.2.3) — release کامل با checksum و manifest

مرجع CLI

``` --config

Extension points exported contracts — how you extend this code

InterfaceNameSetter (Interface)
InterfaceNameSetter is optionally implemented by platform injectors that support pinning the capture/send path to a spec [3 …
internal/rawinjector/interface.go
Strategy (Interface)
(no doc) [4 implementers]
internal/bypass/strategy.go
DetailedWaiter (Interface)
(no doc) [3 implementers]
internal/rawinjector/interface.go
Interface (Interface)
(no doc) [3 implementers]
internal/rawinjector/interface.go
PortStateDebugger (Interface)
(no doc) [1 implementers]
internal/rawinjector/interface.go

Core symbols most depended-on inside this repo

Warnf
called by 36
internal/logx/logx.go
writeJSON
called by 18
internal/service/service.go
setRawDiagnostic
called by 14
internal/rawinjector/diagnostics.go
Infof
called by 13
internal/logx/logx.go
BuildClientHello
called by 12
internal/tlsutil/builder.go
mustHex
called by 10
internal/tlsutil/builder.go
equal4
called by 10
internal/rawinjector/rawinjector_common.go
Stop
called by 9
internal/rawinjector/interface.go

Shape

Function 110
Method 77
Struct 23
Interface 5
TypeAlias 3

Languages

Go100%

Modules by API surface

internal/rawinjector/rawinjector_linux.go30 symbols
internal/rawinjector/rawinjector_windows.go25 symbols
internal/service/service.go22 symbols
internal/rawinjector/interface.go14 symbols
internal/logx/logx.go12 symbols
internal/rawinjector/rawinjector_stub.go10 symbols
cmd/snispf/main.go10 symbols
internal/tlsutil/builder.go9 symbols
internal/forwarder/server.go8 symbols
internal/tlsutil/fragment.go6 symbols
internal/rawinjector/rawinjector_common.go6 symbols
internal/bypass/fake_sni.go6 symbols

For agents

$ claude mcp add snispf-core \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact