range-scout is a small TUI for:
- loading announced IPv4 prefixes for supported Iranian operators
- importing IPv4 CIDRs or single IPv4 addresses from a local
.txtfile - pasting IPv4 CIDRs or single IPv4 addresses directly into the TUI
- choosing one or more ranges to scan
- running a SlipNet-style UDP DNS compatibility scan on a configurable port
- opening a dedicated DNSTT stage after the scan for tunnel-only or end-to-end checks
- exporting targets, scan results, or DNSTT-passed results on demand as
txt,csv, orjson - saving startup defaults to
config.json
- Loads IPv4 scan targets for a selected operator, from a local
.txtfile, or from pasted text. - Lets you choose one or more CIDR ranges or single IPs from that loaded target set.
- Scans hosts in those ranges over UDP on a configurable port (default
53). - Runs the same six SlipNet-style compatibility probes used by the app’s tunnel scoring flow and assigns each resolver a score from
0to6. - Treats resolvers at or above the configured score threshold as DNSTT candidates.
- Opens a dedicated DNSTT screen after the scan where you can:
- leave
DNSTT Pubkeyempty for tunnel-only validation - set
DNSTT Pubkeyfor full embedded DNSTT E2E validation - optionally set
SOCKS UsernameandSOCKS Passwordif the remote SOCKS service requires authentication - optionally enable
Test Nearby IPsto fan out one extra DNSTT pass across the rest of a successful resolver’s/24
- leave
- Exports targets, scan successes, DNSTT-passed resolvers, and paired failure files when those stages complete.
The repo pins the Go toolchain to 1.24.1 for reproducible builds. If your
local go command is older, Go will auto-download the pinned toolchain when
needed.
make buildThis builds a local development binary at ./range-scout.
To produce a distributable artifact for the current platform:
make build-distTo produce a Windows tester build:
make build-windowsThat writes dist/range-scout-windows-amd64.exe.
To build the full default cross-platform matrix:
make build-allThat writes separate artifacts to dist/ for:
darwin/amd64darwin/arm64linux/amd64linux/arm64windows/amd64windows/arm64
You can override the matrix if needed:
make build-all BUILD_OSES="linux windows" BUILD_ARCHES="amd64"The git tag is the release source of truth. This matches a normal GitFlow process:
- tag
v0.7.0for a final release - tag
v0.7.0-rcNfor a release candidate
To build a release artifact from the current tag:
make releaseTo build a Windows release artifact from the current tag:
make release-windowsTo build release artifacts for the full default matrix from the current tag:
make release-allRelease builds are intentionally strict:
HEADmust be exactly on a tag such asv0.7.0orv0.7.0-rcN- the git worktree must be clean
If those checks pass, the artifact filename will match the release tag exactly.
The in-app version shown in the header is a manual constant in
ui.go (uiVersionLabel). Update that value before tagging a new release so
bug reports and release artifacts stay aligned.
./range-scoutFor a one-off run without building:
make runYou can place an optional config.json next to the project and range-scout
will load it on startup. The app first looks in the current working directory.
If there is no config there, it also checks next to the range-scout binary.
Example:
{
"importConfig": {
"importFilePaths": {}
},
"scanConfig": {
"workers": "256",
"timeoutMS": "15000",
"port": "53"
},
"dnsttConfig": {
"domain": "t.example.com",
"pubkey": "",
"timeoutMS": "15000",
"e2eTimeoutS": "20",
"querySize": "",
"scoreThreshold": "2",
"e2eURL": "http://www.gstatic.com/generate_204",
"testNearbyIPs": "No",
"socksUsername": "",
"socksPassword": ""
}
}Notes:
importFilePathsmay be a single string or an object map.- The app writes UI field values back as strings when you use
Save Config. socksUsernameandsocksPasswordare optional. A SOCKS password without a username is invalid for DNSTT E2E.Save Configcurrently writesworkers,timeoutMS,port, andprotocolinscanConfig, plusdomain,pubkey,timeoutMS,e2eTimeoutS,querySize,scoreThreshold,e2eURL,testNearbyIPs,socksUsername, andsocksPasswordindnsttConfig.recursionHost,probeHost1,probeHost2, ande2ePortare treated as legacy compatibility keys. Older configs can still be loaded with them, but current saves no longer write them back out.- Use
"default"to provide a fallback import path for any operator. - Relative import paths are resolved relative to the
config.jsondirectory. Save Configkeeps import paths relative to the config file when possible, so shared configs stay portable.- The config file sets startup defaults; it does not auto-run imports, scans, or DNSTT.
- Ask bug reporters to include the version shown in the header, for example
v0.7.0.
- Select an operator from the left sidebar if you want
Automatic API Fetch. If you want to work manually, you can leave the operator unselected. - Choose
Automatic API Fetch,Import TXT, orPaste TargetsinLoad From. Without an operator, onlyImport TXTandPaste Targetsare available. - Click
Load Targetsto load operator prefixes, setImport Fileand clickImport TXT, or clickPaste Targetsand paste directly into the modal. - Click
Scan Setup. - Click
Pick Targets, use the filter box if needed, and choose one or more CIDRs or single IPs. New target sets start with all targets selected, and the picker hasSelect All/Deselect Allactions. - Set
Workers,Timeout,Port,Protocol,DNSTT Domain,Query Size, andScore Threshold.Protocolcan beUDP,TCP, orBOTH. - Click
Start Scan. - Review the cached scan state in the details pane. If the app detected a transparent DNS proxy during the scan, it will warn you there.
- Click
Test DNSTTafter the scan to open the dedicated DNSTT setup screen. The staged flow isLoad Targets -> DNS Scan -> DNSTT E2E. - On the DNSTT screen:
- leave
DNSTT Pubkeyempty for tunnel-only validation - set
DNSTT Pubkeyfor full end-to-end validation - leave
Query Sizeempty unless you specifically want smaller embedded DNSTT queries - keep
E2E URLathttp://www.gstatic.com/generate_204unless you need a different HTTP or HTTPS probe - set
SOCKS UsernameandSOCKS Passwordonly when the remote SOCKS service requires authentication - enable
Test Nearby IPsif you want successful original IPv4 resolvers to trigger one extra/24DNSTT sweep
- leave
- Click
Start DNSTT. - Use
Exporton the scanner screen to save scan-stage successes, and useExport Passedon the DNSTT screen to save only DNSTT-passed resolvers plus a paired checked-failures file. - Use
Copy Passedon the DNSTT screen if you want the passed resolver IPs in the clipboard without writing a file. - Use
Save Configwhenever you want the current startup defaults written back toconfig.json.
range-scout is mainly a tool for finding IPv4 resolvers from operator ranges or custom target sets, then pushing only the best candidates through a second-stage DNSTT validation flow.
How it works:
- The app loads public IPv4 ranges for the selected operator, imports IPv4 CIDRs / single IPv4s from a local
.txtfile, or accepts pasted IPv4 CIDRs / single IPv4s. - You choose one or more CIDR ranges or imported / pasted single IPs that you want to scan.
- The scanner probes each host in those ranges over the selected DNS transport on the port you choose.
- If a host answers DNS, the app records it and runs the six SlipNet-style compatibility probes that feed the tunnel score.
- The app treats resolvers at or above the current score threshold as DNSTT candidates.
- If you want, the app can then test only those qualified resolvers against your DNSTT domain.
- You can export scan-stage or DNSTT-stage outputs after the relevant stage finishes.
What to do:
- Choose
Automatic API Fetchif you want to load operator prefixes from a selected operator. If no operator is selected, useImport TXTorPaste Targets. - For file import or pasted text, put one IPv4 CIDR or IPv4 address on each line. Empty lines and
#comments are ignored. - Load the targets first.
- Use
Pick Targetsto limit the scan to the CIDRs or single IPs you want. All loaded targets start selected by default, and you can useSelect All/Deselect Allin the picker. The scan automatically covers all scannable hosts in the selected targets, so there is no separate host-limit field to tune. - Keep port
53unless you specifically need another DNS port. - Set
DNSTT Domainbefore the scan so the compatibility probes and tunnel-score workflow use the right domain. - Leave
Query Sizeempty or0unless you specifically want smaller DNSTT queries. - Set
Score Thresholdto control how strict the scan should be before a resolver qualifies for the DNSTT stage. - Run the scan first, then use
Test DNSTTto open the dedicated DNSTT screen and start the DNSTT stage there. - Leave
DNSTT Pubkeyempty if you only want the tunnel precheck. SetDNSTT Pubkeyif you want a full end-to-end DNSTT check. E2E URLis fetched through the local SOCKS5 proxy after the embedded DNSTT runtime starts. The request must return an HTTP status in the2xxor3xxrange to pass.- If the remote SOCKS service requires authentication, fill in
SOCKS UsernameandSOCKS Passwordon the DNSTT screen. - Enable
Test Nearby IPsif you want each successful original IPv4 seed to trigger one extra DNSTT run across the rest of its/24. Nearby-discovered IPs do not expand again. - Export the results you want to keep. Export filenames are stage-specific:
cidr-<label>,dns-scan-success-<label>,dns-scan-failures-<label>, anddnstt-scan-success-<label>.
Important:
- This tool helps you get available IPs and candidate DNS resolvers.
- DNSTT checks only run against resolvers that meet the current SlipNet compatibility score threshold from the latest scan.
- End-to-end DNSTT validation now uses an embedded runtime inside
range-scout; no separatednstt-clientbinary is required. - The e2e check follows SlipNet's HTTP-style verification. After the embedded DNSTT runtime starts a local SOCKS5 proxy, the app fetches
E2E URLthrough that proxy and treats HTTP2xxor3xxas success. - Authenticated SOCKS5 E2E checks are supported through the optional
SOCKS UsernameandSOCKS Passwordfields. Export Passedon the DNSTT screen writes both the passed resolver file and a paired checked-failures file. Scanner-stage failure export only happens when the full selected target set finished scanning.- A positive result here still does not guarantee that every real-world client or route will behave the same way on your network.
p: target viewd: scan setupf: load from the selected sources: save or export current datag: start scant: start DNSTT test from the latest scanx: stop the active scan or DNSTT taskTab/Shift+Tab: move focusEsc: leave an input fieldq: exit
- IPv4 only
- Operator definitions are compiled into the app
- Files are saved only on demand
- The TUI scanner supports
UDP,TCP, andBOTHcompatibility probes and defaults to port53 - DNSTT testing is a second-stage check over score-qualified resolvers, not a raw host scan
- Leave
DNSTT Pubkeyempty if you only want the tunnel precheck Test Nearby IPsexpands only one extra/24pass from successful original IPv4 seedsSave Configupdates startup defaults only; it does not start jobs automatically
range-scout در اصل ابزاری برای پیدا کردن resolverهای IPv4 از رنج اپراتورها یا تارگتهای دستی است و بعد resolverهای بهتر را وارد مرحله جداگانه DNSTT میکند.
نحوه کار:
- برنامه میتواند تارگتها را با
Automatic API Fetchبگیرد، ازImport TXTبخواند، یا باPaste Targetsمستقیم از داخل TUI دریافت کند. اگر اپراتوری انتخاب نشده باشد، فقطImport TXTوPaste Targetsدر دسترس هستند. - شما یک یا چند رنج CIDR یا IP تکی را برای اسکن انتخاب میکنید.
- اسکنر هر هاست را با پروتکل انتخابی
UDPیاTCPیاBOTHروی پورتی که مشخص میکنید بررسی میکند. - اگر یک هاست به DNS پاسخ بدهد، شش probe به سبک SlipNet روی آن اجرا میشود و یک tunnel score از
0تا6میگیرد. - فقط resolverهایی که به
Score Thresholdبرسند وارد مرحلهDNSTTمیشوند. - بعد از اسکن، یک صفحه جداگانه برای
DNSTTباز میشود که در آن میتوانید tunnel-only یا تست کامل end-to-end اجرا کنید. - بعد از تمام شدن هر مرحله میتوانید خروجی همان مرحله را بگیرید.
چه کاری انجام بدهید:
- ابتدا یکی از سه روش
Automatic API FetchیاImport TXTیاPaste Targetsرا انتخاب کنید. اگر اپراتوری انتخاب نشده باشد، فقطImport TXTوPaste Targetsدر دسترس هستند. - اگر از فایل یا paste استفاده میکنید، در هر خط فقط یک
IPv4 CIDRیاIPv4تکی قرار دهید. خط خالی و#نادیده گرفته میشود. - با
Pick Targetsفقط تارگتهایی را انتخاب کنید که واقعا میخواهید اسکن شوند. به صورت پیشفرض همه تارگتهای لودشده انتخاب میشوند و داخل پنجره انتخاب هم گزینهSelect AllوDeselect Allدارید. برنامه به صورت خودکار همه هاستهای قابل اسکن داخل همان انتخاب را بررسی میکند و دیگر فیلد جداگانهای برای host limit ندارد. - اگر نیاز خاصی ندارید، پورت را روی
53نگه دارید. - در مرحله اسکن میتوانید
UDPیاTCPیاBOTHرا انتخاب کنید و فیلدDNSTT Domainاز همان مرحله روی tunnel score اثر دارد، پس قبل از اسکن آن را درست تنظیم کنید. - فیلد
Query Sizeرا خالی بگذارید مگر این که بخواهید اندازه payload پرسوجوهای DNSTT را کمتر کنید. - با
Score Thresholdمشخص میکنید چه resolverهایی برای مرحلهDNSTTبه اندازه کافی خوب محسوب شوند. - اول اسکن را اجرا کنید، بعد
Test DNSTTرا بزنید تا وارد صفحه جداگانهDNSTTشوید. - اگر فقط precheck میخواهید،
DNSTT Pubkeyرا خالی بگذارید. اگر تست کامل end-to-end میخواهید،DNSTT Pubkeyرا هم وارد کنید. - فیلد
E2E URLمشخص میکند بعد از بالا آمدن پراکسیSOCKS5محلی، چه آدرسHTTP/HTTPSاز داخل تانل درخواست شود. مقدار پیشفرضhttp://www.gstatic.com/generate_204است. - اگر SOCKS5 سمت سرور نیاز به احراز هویت دارد،
SOCKS UsernameوSOCKS Passwordرا در صفحهDNSTTوارد کنید. - اگر
Test Nearby IPsرا رویYesبگذارید، هر IPv4 موفق اصلی یک بار دیگر بقیه IPهای همان/24را برای DNSTT امتحان میکند. IPهایی که از nearby پیدا میشوند دوباره expand نمیشوند. - روی صفحه اسکن از
Exportو روی صفحه DNSTT ازExport PassedیاCopy Passedاستفاده کنید. - اگر میخواهید همین تنظیمات دفعه بعد هم لود شوند،
Save Configرا بزنید.
نکته مهم:
- این ابزار برای پیدا کردن IPهای در دسترس و resolverهای کاندید است.
- تست
DNSTTفقط روی resolverهایی اجرا میشود که در اسکن قبلی بهScore Thresholdرسیده باشند، نه روی همه هاستها. - برای تست کامل end-to-end دیگر به باینری جداگانه
dnstt-clientنیاز نیست و runtime بهصورت embedded داخل برنامه اجرا میشود. - تست end-to-end حالا مثل SlipNet با یک درخواست
HTTP/HTTPSاز داخل پراکسیSOCKS5محلی انجام میشود و پاسخ موفق یعنی کد وضعیت2xxیا3xxازE2E URLبرگشته باشد. - اگر سرویس SOCKS5 مقصد نیاز به username/password داشته باشد، برنامه از فیلدهای
SOCKS UsernameوSOCKS Passwordبرای handshake استفاده میکند. - در صفحه
DNSTT، گزینهExport Passedعلاوه بر فایل resolverهای موفق، یک فایل failure برای resolverهای checked-but-failed هم میسازد. - مثبت بودن نتیجه در این برنامه باز هم تضمین کامل برای همه مسیرهای واقعی شبکه شما نیست.
