کنترلکننده ترافیک per-app بدون نیاز به root برای Android.
شکلدهی، مسدودسازی، زمانبندی و نظارت بر ترافیک شبکه اپلیکیشنها با استفاده از VpnService اندروید.
بدون root. بدون سرور خارجی. بدون ردیاب.
- NetValve چیست؟
- چرا NetValve؟
- ویژگیها
- تصاویر
- چگونه کار میکند؟
- معماری
- نصب
- ساخت از سورس
- ساختار پروژه
- کارایی
- محدودیتها
- نقشه راه
- مشارکت
- مجوز
NetValve یک اپلیکیشن اندروید بدون نیاز به root است که یک تونل VPN محلی ایجاد میکند تا ترافیک شبکه اپلیکیشنها را رهگیری، شکلدهی و نظارت کند. برخلاف فایروالهای سنتی که فقط اتصالات را مسدود میکنند، NetValve بر شکلدهی ترافیک تمرکز دارد — کنترل دقیق بر:
- 📊 محدودیت پهنای باند per-app (دانلود/آپلود)
- 🚫 مسدودسازی اپلیکیشن (قطع کامل دسترسی به شبکه)
- ⏰ زمانبندی (مثلاً: مسدودسازی بعد از نیمهشب)
- 📱 قوانین پسزمینه (کاهش سرعت وقتی اپ در foreground نیست)
- 📈 آمار زنده ترافیک (throughput، اتصالات، DNS)
- 🔋 سیاستهای شرطی (Wi-Fi/موبایل/Roaming/شارژ/باتری/صفحه)
همه چیز روی دستگاه از طریق API VpnService اندروید اجرا میشود. ترافیک توسط یک شبکه استک userspace پایان مییابد، در Kotlin شکلدهی میشود، و مستقیماً از طریق سوکتهای محافظتشده به اینترنت ارسال میشود. NetValve یک VPN خارجی نیست — دادههای شما هرگز از طریق شخص ثالث از گوشی شما خارج نمیشود.
شاید بپرسید:
وقتی NetGuard، RethinkDNS یا NoRoot Firewall وجود دارند، چرا این پروژه را بسازیم؟
سؤال خوبی است. اینجاست که NetValve متفاوت است:
| جنبه | NetValve | فایروال معمولی اندروید |
|---|---|---|
| تمرکز | شکلدهی ترافیک (محدودیت پهنای باند) | مسدودسازی ترافیک (مجاز/غیرمجاز) |
| دقت | محدودیت per-app و per-direction با pacing توکنباکت | دودویی روشن/خاموش |
| مدیریت UDP | Paced، نه dropped — حفظ VoIP/بازی | اغلب dropped (باعث خرابی اپ میشود) |
| موتور سیاست | DSL شرط→عمل عمومی (قابل توسعه) | قوانین فایروال hard-coded |
| آمار | Throughput زنده + مجموع per-app + DNS + تأخیر | شمارندههای ابتدایی |
| معماری | gVisor netstack (TCP/IP درجه تولید) | iptables-style یا tun2socks |
| قابلیت توسعه | خط لوله پلاگین (API TrafficModule) |
یکپارچه |
اکثر فایروالهای اندروید به این سؤال پاسخ میدهند: "آیا این اپ باید به شبکه دسترسی داشته باشد؟" NetValve پاسخ میدهد: "این اپ چقدر پهنای باند بگیرد، و کِی؟"
این به یک روتر شکلدهی ترافیک (مانند tc در لینوکس) نزدیکتر است تا یک فایروال. اگر میخواهید:
- YouTube را بین ۹ صبح تا ۵ عصر به ۲ Mbps محدود کنید
- تلگرام را در دیتای موبایل مسدود کنید ولی در Wi-Fi مجاز کنید
- یک بازی را در پسزمینه به ۱۰۰ KB/s کاهش دهید
- دقیقاً نظارت کنید که هر اپ چقدر داده در هر session مصرف میکند
...NetValve برای این کار ساخته شده است.
- بدون Root — روی Android خام کار میکند، بدون Magisk/KernelSU
- محدودیت پهنای باند per-app — کپ دانلود و آپلود
- محدودیت آپلود — مستقل از دانلود
- محدودیت دانلود — مستقل از آپلود
- مسدودسازی اپلیکیشن — قطع کامل دسترسی به شبکه per app
- زمانبندی قوانین — بازههای زمانی و روز هفته
- قوانین Foreground/Background — کپ متفاوت بر اساس وضعیت اپ
- آمار زنده ترافیک — throughput، اتصالات، DNS
- لاگگیری — نمایشگر لاگ سطحبندیشده با خروجی
- رابط کاربری Material 3 — Jetpack Compose، تمهای تاریک/روشن
- سیاستهای شرطی — Wi-Fi/موبایل/Roaming/شارژ/باتری/صفحه
- Pacing توکنباکت — نرخ پایدار + تحمل burst
- Pacing UDP (نه dropping) — محافظت از VoIP/بازی/استریم
- معافیت DNS — name resolution هرگز throttle نمیشود
- موتور سیاست عمومی — DSL شرط→عمل قابل توسعه
- معماری پلاگین — افزودن ماژول بدون دستکاری engine
- پشتیبانی IPv6 — routed + shaped (RELAY یا FAST_REJECT)
- آگاه از باتری — معافیت Doze، راهنمای OEM-specific
- ماندگاری پس از بوت — بازفعالسازی تونل پس از ریبوت (اختیاری)
- همزیستی VPN — مدیریت graceful
onRevoke
توجه: تصاویر در
docs/screenshots/اضافه خواهند شد. اپ ۵ صفحه اصلی دارد:
پنل کنترل اصلی — شروع/توقف تونل، مشاهده آمار زنده، تغییر سریع اپها.
مرور اپهای نصبشده، جستجو، فیلتر اپهای سیستمی، انتخاب اپهای قابل کنترل.
تنظیم کپ دانلود/آپلود (KB/s, MB/s, kbps, Mbps)، مسدودسازی، فقط پسزمینه، شرایط و زمانبندی.
Throughput زنده/میانگین/پیک، مجموع per-app، تعداد اتصالات، آمار DNS، تأخیر اتصال.
فیلتر بر اساس سطح (DEBUG/INFO/WARNING/ERROR)، جستجو و خروجی.
NetValve از API VpnService اندروید برای ایجاد یک تونل محلی استفاده میکند:
┌─────────────────────────────────────────────────────────────────┐
│ ۱. Android VpnService یک واسط TUN ایجاد میکند │
│ ۲. ترافیک اپهای انتخابشده به TUN هدایت میشود │
│ ۳. موتور بسته (gVisor netstack) جریانهای TCP/UDP را پایان میدهد│
│ ۴. نسبتدهی جریان → UID (کدام اپ مالک این اتصال است؟) │
│ ۵. موتور سیاست → ارزیابی قوانین برای این UID + وضعیت دستگاه │
│ ۶. مدیر throttle → اعمال کپ پهنای باند per-app │
│ ۷. مدیر اتصال → شمارهگیری سوکت محافظتشده upstream │
│ ۸. ارسال بایتها از طریق توکنباکتها → اینترنت │
└─────────────────────────────────────────────────────────────────┘
برخلاف فایروالهای سنتی که برای throttle کردن بستهها را drop میکنند، NetValve آنها را pace میکند:
UPLOAD app → VPN TUN → netstack → relay → [TokenBucket] → upstream.write() → Internet
DOWNLOAD Internet → upstream.read() → [TokenBucket] → relay → netstack → VPN TUN → app
وقتی یک اپ از کپ خود فراتر میرود، coroutine relay suspend میشود (busy-wait نمیکند، drop نمیکند). کنترل جریان TCP به طور طبیعی ارسالکننده را کند میکند، و UDP از طریق یک صف محدود pace میشود. این پایداری اپ را حفظ میکند — بدون تماسهای VoIP قطعشده، بدون بستههای بازی از دست رفته، بدون glitch استریم.
┌───────────────────────────── UI (Compose, MVVM) ─────────────────────────────┐
│ Dashboard · App selection · Per-app detail · Stats · Logs │
└───────────────▲───────────────────────────────────────────────▲──────────────┘
│ StateFlow │ commands
┌─────────────────────────────────┴───────────────┐ ┌───────────┴───────────┐
│ Repositories (DataStore / Room / PackageManager)│ │ VpnController │
└───────────────▲──────────────────────▲──────────┘ └───────────┬───────────┘
│ │ │ intents
SettingsRepository StatsRepository / LogRepository ▼
│ │ ┌──────────────────────────┐
▼ ▼ │ NetValveVpnService │
┌───────────────────┐ ┌───────────────────┐ │ (VpnService + FGS) │
│ RuleEngine │ │ StatsCollector │ │ builds TUN, allow/deny │
│ (generic policy) │ │ Logger │ └────────────┬─────────────┘
└─────────▲─────────┘ └─────────▲──────────┘ │ tunFd + protect()
│ │ ▼
│ ┌─────────┴───────────────────────────────────────────────────────┐
│ │ TrafficEngine (per session) │
│ │ builds FlowSupervisor + starts PacketPipeline + samples stats │
│ └─────────┬───────────────────────────────────────────────────────┘
│ │ FlowHandler callbacks (per flow: 4-tuple + byte stream)
┌────────────┴───────────┐ ┌───────▼───────────────────────────────────┐
│ DeviceStateMonitor │ │ PacketPipeline (build-selected engine) │
│ net/power/screen/fg │ │ ├─ netstack → gVisor AAR (production) │
└────────────────────────┘ │ └─ loopback → pure-Kotlin dev stub │
└───────┬───────────────────────────────────┘
│ per flow
┌──────────────────────▼─────────────────────────┐
│ FlowSupervisor: attribute UID → ModuleChain │
│ verdict → block OR relay via ThrottleManager │
│ token buckets ↔ ConnectionManager (protected) │
└──────────────────────┬───────────────────────────┘
▼ protected upstream socket → Internet
- منطق محصول framework-free است — قوانین، throttle، آمار، لاگگیری Kotlin خالص هستند، روی JVM ساده قابل تست واحد.
- موتور پشت یک واسط واحد است — مرز
PacketPipeline؛ swap بینnetstack(gVisor) وloopback(stub توسعه) در زمان build. - قوانین سیاست عمومی هستند — شرایط (شبکه/roaming/شارژ/باتری/صفحه/foreground/زمان/روز) × اعمال (Allow/Block/Throttle)؛
AppRuleکاربرپسند بهPolicyRuleهای عمومی کامپایل میشود. - قابلیت توسعه از طریق ماژولها — API پلاگین
TrafficModule(onFlowOpen/onBytes/onFlowClose)؛ افزودن quota/فیلتر دامنه بدون تغییر engine.
برای طراحی کامل به docs/ARCHITECTURE.md مراجعه کنید.
آخرین APK از پیش ساختهشده را از صفحه Releases دانلود کنید.
توجه: APK پیشفرض از موتور loopback استفاده میکند (UI را اجرا میکند ولی ترافیک را upstream ارسال نمیکند). برای شکلدهی واقعی ترافیک، باید با موتور netstack build کنید — به ساخت از سورس مراجعه کنید.
به بخش بعدی مراجعه کنید.
- JDK 17
- Android SDK (compileSdk 35)، minSdk 29 (Android 10)
- Android Studio Ladybug+ یا ابزارهای command-line
این یک APK قابل نصب با استفاده از موتور loopback Kotlin خالص تولید میکند. تونل را ایجاد میکند، UIDها را نسبت میدهد، آمار را ثبت میکند و UI را اجرا میکند — ولی ترافیک را upstream ارسال نمیکند (دوبل توسعه/CI).
git clone https://github.com/IEAmir/NetValve.git
cd NetValve
./gradlew :app:assembleDebugAPK در app/build/outputs/apk/debug/app-debug.apk خواهد بود.
موتور تولیدی یک bridge gVisor netstack است که با gomobile به AAR کامپایل شده است. این یک شکلدهنده ترافیک کاملاً کاربردی تولید میکند.
پیشنیازها:
- Go 1.22+ با
GOTOOLCHAIN=auto(به طور خودکار Go ≥1.25 را میگیرد) - Android NDK (نصب از طریق Android Studio یا
sdkmanager)
مراحل:
# ۱. تنظیم مسیر NDK
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/<version>
# ۲. ساخت AAR netstack
cd netstack
./build-aar.sh # → app/libs/netstack.aar (arm64, ~3.8 MB)
# ۳. ساخت اپ با موتور netstack
cd ..
./gradlew :app:assembleDebug -Pnetvalve.netstack=trueAPK در app/build/outputs/apk/debug/app-netstack-arm64-debug.apk خواهد بود.
برای تأیید build و پروتکل تست روی دستگاه به docs/NETSTACK_EVIDENCE.md مراجعه کنید.
# تستهای واحد (JVM، بدون نیاز به دستگاه)
./gradlew :app:testDebugUnitTest
# تستهای instrumentation (نیاز به emulator/دستگاه)
./gradlew :app:connectedDebugAndroidTestوضعیت فعلی: ۳۳/۳۳ تست واحد در ۷ suite پاس میشوند (token bucket, pacing queue, policy evaluator, rule compiler, UID resolver, persistence, formatting).
NetValve/
├── app/ اپ Android (Kotlin, Compose)
│ ├── src/
│ │ ├── main/kotlin/dev/netvalve/ کد اصلی اپلیکیشن
│ │ │ ├── ui/ صفحات Compose + ViewModelها
│ │ │ ├── service/ VpnService, VpnController, TrafficEngine
│ │ │ ├── network/ PacketPipeline, FlowSupervisor, UidResolver
│ │ │ ├── throttle/ TokenBucket, PacingQueue, ThrottleManager
│ │ │ ├── rules/ PolicyEngine, RuleCompiler, DeviceState
│ │ │ ├── module/ API پلاگین TrafficModule
│ │ │ ├── stats/ StatsCollector, ThroughputMeter
│ │ │ ├── log/ Logger (ring buffer + خروجی Room)
│ │ │ ├── data/ مدلها، DataStore، Room
│ │ │ ├── repository/ پیادهسازیهای DataStore/Room/PackageManager
│ │ │ ├── di/ ماژولهای Hilt
│ │ │ └── utils/ توابع کمکی فرمتبندی
│ │ ├── loopback/kotlin/ موتور توسعه Kotlin خالص (پیشفرض)
│ │ ├── netstack/kotlin/ آداپتور gVisor (تولیدی)
│ │ ├── test/ تستهای واحد JVM
│ │ └── androidTest/ تستهای instrumentation Compose
│ ├── libs/ AARهای تولیدشده (netstack.aar)
│ └── build.gradle.kts
├── netstack/ Bridge Go gVisor
│ ├── bridge.go bindings gomobile
│ ├── conn.go forwarderهای TCP/UDP
│ ├── build-aar.sh اسکریپت build AAR
│ └── go.mod
├── docs/ معماری، throttle، محدودیتها، توسعه
│ ├── ARCHITECTURE.md
│ ├── THROTTLING.md
│ ├── LIMITATIONS.md
│ ├── EXTENDING.md
│ ├── NETSTACK_EVIDENCE.md
│ └── sample-rules.json
├── gradle/ کاتالوگ نسخه + wrapper
├── README.md این فایل (انگلیسی)
├── README.fa.md نسخه فارسی
├── HANDOFF.md سند تحویل توسعهدهنده
├── LICENSE Apache-2.0
└── build.gradle.kts
NetValve برای سبک و کارآمد بودن طراحی شده است:
- +۳۰۰ اتصال TCP همزمان — یک جفت coroutine per flow روی
Dispatchers.IO؛ netstack چندگانه میکند؛ بدون thread-per-connection. - CPU بیکار < ۲٪ — توکنباکتهای lazy-refill (بدون تایمر)، pacing مبتنی بر suspend، نمونهگیری آمار ~۱ Hz، بدون حلقه busy.
- سربار throughput < ۵٪ بدون throttle — جهت نامحدود → توکنباکت
null→pace()فوری برمیگردد؛ تکههای relay ۱۶ KB. - RAM < ۵۰ MB عادی — بافرهای relay ۱۶ KB، صف محدود UDP (۲۵۶ KB)، جدول جریان + کش DNS با eviction محدود شده.
- بدون busy waiting — همه انتظارها
delay()/suspension هستند. - بدون ANR — بدون I/O در main thread (StrictMode در debug)؛
startForegroundفوری در START ارسال میشود.
برای پروتکل تست روی دستگاه به docs/LIMITATIONS.md مراجعه کنید.
صادقانه درباره آنچه یک کنترلکننده ترافیک غیر-root و محلی میتواند و نمیتواند انجام دهد:
- فقط یک VPN در یک زمان — Android فقط یک
VpnServiceفعال را مجاز میکند. شروع VPN دیگر NetValve را revoke میکند؛ NetValve باonRevokeبه طور graceful برخورد میکند. - مجموعه اپهای قابل کنترل در زمان establish ثابت است — ویرایش انتخاب در حین اجرا باعث بازسازی seamless تونل میشود. ویرایش کپ قوانین نیازی به بازسازی ندارد (بازخوانی زنده توکنباکت).
- نسبتدهی per-app از
getConnectionOwnerUid(API 29+) استفاده میکند، با یک زنجیره cache + fallback. در برخی ROMهای OEM ممکن است بخشی از جریانها در سطل Unknown قرار گیرند (با سیاست پیشفرض سراسری شکلدهی میشوند). - IPv6 همیشه به تونل هدایت میشود (تا نتواند از شکلدهی فرار کند)، با دو حالت:
RELAY(پیشفرض، شکلدهی کامل) یاFAST_REJECT(RST/ICMPv6 فوری برای جلوگیری از timeout).
- موتور Loopback ارسال نمیکند — build پیشفرض از یک stub Kotlin خالص برای CI/توسعه استفاده میکند. ارسال واقعی نیاز به ساخت AAR netstack (
./netstack/build-aar.sh) و فلگ-Pnetvalve.netstack=trueدارد. - بهینهسازی باتری باید در ROMهای OEM تهاجمی غیرفعال شود (Xiaomi/MIUI, Huawei/EMUI, Oppo/ColorOS, Vivo, Samsung/One UI). NetValve این را تشخیص میدهد و راهنمای vendor-specific ارائه میدهد.
- بدون VPN خارجی — همه ترافیک روی دستگاه میماند.
- بدون فیلتر دامنه هنوز (برنامهریزیشده) — اگرچه
DnsCache(IP→hostname) قبلاً جمعیتدهی شده و آمادهDomainFilterModuleاست. - بدون اعلان سهمیه per-app هنوز — زیرساخت آماده است (
warnThresholdPercent)، اما هنوز اعلانی ارسال نمیشود (عمداً به عنوان اولین تمرین API پلاگین باقی مانده).
برای لیست کامل به docs/LIMITATIONS.md مراجعه کنید.
- اعلانهای آستانه هشدار — اعلان وقتی اپ از آستانه مصرف فراتر رود
- فیلتر دامنه —
DomainFilterModuleبا استفاده ازDnsCacheموجود - سهمیههای per-app — کپ داده روزانه/ماهانه با اعلان
- شمارندههای retransmit Netstack — افشای
Stats()bridge Go به UI
- پنجرههای زمانی متعدد — UI جزئیات per-app برای بازههای زمانی متعدد
- پروفایلها — تغییر بین مجموعههای قانون (خانه/کار/سفر)
- Throttle تطبیقی — تنظیم خودکار کپ بر اساس شرایط شبکه
- بهبودهای IPv6 — heuristicهای fast-reject بهتر
- کنترلهای والدین — ماژولهای زمانبندی + دامنه با gate PIN
- نمودارهای تفصیلی per-app — بصریسازی throughput سری زمانی
- بومیسازی — انتقال رشتههای hard-coded به
strings.xml
مشارکتها خوشآمد هستند! چه:
- 🐛 گزارش باگ — issue با مراحل بازتولید باز کنید
- 💡 درخواست ویژگی — issue با توضیح مورد استفاده باز کنید
- 🔧 Pull Request — fork کنید، شاخه ویژگی بسازید، PR ارسال کنید
- 📖 مستندات — رفع اشتباه تایپی، روشنسازی، ترجمه
۱. Repo را fork کنید
۲. یک شاخه ویژگی بسازید (git checkout -b feature/amazing-feature)
۳. تغییرات خود را اعمال کنید
۴. تست اضافه کنید (در صورت لزوم)
۵. مطمئن شوید ./gradlew :app:testDebugUnitTest پاس میشود
۶. Commit کنید (git commit -m 'Add amazing feature')
۷. Push کنید (git push origin feature/amazing-feature)
۸. Pull Request باز کنید
برای نحوه افزودن شرایط، اعمال یا ماژولهای جدید به docs/EXTENDING.md مراجعه کنید.
- راهنمای سبک رسمی Kotlin
- هسته framework-free (rules, throttle, stats, log, module) باید روی JVM ساده قابل تست واحد باقی بماند
- APIهای عمومی نیاز به KDoc دارند
Copyright 2026 The NetValve Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
برای متن کامل به LICENSE مراجعه کنید.
NetValve شامل هیچ تبلیغات، ردیاب یا analytics نمیشود و به هیچ SDK اختصاصی وابسته نیست. مؤلفههای شخص ثالث (Kotlin, AndroidX/Jetpack Compose, Hilt/Dagger, Kotlin Coroutines/Serialization, gVisor, gmobile) تحت مجوزهای open-source مربوطه خود مجوز دارند.
- gVisor — استک TCP/IP userspace (از طریق fork
github.com/sagernet/gvisor) - gomobile — ابزار binding Go → Android
- AndroidX & Jetpack Compose — فریمورک UI
- Hilt — تزریق وابستگی
- Kotlin Coroutines — ناهمزمانی/همزمانی
docs/ARCHITECTURE.md— طراحی کامل معماریdocs/THROTTLING.md— نحوه کار throttle توکنباکت (با ریاضیات)docs/LIMITATIONS.md— محدودیتهای پلتفرم و tradeoffsdocs/EXTENDING.md— نحوه افزودن شرایط، اعمال یا ماژولهای جدیدdocs/NETSTACK_EVIDENCE.md— تأیید Build و تست روی دستگاهdocs/sample-rules.json— مجموعه قانون نمونهHANDOFF.md— سند تحویل توسعهدهنده (برای مشارکتکنندگان جدید)
اندروید اپلیکیشنهای فایروال عالی ارائه میدهد، اما پروژههای open-source بسیار کمی شکلدهی ترافیک دقیق per-application را بدون دسترسی root ارائه میدهند. NetValve برای کاوش این موضوع ساخته شد که VpnService اندروید تا چه حد میتواند پیش برود، در حالی که:
- ✅ سبک باقی میماند — <۵۰ MB RAM، <۲٪ CPU بیکار
- ✅ معماری ماژولار — خط لوله پلاگین برای ویژگیهای جدید
- ✅ شفاف — open-source، بدون telemetry، بدون سرور خارجی
- ✅ بدون Root — روی Android خام کار میکند
- ✅ درجه تولید — از gVisor netstack (TCP/IP تستشده در میدان) استفاده میکند
اگر میخواهید بدون به خطر انداختن حریم خصوصی یا کارایی، کنترل ترافیک شبکه دستگاه خود را به دست بگیرید، NetValve برای شماست.
⭐ اگر این پروژه را مفید یافتید، ستاره بدهید!