{"id":50723255,"url":"https://github.com/sartoopjj/thescanner","last_synced_at":"2026-06-10T02:02:14.670Z","repository":{"id":360175380,"uuid":"1248978834","full_name":"sartoopjj/thescanner","owner":"sartoopjj","description":"DNS Resolver scanning tool","archived":false,"fork":false,"pushed_at":"2026-06-02T12:45:59.000Z","size":682,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-02T13:08:43.796Z","etag":null,"topics":["dns","dns-scanner","iran","resolver","scanner","tool"],"latest_commit_sha":null,"homepage":"https://t.me/networkti","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sartoopjj.png","metadata":{"files":{"readme":"README-FA.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-25T08:24:46.000Z","updated_at":"2026-06-02T12:46:06.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/sartoopjj/thescanner","commit_stats":null,"previous_names":["sartoopjj/thescanner"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/sartoopjj/thescanner","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sartoopjj%2Fthescanner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sartoopjj%2Fthescanner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sartoopjj%2Fthescanner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sartoopjj%2Fthescanner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sartoopjj","download_url":"https://codeload.github.com/sartoopjj/thescanner/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sartoopjj%2Fthescanner/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34133404,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dns","dns-scanner","iran","resolver","scanner","tool"],"created_at":"2026-06-10T02:02:13.970Z","updated_at":"2026-06-10T02:02:14.664Z","avatar_url":"https://github.com/sartoopjj.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"## thescanner — فارسی\n\nابزار اسکن ریزالورهای عمومی DNS. کلاینت اسکنر، کوئری‌های احراز‌هویت‌شده‌ی DNS را از طریق ریزالورهای عمومی به سرور مرجعی که خودتان کنترل می‌کنید می‌فرستد و گزارش می‌دهد کدام ریزالورها به‌درستی پاسخ‌ها را برمی‌گردانند.\n\nقالب روی سیم: [PROTOCOL.md](PROTOCOL.md). انگلیسی: [README.md](README.md).\n\n\u003c!-- ASCII diagram kept in English: Markdown renderers (GitHub, IDEs)\n     mangle the RTL/LTR boundaries around the Persian variant, so the\n     arrows and box edges don't line up. --\u003e\n\n```\n[scanner-client] --DNS-→ [public resolver] --recursive-→ [your scanner-server]\n       ↑                                                          │\n       └────────── authenticated response over TXT ───────────────┘\n```\n\n### نصب سرور\n\nروی یک هاست لینوکسی که رکوردهای NS یک دامنه را در اختیار دارید:\n\n```\ncurl -fsSL https://raw.githubusercontent.com/sartoopjj/thescanner/main/scripts/install.sh | sudo bash\n```\n\nنصب‌کننده دامنه‌ها، پورت‌های DNS و پنل، توکن ادمین، و گواهی/کلید TLS اختیاری را می‌پرسد. فایل `/opt/thescanner/config.json` (chmod 600) را می‌نویسد و سرویس `thescanner-server.service` را راه می‌اندازد. اجرای مجدد منوی به‌روزرسانی/ویرایش دامنه/حذف می‌دهد.\n\nبا Docker:\n\n```\ngit clone https://github.com/sartoopjj/thescanner \u0026\u0026 cd thescanner\nmkdir -p data \u0026\u0026 $EDITOR data/config.json    # نمونه: docs/config.sample.json\ndocker compose up -d\n```\n\nاگر `systemd-resolved` پورت ۵۳ را گرفته، ریدایرکت کنید:\n\n```bash\nIFACE=eth0\nsudo iptables -t nat -I PREROUTING -i \"$IFACE\" -p udp --dport 53 -j REDIRECT --to-ports 5300\nsudo iptables -t nat -I PREROUTING -i \"$IFACE\" -p tcp --dport 53 -j REDIRECT --to-ports 5300\nsudo iptables -I INPUT -p udp --dport 5300 -j ACCEPT\nsudo iptables -I INPUT -p tcp --dport 5300 -j ACCEPT\n```\n\n### نصب کلاینت\n\nباینری مناسب سیستم‌عامل‌تان را از آخرین ریلیز بگیرید و `./thescanner-client` را اجرا کنید. رابط کاربری روی `http://127.0.0.1:8080` باز می‌شود. لیست ریزالور (یک IP یا CIDR در هر خط) بدهید، سرور را انتخاب کنید (یا یک URI با شکل `thescanner://server?...` ایمپورت کنید) و Start را بزنید. کانفیگ از طریق UI مدیریت می‌شود — دستی ویرایش نکنید.\n\n### حالت‌های اسکن\n\n- **اسکن سطحی**: عبور سریع از کل لیست با ریترای و گسترش اختیاری /24 برای IPهای OK.\n- **اسکن عمیق**: هر کاندید را چند بار آزمایش می‌کند تا نرخ موفقیت، p95 RTT و امتیاز ترکیبی محاسبه شود. هم روی نتایج OK اسکن سطحی، هم مستقیماً روی لیست دستیِ مورد اعتمادتان قابل اجراست.\n\nهر اسکن به‌صورت یک لیست جدا در `\u003cdata-dir\u003e/lists/` ذخیره می‌شود. باز کردن، تغییر نام، اسکن مجدد، اسکن عمیق و حذف انبوه از تب **Lists**.\n\n### پنل مدیریت\n\n`http(s)://\u003chost\u003e:8053/\u003cadmin_path\u003e/` — با توکن ادمین از `config.json` وارد شوید. `admin_path` یک پیشوند URL تصادفی ۱۲۸ بیتی به‌ازای هر نصب است؛ هر درخواستی که با آن شروع نشود یک ۴۰۴ خشک می‌گیرد (بدون بدنه، بدون بنر). صفحه‌ی ورود هیچ نشانی از نام محصول ندارد، پس پراب روی `/admin`, `/healthz`, `/login` و … چیزی بیرون نمی‌دهد.\n\nداخل پنل: شمارنده‌ها به‌ازای هر توکن، URIهای اشتراک، و ویرایشگر آدرس‌های Listen، گواهی/کلید TLS، دامنه‌ها و توکن‌ها. ذخیره‌سازی اتمیک است (`.tmp` + rename + chmod 600). برای اعمال تغییر توکن‌ها/دامنه‌ها سرور را ری‌استارت کنید.\n\n### TLS\n\nمقدارهای `server.tls_cert` و `server.tls_key` (مسیر PEM) را ست کنید — یا با فلگ‌های `-tls-cert / -tls-key` — تا پنل روی HTTPS اجرا شود. هر دو باید با هم باشند. نصب‌کننده هم می‌پرسد.\n\n### امنیت\n\n- مجموع آنتروپی ≈ ۲۵۶ بیت (پیشوند رندوم پنل + توکن ادمین) — بدون نیاز به Rate Limit.\n- مقایسه‌ی توکن در زمان ثابت. توکن اشتباه → همان ۴۰۴ خشک URL اشتباه.\n- هدرهای دفاعی: `X-Frame-Options: DENY`، CSP سخت‌گیر با `frame-ancestors 'none'`، `nosniff`، `Cache-Control: no-store`.\n- POST روی `\u003cpanel\u003e/config` به ۲۵۶ KiB محدود است. تایم‌اوت‌های HTTP: 5s/30s/30s/120s.\n- WebView (اندروید و iOS) ناوبری به هر مبدأی غیر از Loopback را رد می‌کند.\n- برای دسترسی غیر-localhost حتماً HTTPS بزنید. بعد از ذخیره‌ی URL، خط ورود به ژورنال systemd را پاک کنید. `config.json` و URIهای `thescanner://` را به‌عنوان راز نگه دارید.\n\n### تفاوت توکن ادمین و توکن اشتراکی\n\n- **`server.admin_token`**: رمز ورود به پنل.\n- **`tokens[].secret`**: کلیدی که کلاینت‌ها برای امضای کوئری DNS استفاده می‌کنند. توزیع از طریق URIهای `thescanner://server?...` که پنل تولید می‌کند.\n\nاین دو یکی نیستند. در `make run-server`، فایل کانفیگ توسعه با `admin_token: \"adminpass\"` (رمز پنل) و یک توکن `dev` با سکرت `\"clientkey\"` (کلید امضای کلاینت) ساخته می‌شود.\n\n### ساخت از سورس\n\n```\nmake test                # تست‌های واحد با -race\nmake server / make client\nmake build-all           # کراس‌کامپایل لینوکس/مک/فری‌بی‌اس‌دی/ویندوز + اندروید\nmake gomobile-aar android   # AAR + APK امضاشده\nmake ios-bind ios-build     # iOS با gomobile + xcodebuild\nmake mac-dmg                # دی‌ام‌جی یونیورسال Intel + Apple Silicon\n```\n\n### فلگ‌های CLI\n\nسرور:\n\n```\nthescanner-server \\\n  -config /opt/thescanner/config.json  -data-dir /opt/thescanner/data \\\n  -listen 0.0.0.0:5300                 -stats-listen 0.0.0.0:8053 \\\n  -admin-token XXXX                    -admin-path  abcdef0123456789 \\\n  -tls-cert /etc/.../fullchain.pem     -tls-key  /etc/.../privkey.pem \\\n  -domain v.example.com,x.example.com  -token-name alice -token-secret SECRET\n```\n\nکلاینت:\n\n```\nthescanner-client -data-dir ~/.config/thescanner -listen 127.0.0.1:8080 -no-browser\n```\n\n### تست‌ها\n\n```\nmake test    # کل تست‌ها با -race\nmake lint    # vet + gofmt + golangci-lint (در صورت نصب)\n```\n\n### خارج از محدوده‌ی v1\n\nکدینگ NULL-record، DoH/DoT، ریزالورهای IPv6، ARQ بین کوئری‌ها. به PROTOCOL.md §۱۱ مراجعه کنید.\n\n### مجوز\n\nMIT — به فایل [LICENSE](LICENSE) مراجعه کنید.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsartoopjj%2Fthescanner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsartoopjj%2Fthescanner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsartoopjj%2Fthescanner/lists"}