Skip to content

Commit 18809bf

Browse files
committed
Add embedded Iranian resolver data and two-mode local command
Embed 7,854 known local DNS resolvers and 1,919 CIDR ranges directly in the binary so it works offline (GitHub is blocked in Iran). - `findns local -o file.txt` exports pre-verified resolvers (default) - `findns local -o file.txt --discover` scans Iran's full IP space - Discovery supports --sample, --batch/--offset, --full sub-modes - `fetch --local` now uses known resolvers instead of CIDR candidates - Updated all docs (README, GUIDE, guide-fa, guide-telegraph)
1 parent ee8e4f4 commit 18809bf

9 files changed

Lines changed: 10995 additions & 16 deletions

File tree

GUIDE.md

Lines changed: 133 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ findns fetch -o resolvers.txt
212212

213213
این دستور از منبع trickest/resolvers حدود **17,000+** آی‌پی resolver عمومی را دانلود می‌کند.
214214

215-
### دانلود با resolverهای ایران (محلی)
215+
### دانلود با resolverهای ایرانی (--local)
216216

217217
</div>
218218

@@ -222,10 +222,14 @@ findns fetch -o resolvers.txt --local
222222

223223
<div dir="rtl">
224224

225-
این دستور علاوه بر resolverهای جهانی، **7,800+** آی‌پی resolver ایرانی/منطقه‌ای از ir-resolvers را هم اضافه می‌کند. مجموعاً حدود **25,000+** resolver.
225+
این دستور علاوه بر resolverهای جهانی، **7,800+ resolver شناخته‌شده ایرانی** را هم به لیست اضافه می‌کند. این resolverها از قبل تأیید شده‌اند (منبع: ir-resolvers) و نرخ موفقیت بالایی در اسکن دارند.
226+
227+
> **نکته مهم:** فلگ `--local` به هیچ سرور خارجی وصل نمی‌شود. لیست resolverهای ایرانی **داخل خود برنامه** ذخیره شده‌اند (embedded). حتی اگر GitHub فیلتر باشد، این فلگ کار می‌کند.
226228
227229
> **چرا resolverهای ایرانی مهم هستند؟** در شبکه ایران، resolverهای داخلی معمولاً سریع‌تر جواب می‌دهند و ممکن است محدودیت کمتری داشته باشند.
228230
231+
> **برای پیدا کردن resolverهای جدید** که در لیست شناخته‌شده نیستند، از دستور [`findns local --discover`](#دستور-local---resolverهای-ایرانی-داخلی) استفاده کنید.
232+
229233
### دانلود resolverهای DoH
230234

231235
</div>
@@ -242,6 +246,133 @@ findns fetch -o doh-resolvers.txt --doh
242246
243247
---
244248

249+
## دستور local - resolverهای ایرانی داخلی
250+
251+
دستور `local` داده‌های ایرانی **داخل خود برنامه** را خروجی می‌دهد — نیازی به اینترنت ندارد. دو حالت دارد:
252+
253+
### حالت 1: resolverهای شناخته‌شده (پیش‌فرض — پیشنهادی)
254+
255+
بدون هیچ فلگ اضافه، **7,800+ resolver ایرانی از قبل تأیید‌شده** را خروجی می‌دهد (منبع: ir-resolvers). این resolverها قبلاً بررسی شده‌اند و نرخ موفقیت بالایی دارند.
256+
257+
</div>
258+
259+
```bash
260+
# خروجی resolverهای شناخته‌شده (پیشنهادی — سریع‌ترین راه)
261+
findns local -o resolvers.txt
262+
263+
# اسکن کنید:
264+
findns scan -i resolvers.txt -o results.json --domain t.mysite.com
265+
```
266+
267+
<div dir="rtl">
268+
269+
> **این بهترین نقطه شروع است.** چون این آی‌پی‌ها واقعاً DNS resolver هستند، اکثرشان در اسکن پاس می‌شوند.
270+
271+
### حالت 2: کشف resolver جدید (--discover)
272+
273+
اگر می‌خواهید resolverهایی پیدا کنید که در لیست شناخته‌شده **نیستند**، از `--discover` استفاده کنید. این حالت از **1,919 رنج CIDR ایرانی** (منبع: RIPE NCC، ~10.8 میلیون آی‌پی) استفاده می‌کند.
274+
275+
> **مهم:** این آی‌پی‌ها **resolver نیستند!** فقط کاندید هستند. اکثرشان DNS server نیستند و در اسکن فیل می‌شوند. این حالت برای **کشف** resolverهای جدید است.
276+
277+
#### نمونه‌گیری — Sample (پیش‌فرض discover)
278+
279+
از هر subnet تعدادی آی‌پی **تصادفی** انتخاب می‌کند. سریع است و پوشش خوبی می‌دهد.
280+
281+
</div>
282+
283+
```bash
284+
# پیش‌فرض: 10 آی‌پی تصادفی از هر subnet (~19,000 آی‌پی)
285+
findns local -o candidates.txt --discover
286+
287+
# 5 آی‌پی از هر subnet (سریع‌تر، ~9,500 آی‌پی)
288+
findns local -o candidates.txt --discover --sample 5
289+
290+
# 50 آی‌پی از هر subnet (کندتر، ~95,000 آی‌پی)
291+
findns local -o candidates.txt --discover --sample 50
292+
293+
# بعد از تولید لیست، اسکن کنید:
294+
findns scan -i candidates.txt -o results.json --domain t.mysite.com
295+
```
296+
297+
<div dir="rtl">
298+
299+
#### دسته‌ای — Batch (اسکن تدریجی)
300+
301+
اگر می‌خواهید **همه** آی‌پی‌ها را اسکن کنید ولی یکجا نه — مثلاً هر بار 1 میلیون آی‌پی — از batch استفاده کنید.
302+
303+
**هر دسته رنج متفاوتی دارد و هیچ آی‌پی تکراری بین دسته‌ها وجود ندارد.** برنامه بعد از هر دسته دقیقاً می‌گوید دستور بعدی چیست.
304+
305+
</div>
306+
307+
```bash
308+
# دسته اول: آی‌پی شماره 1 تا 1,000,000
309+
findns local -o batch1.txt --discover --batch 1000000
310+
311+
# برنامه در خروجی می‌گوید:
312+
# next batch command:
313+
# findns local -o <next-file>.txt --discover --batch 1000000 --offset 1000000
314+
# remaining: 9,815,490 IPs
315+
316+
# دسته دوم: آی‌پی شماره 1,000,001 تا 2,000,000
317+
findns local -o batch2.txt --discover --batch 1000000 --offset 1000000
318+
319+
# هر دسته را جداگانه اسکن کنید:
320+
findns scan -i batch1.txt -o results1.json --domain t.mysite.com
321+
findns scan -i batch2.txt -o results2.json --domain t.mysite.com
322+
```
323+
324+
<div dir="rtl">
325+
326+
> **نکته:** هر دسته آی‌پی‌های **جدید و متفاوت** تولید می‌کند. لازم نیست نگران اسکن مجدد باشید — `--offset` تضمین می‌کند هیچ آی‌پی دو بار اسکن نشود.
327+
328+
#### حالت کامل — Full
329+
330+
تمام ~10.8 میلیون آی‌پی ایرانی را یکجا خروجی می‌دهد.
331+
332+
</div>
333+
334+
```bash
335+
findns local -o all-iran.txt --discover --full
336+
```
337+
338+
<div dir="rtl">
339+
340+
> **هشدار:** اسکن 10.8 میلیون آی‌پی **روزها** طول می‌کشد! پیشنهاد: به جای `--full` از `--batch 1000000` استفاده کنید.
341+
342+
#### نمایش رنج‌ها (بدون تولید فایل)
343+
344+
فقط لیست رنج‌های CIDR را ببینید. نیازی به `-o` ندارد:
345+
346+
</div>
347+
348+
```bash
349+
findns local --list-ranges
350+
```
351+
352+
<div dir="rtl">
353+
354+
### توضیح فلگ‌ها
355+
356+
| فلگ | توضیح | پیش‌فرض |
357+
|-----|-------|---------|
358+
| `-o, --output` | مسیر فایل خروجی برای لیست آی‌پی‌ها. در تمام حالت‌ها **الزامی** است به جز `--list-ranges`. ||
359+
| `--discover` | حالت کشف resolver جدید. بدون این فلگ، resolverهای شناخته‌شده خروجی داده می‌شوند. | `false` |
360+
| `--sample N` | **[discover]** از هر subnet چند آی‌پی تصادفی انتخاب شود. عدد بزرگ‌تر = پوشش بیشتر ولی اسکن کندتر. عدد `0` مثل `--full` عمل می‌کند. | `10` |
361+
| `--full` | **[discover]** تمام ~10.8 میلیون آی‌پی را خروجی بده. این فلگ `--sample` را نادیده می‌گیرد. | `false` |
362+
| `--batch N` | **[discover]** دقیقاً N آی‌پی خروجی بده. هر بار اجرا با `--offset` متفاوت، رنج جدیدی می‌دهد. هیچ آی‌پی تکراری نیست. | `0` (غیرفعال) |
363+
| `--offset N` | **[discover]** با `--batch` استفاده می‌شود. از آی‌پی شماره N شروع کن (0-indexed). برنامه بعد از هر دسته `--offset` بعدی را نشان می‌دهد. | `0` |
364+
| `--list-ranges` | فقط لیست رنج‌های CIDR ایرانی را چاپ کن و خارج شو. نیازی به `-o` ندارد. | `false` |
365+
366+
### اولویت فلگ‌ها
367+
368+
- بدون `--discover` → resolverهای شناخته‌شده (7,800+)
369+
- اگر `--list-ranges` داده شود → فقط رنج‌ها چاپ می‌شود، بقیه فلگ‌ها نادیده گرفته می‌شوند
370+
- اگر `--discover --batch` > 0 باشد → حالت دسته‌ای فعال می‌شود (`--sample` و `--full` نادیده گرفته می‌شوند)
371+
- اگر `--discover --full` داده شود → تمام آی‌پی‌ها (`--sample` نادیده گرفته می‌شود)
372+
- اگر `--discover` بدون فلگ دیگر → حالت نمونه‌گیری با `--sample N`
373+
374+
---
375+
245376
## 4. اسکن کامل (scan) - دستور اصلی
246377

247378
دستور scan مهم‌ترین و پیشنهادی‌ترین دستور است. تمام مراحل تست را به ترتیب اجرا می‌کند و فقط resolverهایی که همه مراحل را پاس کنند در خروجی نهایی می‌آیند.

README.md

Lines changed: 77 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ Use `.\findns.exe` instead of `./scanner` in all commands:
162162
# 📥 Download global UDP resolvers
163163
./scanner fetch -o resolvers.txt
164164

165-
# 🌍 Include regional intranet resolvers
165+
# 🌍 Include 7,800+ known regional resolvers (embedded, offline)
166166
./scanner fetch -o resolvers.txt --local
167167

168168
# 🔒 Download DoH resolver URLs
@@ -237,7 +237,7 @@ Automatically downloads and deduplicates resolver lists from public sources.
237237
# Global UDP resolvers (from trickest/resolvers)
238238
./scanner fetch -o resolvers.txt
239239

240-
# Include regional intranet resolvers (7,800+ IPs)
240+
# Include 7,800+ known regional resolvers (embedded, no download needed)
241241
./scanner fetch -o resolvers.txt --local
242242

243243
# DoH resolver URLs (19+ well-known + public lists)
@@ -252,6 +252,41 @@ Automatically downloads and deduplicates resolver lists from public sources.
252252

253253
---
254254

255+
### 🌍 `local` — Export Bundled Regional Data
256+
257+
Export regional resolver data bundled inside the binary. No internet connection needed.
258+
259+
**Two modes:**
260+
261+
```bash
262+
# Mode 1: Known resolvers (default, recommended)
263+
# Exports 7,800+ pre-verified regional DNS resolvers — high scan success rate
264+
./scanner local -o resolvers.txt
265+
266+
# Mode 2: Discover NEW resolvers (--discover)
267+
# Exports candidate IPs from 1,919 CIDR ranges (~10.8M IPs)
268+
# Most will NOT be DNS servers — use this to find resolvers not in the known list
269+
./scanner local -o candidates.txt --discover
270+
271+
# Discovery with batch scanning (non-overlapping, no duplicates)
272+
./scanner local -o batch1.txt --discover --batch 1000000
273+
./scanner local -o batch2.txt --discover --batch 1000000 --offset 1000000
274+
275+
# Show embedded CIDR ranges
276+
./scanner local --list-ranges
277+
```
278+
279+
| Flag | Description | Default |
280+
|------|-------------|---------|
281+
| `--discover` | Switch to discovery mode (CIDR expansion) | `false` |
282+
| `--sample N` | [discover] Random IPs per subnet | `10` |
283+
| `--full` | [discover] Export all ~10.8M IPs | `false` |
284+
| `--batch N` | [discover] Export exactly N IPs (use with `--offset`) | `0` |
285+
| `--offset N` | [discover] Skip N IPs before starting batch | `0` |
286+
| `--list-ranges` | Print embedded CIDR ranges and exit | `false` |
287+
288+
---
289+
255290
### 🏓 `ping` — ICMP Reachability
256291

257292
```bash
@@ -741,7 +776,7 @@ go build -o findns.exe ./cmd
741776
# 📥 دانلود resolverهای UDP جهانی
742777
./scanner fetch -o resolvers.txt
743778

744-
# 🌍 شامل resolverهای محلی
779+
# 🌍 شامل 7,800+ resolver شناخته‌شده ایرانی (بدون اینترنت)
745780
./scanner fetch -o resolvers.txt --local
746781

747782
# 🔒 دانلود آدرس‌های DoH
@@ -814,14 +849,52 @@ go build -o findns.exe ./cmd
814849

815850
```bash
816851
./scanner fetch -o resolvers.txt # resolverهای UDP جهانی
817-
./scanner fetch -o resolvers.txt --local # + resolverهای محلی
852+
./scanner fetch -o resolvers.txt --local # + 7,800+ resolver شناخته‌شده ایرانی
818853
./scanner fetch -o doh-resolvers.txt --doh # آدرس‌های DoH
819854
```
820855

821856
<div dir="rtl">
822857

823858
---
824859

860+
### 🌍 `local` — resolverهای ایرانی داخلی
861+
862+
داده‌های ایرانی داخل خود برنامه را خروجی می‌دهد — نیازی به اینترنت ندارد.
863+
864+
**دو حالت:**
865+
866+
</div>
867+
868+
```bash
869+
# حالت 1: resolverهای شناخته‌شده (پیش‌فرض — پیشنهادی)
870+
# 7,800+ resolver تأیید‌شده — نرخ موفقیت بالا
871+
./scanner local -o resolvers.txt
872+
873+
# حالت 2: کشف resolver جدید (--discover)
874+
# از رنج‌های CIDR ایرانی (~10.8M آی‌پی)
875+
./scanner local -o candidates.txt --discover
876+
877+
# اسکن دسته‌ای (بدون تکرار)
878+
./scanner local -o batch1.txt --discover --batch 1000000
879+
./scanner local -o batch2.txt --discover --batch 1000000 --offset 1000000
880+
881+
# نمایش رنج‌ها
882+
./scanner local --list-ranges
883+
```
884+
885+
<div dir="rtl">
886+
887+
| فلگ | توضیح |
888+
|-----|-------|
889+
| `--discover` | حالت کشف resolver جدید (از CIDR) |
890+
| `--sample N` | [discover] آی‌پی تصادفی از هر subnet (پیش‌فرض: 10) |
891+
| `--full` | [discover] تمام ~10.8M آی‌پی |
892+
| `--batch N` | [discover] دقیقاً N آی‌پی (با `--offset`) |
893+
| `--offset N` | [discover] رد کردن N آی‌پی اول |
894+
| `--list-ranges` | چاپ رنج‌های CIDR |
895+
896+
---
897+
825898
### دستورات جداگانه
826899

827900
| دستور | توضیح | متریک |

cmd/fetch.go

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"strings"
1111
"time"
1212

13+
"github.com/SamNet-dev/findns/internal/data"
1314
"github.com/spf13/cobra"
1415
)
1516

@@ -21,7 +22,7 @@ var fetchCmd = &cobra.Command{
2122

2223
func init() {
2324
fetchCmd.Flags().StringP("output", "o", "resolvers.txt", "output file for merged resolver list")
24-
fetchCmd.Flags().Bool("local", false, "include regional intranet resolvers from ir-resolvers")
25+
fetchCmd.Flags().Bool("local", false, "include 7,800+ known Iranian resolvers (bundled, no download needed)")
2526
fetchCmd.Flags().Bool("doh", false, "fetch DoH resolver URLs instead of UDP IPs")
2627
rootCmd.AddCommand(fetchCmd)
2728
}
@@ -31,7 +32,6 @@ var udpResolverSources = []struct {
3132
url string
3233
}{
3334
{"trickest/resolvers", "https://raw.githubusercontent.com/trickest/resolvers/main/resolvers.txt"},
34-
{"ir-resolvers (local)", "https://raw.githubusercontent.com/net2share/ir-resolvers/main/resolvers.txt"},
3535
}
3636

3737
var dohResolverSources = []struct {
@@ -100,11 +100,8 @@ func runFetch(cmd *cobra.Command, args []string) error {
100100
fmt.Fprintf(os.Stderr, " +%d DoH endpoints\n", added)
101101
}
102102
} else {
103-
// Fetch UDP resolver IPs
103+
// Fetch UDP resolver IPs from online sources
104104
for _, src := range udpResolverSources {
105-
if src.name == "ir-resolvers (local)" && !localMode {
106-
continue
107-
}
108105
fmt.Fprintf(os.Stderr, "fetching %s...\n", src.name)
109106
ips, err := fetchIPList(src.url)
110107
if err != nil {
@@ -121,6 +118,24 @@ func runFetch(cmd *cobra.Command, args []string) error {
121118
}
122119
fmt.Fprintf(os.Stderr, " +%d resolvers\n", added)
123120
}
121+
122+
// Add known Iranian resolvers from bundled list
123+
if localMode {
124+
localIPs, err := data.IRResolvers()
125+
if err != nil {
126+
fmt.Fprintf(os.Stderr, " warning: reading embedded resolvers: %v\n", err)
127+
} else {
128+
added := 0
129+
for _, ip := range localIPs {
130+
if _, exists := seen[ip]; !exists {
131+
seen[ip] = struct{}{}
132+
entries = append(entries, ip)
133+
added++
134+
}
135+
}
136+
fmt.Fprintf(os.Stderr, " +%d known Iranian resolvers (bundled, no download needed)\n", added)
137+
}
138+
}
124139
}
125140

126141
f, err := os.Create(output)

0 commit comments

Comments
 (0)