[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-2310":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":16,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":14,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":36,"readmeContent":37,"aiSummary":38,"trendingCount":15,"starSnapshotCount":15,"syncStatus":39,"lastSyncTime":40,"discoverSource":41},2310,"kevinnet-dns","kamalalhagh\u002Fkevinnet-dns","kamalalhagh","User-friendly DNS tunnel client for Iran — scan resolvers, save profiles, launch MasterDnsVPN or VayDNS with one click. No config editing required.","https:\u002F\u002Fkevinhaji.com",null,"Python",152,10,3,0,1,19,47.52,"MIT License",false,"main",true,[24,25,26,27,28,29,30,31,32,33,34,35],"anti-censorship","censorship-circumvention","dns-resolver","dns-tunnel","iran","masterdns","proxy","python","socks5","tkinter","vaydns","vpn","2026-06-12 04:00:14","\u003Cdiv align=\"right\">\n\n[🇮🇷 فارسی](README_FA.md) | 🇬🇧 English\n\n\u003C\u002Fdiv>\n\n# 🌐 KevinNet DNS\n\n**A user-friendly GUI client for DNS tunneling  supports MasterDnsVPN and VayDNS**\n\n> KevinNet automatically scans Iranian IP ranges to find working DNS resolvers, then generates ready-to-use config files and launch scripts  with a single click to connect. No config files to edit. No terminal commands to remember.\n\n**Created by Kevin Haji · [kevinhaji.com](https:\u002F\u002Fkevinhaji.com) · [kevin.fullstack.dev@gmail.com](mailto:kevin.fullstack.dev@gmail.com)**\n\n---\n\n## What is KevinNet?\n\nA DNS tunnel disguises your internet traffic as ordinary DNS queries. Iran's DPI filtering cannot easily identify or block it. KevinNet handles all the technical parts  scanning for working resolvers, writing config files, copying binaries, launching the VPN  so you only need to fill in a few fields and click buttons.\n\nTwo VPN engines are supported:\n\n- **MasterDNS**  uses multiple resolvers simultaneously for high reliability. Best choice for Iran.\n- **VayDNS**  uses Noise protocol encryption with DoH, DoT, or UDP transport. Falls through resolvers automatically.\n\n---\n\n## Available Versions\n\nKevinNet ships two public releases. Pick the one that fits your situation:\n\n### 🟢 v4.1.6 — Recommended\n\nThe current release. This is what you should download unless you have\na specific reason not to. It does everything 3.2.2 does plus:\n\n- New **light and dark themes** with a one-click toggle and automatic\n  OS detection\n- New **Scan DoH\u002FDoT button** that probes encrypted DNS endpoints\n  (much harder for Iranian DPI to fingerprint than plain UDP\u002F53)\n- DoH\u002FDoT scan results save directly into VayDNS profiles using the\n  same Save button you already know\n- Redesigned interface with card-based layout, brand mark, modern\n  status bar, and underlined active tab\n- Right-click context menu on the resolver list (Copy IP, Copy all,\n  Open output folder)\n- Last-launched indicator on each profile (`launched 5m ago`, etc.)\n- App remembers your last domain, output folder, and VPN mode\n  between launches\n- Input validators with clear error messages for bad domains, keys,\n  and folder names\n- Profile JSONs and config files created with 0600 permissions on\n  Linux\u002FmacOS so other users can't read your encryption keys\n- New themed HTML help page opens in your browser\n- Buttons disabled during scans to prevent accidental disruption\n- SHA-256 checksums published alongside every release for download\n  verification\n- 92-test pytest suite runs in CI before any binary ships\n\nSee [CHANGELOG.md](CHANGELOG.md) for the full list of changes.\n\n### 🟡 v3.2.2 — Legacy\n\nThe previous stable release. Still works, still available on the\nReleases page. Use this only if:\n\n- You have a working setup on 3.2.2 and don't want to change anything\n- You've reported a 4.1.6 regression specific to your environment\n  and it hasn't been fixed yet\n\nFor everyone else, use **v4.1.6**. Profile files are compatible\nbetween the two versions, so you can switch back and forth without\nlosing your data.\n\n---\n\n## 📥 Download KevinNet\n\nGo to the [**Releases page**](..\u002F..\u002Freleases) and pick one of the two\nversions:\n\n### v4.1.6 (recommended)\n\n| Platform | File |\n|---|---|\n| 🪟 Windows x64 | `KevinNet_Windows_x64.exe` |\n| 🪟 Windows ARM64 | `KevinNet_Windows_ARM64.exe` |\n| 🍎 macOS (Intel + Apple Silicon) | `KevinNet_macOS_Universal` |\n| 🐧 Linux x64 | `KevinNet_Linux_x64` |\n| 🐧 Linux ARM64 | `KevinNet_Linux_ARM64` |\n\n### v3.2.2 (legacy)\n\nSame platform binaries are available on the v3.2.2 release page. Only\ndownload these if 4.1.6 doesn't work for you — see [CHANGELOG.md](CHANGELOG.md)\nfor the comparison.\n\n> **macOS:** After downloading, run in Terminal:\n> ```bash\n> chmod +x KevinNet_macOS_Universal\n> xattr -d com.apple.quarantine KevinNet_macOS_Universal\n> ```\n\n> **Linux:** Run `chmod +x KevinNet_Linux_x64` before launching.\n\n### Verifying your download (optional but recommended)\n\nEvery release ships with a `SHA256SUMS.txt` file alongside the binaries. To verify the file you downloaded hasn't been tampered with:\n\n```bash\nshasum -a 256 -c SHA256SUMS.txt     # macOS \u002F Linux\n```\n```powershell\nGet-FileHash -Algorithm SHA256 KevinNet_Windows_x64.exe  # Windows\n```\n\nCompare the output against the line for your platform in `SHA256SUMS.txt`. If they don't match, do not run the file - re-download from the official Releases page.\n\n---\n\n## 🔧 What You Need Before Starting\n\nKevinNet is the **client app**. It connects to a VPN server that you (or someone you know) must set up on a VPS outside Iran.\n\n---\n\n### If you are using MasterDNS\n\n#### 1  A VPS server outside Iran\n\nAny Linux VPS with a public IP address. Popular providers: Hetzner, DigitalOcean, Vultr, Linode.\n\n#### 2  A domain name with NS delegation\n\nMasterDNS acts as an authoritative DNS server, so DNS queries for your tunnel subdomain must be forwarded to your VPS. Create **two DNS records** in your domain provider's control panel:\n\n| Type | Name | Value | Purpose |\n|---|---|---|---|\n| `A` | `ns` | Your server's IP | Glue record  where your nameserver lives |\n| `NS` | `v` | `ns.yourdomain.com` | Delegates `v.yourdomain.com` queries to your server |\n\nExample with domain `example.com` and server IP `1.2.3.4`:\n- `ns.example.com` → `1.2.3.4` (A record)\n- `v.example.com` → `ns.example.com` (NS record)\n\nYour tunnel domain is `v.example.com`.\n\n> **Cloudflare users:** The `A` record for `ns` must be **DNS only** (grey cloud), not proxied.\n> **Tip:** Short names (1–2 chars) leave more room for data per DNS packet → better speed.\n\n#### 3  MasterDnsVPN server installed\n\nFollow the official guide: 👉 [https:\u002F\u002Fgithub.com\u002Fmasterking32\u002FMasterDnsVPN](https:\u002F\u002Fgithub.com\u002Fmasterking32\u002FMasterDnsVPN)\n\nAfter setup you will have:\n- **Tunnel Domain**  e.g. `v.example.com` → enter this in KevinNet\n- **32-character Encryption Key**  saved in `encrypt_key.txt` on the server → enter this in KevinNet\n\n> The key must match between client and server. If you lose it, run `cat encrypt_key.txt` on your server.\n\n#### 4  The MasterDnsVPN client binary\n\nBundled inside KevinNet  copied to your output folder automatically when you save. If missing, see [⚠️ Binary missing?](#-binary-missing) below.\n\n---\n\n### If you are using VayDNS\n\n#### 1  A VPS server outside Iran\n\nSame as MasterDNS  any Linux VPS with a public IP.\n\n#### 2  A domain name with NS delegation\n\nVayDNS also acts as an authoritative DNS server. The DNS setup concept is identical to MasterDNS: one `A` glue record + one `NS` delegation record.\n\nExample with domain `example.com` and server IP `1.2.3.4`:\n- `tns.example.com` → `1.2.3.4` (A record  glue)\n- `t.example.com` → `tns.example.com` (NS record  delegation)\n\nYour tunnel domain is `t.example.com`.\n\n> **Important:** The glue record name (`tns`) must NOT be a subdomain of the tunnel name (`t`). They must be separate  e.g. `tns` and `t`, not `ns.t`.\n\n#### 3  VayDNS server installed\n\nFollow the official guide: 👉 [https:\u002F\u002Fgithub.com\u002Fnet2share\u002Fvaydns](https:\u002F\u002Fgithub.com\u002Fnet2share\u002Fvaydns)\n\nAfter setup you will have:\n- **Tunnel Domain**  e.g. `t.example.com` → enter this in KevinNet\n- **`server.pub` file** on the server  contains your public key\n\n#### 4  Your VayDNS Public Key (64-character hex string)\n\nThe public key authenticates your server  it proves to the client that it is talking to the right server and not an interceptor. To get it, run on your server:\n\n```bash\ncat server.pub\n```\n\nYou will see a 64-character hex string like:\n```\n0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b\n```\n\nCopy this entire string and paste it into the **VayDNS Public Key** field in KevinNet.\n\n> The public key is safe to share  it only verifies your server's identity. The private key (`server.key`) must stay on the server and never be shared.\n\n#### 5  The vaydns-client binary\n\nBundled inside KevinNet  copied to your output folder automatically when you save. If missing, see [⚠️ Binary missing?](#-binary-missing) below.\n\n---\n\n## 🚀 How to Use  Step by Step\n\n### Step 1  Choose VPN type\n\nAt the top of the Scanner panel, click **MasterDNS** or **VayDNS**. Only the fields and save button for your chosen type will show.\n\n### Step 2  Fill in your details\n\n| Field | MasterDNS | VayDNS |\n|---|---|---|\n| **Country \u002F Folder** | Any name  e.g. `Iran` | Any name  e.g. `Iran` |\n| **Tunnel Domain** | e.g. `v.example.com` | e.g. `t.example.com` |\n| **Key** | 32-char key from `encrypt_key.txt` | 64-char hex key from `server.pub` |\n\n### Step 3  Set scan options\n\n| Option | Recommended for Iran | Notes |\n|---|---|---|\n| **Target** | `100` | How many resolvers to find |\n| **Concurrency** | `80` | Do not go above 100 inside Iran |\n| **Timeout** | `3s` | Iranian networks are slow |\n| **Pool ×1000** | `200` | 200k IPs scanned. Increase to 300–500 if few found |\n\nRun the scan 2–3 times  each run tests a different random set of IPs.\n\n### Step 4  Start the scan\n\nClick **▶ Start Scan**. Three automatic phases:\n\n- **Phase 1**  Quick alive check across all IPs in the pool\n- **Phase 2**  Full 6-check scoring: NS→A, TXT, RND, DPI, EDNS, NXD\n- **Phase 3**  Real E2E tunnel test through the VPN binary\n\n🟢 6\u002F6 excellent · 🟡 4–5 good · 🟠 2–3 weak · ⚫ ·0–1 very weak\n\n### Step 5  Save to Profiles\n\n- **MasterDNS:** click **💾 Save to MasterDNS Profiles**\n- **VayDNS:** click **💾 Save to VayDNS Profiles**\n\nA profile is saved with sensible defaults. The VPN binary is copied into the output folder automatically.\n\n### (Optional) Export DNS List\n\nAfter any scan, the **📤 Export DNS List** button becomes active regardless of which VPN mode you used. Click it to save the found resolver IPs as a plain `.txt` file - one IP per line. Useful if you want to use the resolver list in another application or script.\n\n### (Optional) DoH \u002F DoT Scan - encrypted transports\n\nThe **🔒 Scan DoH\u002FDoT** button (new in 3.3.0) probes a curated list of well-known DNS-over-HTTPS (port 443) and DNS-over-TLS (port 853) endpoints. The traffic looks like normal HTTPS, so it's much harder for Iranian DPI to fingerprint as tunnel traffic than plain UDP\u002F53. Working endpoints stream into the results list with a 🔒 icon - paste any of them into a VayDNS profile as a custom resolver when UDP isn't surviving DPI.\n\nThe lists live in `data\u002Fdoh_endpoints.txt` and `data\u002Fdot_endpoints.txt` next to the app. You can edit them to add private endpoints or remove dead ones without rebuilding.\n\n### Tip - right-click any resolver\n\nIn the results list, right-click (or two-finger click \u002F Ctrl-click on Mac) to **Copy IP**, **Copy all IPs**, or **Open output folder** in your file manager.\n\n### Step 6  Connect from the Profiles tab\n\nClick **📋 MasterDNS Profiles** or **📋 VayDNS Profiles** at the top.\n\n1. Select your profile from the left list  the **launched 5m ago** indicator helps you find your active profile\n2. Optionally edit options and click **💾 Save Changes**\n3. Click **🚀 Launch VPN**  a terminal opens and the VPN starts\n\nSet your browser proxy to `SOCKS5 127.0.0.1:18000` (MasterDNS) or `SOCKS5 127.0.0.1:7000` (VayDNS).\n\n---\n\n## 📋 Profiles Tab  Saving, Editing & Re-testing\n\nEvery save creates a profile in `masterdns_profiles\u002F` or `vaydns_profiles\u002F` next to the app.\n\n| Button | What it does |\n|---|---|\n| 💾 Save Changes | Rewrites config files with your current settings |\n| 🚀 Launch VPN | Regenerates files and launches the VPN |\n| 📋 Duplicate | Copies the profile  great for A\u002FB testing different settings |\n| 🗑 Delete | Removes the profile and optionally the output folder |\n\n---\n\n## 🔧 MasterDNS Options  What They Mean & Iran Optimal Values\n\n| Option | Iran optimal | Why |\n|---|---|---|\n| **Encryption Method** | `1  XOR` | Lowest overhead in small DNS packets. Must match server. |\n| **Balancing Strategy** | `3  Least Loss` | Iran has high uneven packet loss  favours the most reliable resolver |\n| **Packet Duplication** | `2–3` | Sends each packet via multiple resolvers  redundancy on lossy paths |\n| **Max Upload MTU** | `80–100` | Smaller DNS queries look less suspicious to DPI |\n| **Max Download MTU** | `700` | Prevents ISP from fragmenting large DNS responses |\n| **Min Upload MTU** | `38` | Very conservative  keeps the maximum number of resolvers usable |\n| **Min Download MTU** | `400` | Keeps resolvers that return slightly smaller responses |\n| **Log Level** | `INFO` | Shows connection events without flooding the terminal |\n\n---\n\n## 🔧 VayDNS Options  What They Mean & Iran Optimal Values\n\n| Option | Iran optimal | Why |\n|---|---|---|\n| **Transport** | `UDP` | Plaintext UDP on port 53  most direct path from Iran |\n| **Resolver** | *(empty)* | Uses all scanned resolvers in order  see note below |\n| **Listen Port** | `7000` | The local port your browser proxy connects to |\n| **Max QNAME Length** | `101` | ~50 byte upstream MTU, safe for most Iranian resolvers |\n| **Idle Timeout** | `10s` | How long before declaring a session dead. Must match server. Increase to `30s` if reconnects are frequent. |\n| **Keepalive** | `2s` | How often to ping the server to keep the session alive. Must be less than idle timeout. Must match server. |\n| **Record Type** | `txt` | TXT records carry the most data and are most compatible under DPI |\n| **Queue Size** | `512` | Internal packet buffer  increase to `1024` on fast connections |\n| **UDP Workers** | `100` | Concurrent outgoing queries  lower to `50` if you see socket errors |\n| **Resolver Timeout** | `60s` | If a resolver doesn't connect within this many seconds, the script moves to the next one |\n| **Log Level** | `info` | Normal operation |\n\n**The Resolver field:**\n- **Empty (recommended)**  KevinNet generates a launch script that tries all scanned resolvers in order. If one gets stuck, it moves to the next after `Resolver Timeout` seconds.\n- **Single address**  Only that resolver is used. Format: `8.8.8.8:53` for UDP · `https:\u002F\u002Fdns.google\u002Fdns-query` for DoH · `dns.google:853` for DoT.\n\n> **Testing from outside Iran:** Scanned resolvers are Iranian public DNS servers. They only work correctly when connecting **from inside Iran**. Testing from Australia, Europe, or anywhere else will show NXDOMAIN errors  those resolvers cannot reach your tunnel server from a foreign network.\n\n---\n\n## ⚠️ Binary missing?\n\n### MasterDnsVPN binary missing\n\n> **KevinNet v3.0.9+ bundles the correct binary automatically for every platform - upgrade first before trying manual steps below.**\n\nDownload the client binary from the [MasterDnsVPN releases](https:\u002F\u002Fgithub.com\u002Fmasterking32\u002FMasterDnsVPN\u002Freleases\u002Flatest):\n\n| Platform | Download |\n|---|---|\n| 🐧 Linux x64 | [MasterDnsVPN_Client_Linux_AMD64.zip](https:\u002F\u002Fgithub.com\u002Fmasterking32\u002FMasterDnsVPN\u002Freleases\u002Flatest\u002Fdownload\u002FMasterDnsVPN_Client_Linux_AMD64.zip) |\n| 🐧 Linux ARM64 | [MasterDnsVPN_Client_Linux_ARM64.zip](https:\u002F\u002Fgithub.com\u002Fmasterking32\u002FMasterDnsVPN\u002Freleases\u002Flatest\u002Fdownload\u002FMasterDnsVPN_Client_Linux_ARM64.zip) |\n| 🐧 Linux x64 (legacy glibc) | [MasterDnsVPN_Client_Linux-Legacy_AMD64.zip](https:\u002F\u002Fgithub.com\u002Fmasterking32\u002FMasterDnsVPN\u002Freleases\u002Flatest\u002Fdownload\u002FMasterDnsVPN_Client_Linux-Legacy_AMD64.zip) |\n| 🪟 Windows x64 | [MasterDnsVPN_Client_Windows_AMD64.zip](https:\u002F\u002Fgithub.com\u002Fmasterking32\u002FMasterDnsVPN\u002Freleases\u002Flatest\u002Fdownload\u002FMasterDnsVPN_Client_Windows_AMD64.zip) |\n| 🪟 Windows ARM64 | [MasterDnsVPN_Client_Windows_ARM64.zip](https:\u002F\u002Fgithub.com\u002Fmasterking32\u002FMasterDnsVPN\u002Freleases\u002Flatest\u002Fdownload\u002FMasterDnsVPN_Client_Windows_ARM64.zip) |\n| 🍎 macOS (all) | [MasterDnsVPN releases page](https:\u002F\u002Fgithub.com\u002Fmasterking32\u002FMasterDnsVPN\u002Freleases\u002Flatest) |\n\n1. Extract the ZIP\n2. Rename the binary to `MasterDnsVPN` (macOS\u002FLinux) or `MasterDnsVPN.exe` (Windows)\n3. Place it **next to the KevinNet app**\n4. Click **Save to MasterDNS Profiles** again - it copies automatically\n\n### vaydns-client binary missing\n\nDownload from the [VayDNS releases page](https:\u002F\u002Fgithub.com\u002Fnet2share\u002Fvaydns\u002Freleases).\nUse these exact filenames when placing next to KevinNet:\n\n| Platform | Filename |\n|---|---|\n| macOS Apple Silicon (M1\u002FM2\u002FM3\u002FM4) | `vaydns-client-darwin-arm64` |\n| macOS Intel | `vaydns-client-darwin-amd64` |\n| Linux x64 | `vaydns-client-linux-amd64` |\n| Linux ARM64 | `vaydns-client-linux-arm64` |\n| Windows x64 | `vaydns-client_windows_amd64.exe` |\n\n1. Download and rename to the exact name above\n2. Place it **next to the KevinNet app**\n3. Click **Save to VayDNS Profiles** again  it copies automatically\n\n---\n\n---\n\n## 🔍 Common Problems & Solutions\n\n### KevinNet app itself\n\n**macOS: \"KevinNet is damaged and can't be opened\" or \"cannot be verified\"**\n```bash\nchmod +x KevinNet_macOS_Universal\nxattr -d com.apple.quarantine KevinNet_macOS_Universal\n```\nOr right-click the app → Open → Open.\n\n**Linux: \"Permission denied\" when launching**\n```bash\nchmod +x KevinNet_Linux_x64\n.\u002FKevinNet_Linux_x64\n```\n\n**Windows: antivirus blocks the app**\nThis is a false positive  PyInstaller-compiled apps trigger some antivirus scanners. Add an exception for the file, or build from source yourself (see BUILD_INSTRUCTIONS.txt).\n\n**Windows: Persian text appears as separate unjoined characters**\nv3.1.2+ bundles Vazirmatn and loads it automatically on startup. If you are on an older version, upgrade to the latest release from the [releases page](https:\u002F\u002Fgithub.com\u002Fkamalalhagh\u002Fkevinnet-dns\u002Freleases\u002Flatest).\n\n---\n\n### VPN binary missing from output folder\n\n**After clicking Save, the country folder has no `MasterDnsVPN` or `vaydns-client`**\n\nThe binary must be placed **next to the KevinNet app** before saving  KevinNet copies it into the output folder. See [⚠️ Binary missing?](#-binary-missing) for download links and exact filenames.\n\n**macOS: `MasterDnsVPN` is there but won't run  \"cannot be opened\"**\n```bash\nchmod +x \u002Fpath\u002Fto\u002FIran\u002FMasterDnsVPN\nxattr -d com.apple.quarantine \u002Fpath\u002Fto\u002FIran\u002FMasterDnsVPN\n```\n\n**macOS: `vaydns-client-darwin-arm64` won't run**\n```bash\nchmod +x \u002Fpath\u002Fto\u002FIran\u002Fvaydns-client-darwin-arm64\nxattr -d com.apple.quarantine \u002Fpath\u002Fto\u002FIran\u002Fvaydns-client-darwin-arm64\n```\n\n---\n\n### Scan finds very few or zero resolvers\n\n**Finding 0–5 resolvers even after scanning**\n\n- Increase **Pool ×1000** from `200` to `500`  more IPs scanned = more found\n- Run the scan **2–3 times**  each run picks a different random set of IPs\n- Lower **Timeout** to `2s` if the scan takes too long (sacrifices some accuracy)\n- Increase **Concurrency** slightly  but do not go above `100` inside Iran\n\n**Phase 3 (E2E) passes zero resolvers**\n\nPhase 3 tests the actual tunnel through your server. Zero means either:\n- The server is down or misconfigured  check it is running\n- The tunnel domain DNS is not resolving  wait up to 48h after creating DNS records\n- The encryption key doesn't match the server  double-check `encrypt_key.txt`\n\n---\n\n### VPN connects but internet doesn't work\n\n**Connected but browser shows no internet \u002F pages don't load**\n\n- Make sure your browser proxy is set to `SOCKS5 127.0.0.1:18000` (MasterDNS) or `SOCKS5 127.0.0.1:7000` (VayDNS)\n- Try a SOCKS5 proxy extension  Proxy SwitchyOmega for Chrome\u002FFirefox works well\n- Check that the VPN terminal is still open and running\n\n**Connected but very slow**\n\nFor MasterDNS  try lowering MTU values:\n- Set **Max Upload MTU** to `60–80` (smaller packets, less likely to be throttled)\n- Set **Max Download MTU** to `600`\n- Save changes in the Profiles tab and reconnect\n\nFor VayDNS:\n- Try setting **Max QNAME Length** to `80` instead of `101`\n- Try **Record Type** `null` instead of `txt` (higher throughput on some resolvers)\n\n---\n\n### MasterDNS specific problems\n\n**\"parse TOML failed\" error when launching MasterDnsVPN**\n\nThe config file has an unfilled placeholder. This happens if you launch from the output folder without saving through KevinNet. Always save from the Profiles tab before launching. If the error persists:\n1. Delete the country folder\n2. Go to the Profiles tab, select the profile\n3. Click **💾 Save Changes** to regenerate the files\n4. Click **🚀 Launch VPN**\n\n**Frequent disconnections \u002F reconnects**\n\n- Increase **Packet Duplication** to `3`  more redundancy on lossy paths\n- Change **Balancing Strategy** to `3  Least Loss`\n- Re-scan to get a fresh set of resolvers  old ones may have been blocked\n\n**Only a handful of resolvers work (most are 1–2)**\n\nThis is normal  most public DNS servers don't forward DNS queries for custom NS delegations. A score of 10–30 good resolvers from a scan of 200k IPs is a good result.\n\n---\n\n### VayDNS specific problems\n\n**\"noise handshake: timeout\" repeated in the terminal**\n\nThe resolver is returning NXDOMAIN  it can't reach your tunnel server. The script will automatically move to the next resolver after `Resolver Timeout` seconds. If all resolvers fail:\n- Your tunnel domain DNS may not be set up correctly  verify NS delegation with `dig v.yourdomain.com NS`\n- Try increasing **Resolver Timeout** to `90s` to give each resolver more time\n\n**VPN process keeps running after Ctrl+C**\n\nThis was a known issue  fixed in the latest version. The launch script now uses `trap` to clean up background processes on exit. Re-save your profile to get the updated script.\n\n**\"all resolvers exhausted\" message**\n\nAll scanned resolvers failed within the timeout. Solutions:\n1. Re-scan to get a fresh set of resolvers (Iranian DNS servers change frequently)\n2. Enter a well-known public resolver in the **Resolver** field: `8.8.8.8:53`\n3. Check your server is running and the tunnel domain resolves correctly\n\n**Testing from outside Iran  NXDOMAIN on all resolvers**\n\nThis is expected behaviour, not a bug. The scanned resolvers are Iranian public DNS servers. They only forward queries for your tunnel domain when accessed from inside Iran. Testing from Europe, Australia, or anywhere outside Iran will always fail.\n\n---\n\n### DNS \u002F domain problems\n\n**\"dig v.yourdomain.com NS\" shows no results**\n\nDNS propagation can take up to 48 hours. Wait and try again. Also check:\n- The NS record value points to the exact same name as the A record (e.g. `ns.yourdomain.com`)\n- Cloudflare A record is set to DNS only (grey cloud), not proxied\n\n**Server is running but no resolvers pass Phase 3**\n\nTry verifying the domain manually from your server:\n```bash\ndig @127.0.0.1 test.v.yourdomain.com A\n```\nIf this returns NXDOMAIN, the server is not receiving DNS queries correctly. Check the firewall (port 53 UDP must be open) and `systemd-resolved` is disabled.\n\n---\n\n## 🖥️ Server Setup\n\nKevinNet is a **client-side app only**. Server installation is covered in the official repos:\n\n- **MasterDNS server:** 👉 [https:\u002F\u002Fgithub.com\u002Fmasterking32\u002FMasterDnsVPN](https:\u002F\u002Fgithub.com\u002Fmasterking32\u002FMasterDnsVPN)\n- **VayDNS server:** 👉 [https:\u002F\u002Fgithub.com\u002Fnet2share\u002Fvaydns](https:\u002F\u002Fgithub.com\u002Fnet2share\u002Fvaydns)\n\n---\n\n## 🛠️ Build From Source\n\nSee [BUILD_INSTRUCTIONS.txt](BUILD_INSTRUCTIONS.txt) (English) or [BUILD_INSTRUCTIONS_FA.txt](BUILD_INSTRUCTIONS_FA.txt) (فارسی) for the full PyInstaller build steps.\n\n### Running the test suite\n\nKevinNet ships with a unit test suite (87 tests) covering input validation, scanner helpers, profile config building, and settings handling. Tests run in CI before every release.\n\n```bash\npip install pytest dnspython pillow\npython -m pytest tests\u002F -v\n```\n\nAll tests must pass before a release is built - the CI workflow gates the platform-specific builds behind a successful `pytest` run.\n\n### Editing bundled data lists\n\nThe Iranian CIDR ranges, public DNS resolvers, WhiteDNS Iran list, and DoH\u002FDoT endpoint lists live as plain text files in `data\u002F`:\n\n| File | Contents |\n|---|---|\n| `data\u002Firan_cidrs.txt` | Iranian IPv4 CIDR ranges sampled during scanning |\n| `data\u002Fpublic_resolvers.txt` | Well-known public DNS resolvers (warm-up set) |\n| `data\u002Fwhite_dns_iran.txt` | Pre-verified Iranian DNS resolvers (high-hit-rate seed list) |\n| `data\u002Fdoh_endpoints.txt` | DNS-over-HTTPS endpoints scanned by the 🔒 button |\n| `data\u002Fdot_endpoints.txt` | DNS-over-TLS endpoints scanned by the 🔒 button |\n\nYou can edit these files to add private endpoints or remove dead entries - no rebuild needed. When PyInstaller bundles the binary it copies them inside, and the app also looks for a `data\u002F` folder next to the executable so user edits take priority over the bundled copy.\n\n---\n\n## 🙏 Credits\n\n**MasterDnsVPN** by MasterkinG32 (Amin Mahmoudi)  [GitHub](https:\u002F\u002Fgithub.com\u002Fmasterking32\u002FMasterDnsVPN)  MIT License\n\n**VayDNS** by net2share  [GitHub](https:\u002F\u002Fgithub.com\u002Fnet2share\u002Fvaydns)  fork of dnstt by David Fifield (public domain)\n\nSee [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md) for full license texts.\n\n---\n\n## ⭐ Support This Project\n\n- **⭐ Star this repo**  helps others discover it\n- **Share** with anyone in Iran who needs free internet\n- **Report bugs** via GitHub Issues\n\nEvery star and share helps this tool reach one more family that needs it.\n\nSee [CHANGELOG.md](CHANGELOG.md) for what's new in each release.\n\n---\n\n## ⚖️ License & Disclaimer\n\nCopyright © 2026 Kevin Haji  [MIT License](LICENSE)  See [DISCLAIMER.md](DISCLAIMER.md)\n","KevinNet DNS 是一个用户友好的DNS隧道客户端，专为伊朗用户提供服务，支持一键启动MasterDnsVPN或VayDNS。该项目使用Python编写，并通过Tkinter库提供图形界面，能够自动扫描伊朗IP范围以寻找可用的DNS解析器，自动生成配置文件并启动脚本，无需手动编辑配置或记忆终端命令。其核心功能包括支持多种DNS协议（如DoH, DoT, UDP）和加密方式，确保了高可靠性和安全性。特别适合需要绕过网络审查、保护隐私及访问受限内容的场景。",2,"2026-06-11 02:49:25","CREATED_QUERY"]