diff --git a/.gitignore b/.gitignore index f1db91b..d31ddbe 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,11 @@ bin/ !dist/**/ configs/config.json configs/remnawave-api.json +configs/account.json dist/navis-release/windows/configs/ +# Runtime-downloaded protocol cores + local packaging artifact (not release sources) +dist/navis-release/windows/bin/ +dist/navis-release/navis-release.zip configs/.navis-webview/ cmd/vpnapp/resource.syso *.syso diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 09a59cc..67ddd0c 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -13,8 +13,8 @@ android { minSdk = 26 targetSdk = 35 // versionCode = major*1_000_000 + minor*10_000 + patch*100 + build - versionCode = 3_090_001 - versionName = "3.9.0+1" + versionCode = 3_100_001 + versionName = "3.10.0+1" vectorDrawables.useSupportLibrary = true ndk { abiFilters += listOf("arm64-v8a", "armeabi-v7a", "x86_64") diff --git a/cmd/vpnapp/main_windows.go b/cmd/vpnapp/main_windows.go index 887dfbe..cf49fd2 100644 --- a/cmd/vpnapp/main_windows.go +++ b/cmd/vpnapp/main_windows.go @@ -61,6 +61,10 @@ type uiState struct { Hy2 core.Hy2Options `json:"hy2"` StorePackaged bool `json:"store_packaged,omitempty"` ProvisionReady bool `json:"provision_ready,omitempty"` + Account *remnawave.Account `json:"account,omitempty"` + Mode string `json:"mode"` + VPNSupported bool `json:"vpn_mode_supported"` + VPNActive bool `json:"vpn_active"` } func main() { @@ -107,14 +111,15 @@ func main() { // Do NOT auto-download cores on startup — silent network+write looks like malware to AV. + // Sidebar layout (Hiddify-style) needs a wider window than the old column UI. w := webview2.NewWithOptions(webview2.WebViewOptions{ Debug: false, AutoFocus: true, DataPath: dataPath, WindowOptions: webview2.WindowOptions{ Title: "Navis 2", - Width: 500, - Height: 900, + Width: 920, + Height: 680, Center: true, IconId: 1, }, @@ -129,7 +134,7 @@ func main() { }() applyWindowIcon(w.Window()) - w.SetSize(500, 900, webview2.HintNone) + w.SetSize(920, 680, webview2.HintNone) mustBind(w, "getState", a.getState) mustBind(w, "connect", a.connect) @@ -150,8 +155,12 @@ func main() { mustBind(w, "saveRemnawave", a.saveRemnawave) mustBind(w, "importRemnawave", a.importRemnawave) mustBind(w, "provisionUser", a.provisionUser) + mustBind(w, "renewAccount", a.renewAccount) + mustBind(w, "setMode", a.setMode) + mustBind(w, "getLogs", a.getLogs) go a.autoCheckUpdate() + mgr.StartAutoRenew(6 * time.Hour) w.SetHtml(appui.IndexHTML) w.Run() @@ -221,6 +230,10 @@ func (a *app) getState() (uiState, error) { Hy2: a.mgr.ActiveHy2Options(), StorePackaged: update.IsStorePackaged(), ProvisionReady: a.mgr.ProvisionConfigured(), + Account: a.mgr.Account(), + Mode: a.mgr.Mode(), + VPNSupported: a.mgr.VPNModeSupported(), + VPNActive: st.VPNActive, } if out.Protocol == "" { if p, err := cfg.ActiveProfile(); err == nil { @@ -348,6 +361,26 @@ func (a *app) provisionUser(username string) (core.ProvisionOutcome, error) { return a.mgr.ProvisionAccess(username) } +func (a *app) renewAccount() (core.ProvisionOutcome, error) { + return a.mgr.RenewAccount() +} + +func (a *app) setMode(mode string) error { + return a.mgr.SetMode(strings.TrimSpace(mode)) +} + +func (a *app) getLogs() (string, error) { + if a.logBuf == nil { + return "", nil + } + const maxTail = 64 * 1024 + b := a.logBuf.Bytes() + if len(b) > maxTail { + b = b[len(b)-maxTail:] + } + return string(b), nil +} + type pingBestResult struct { Pings []netcheck.Result `json:"pings"` BestName string `json:"best_name,omitempty"` diff --git a/dist/navis-release/update.json b/dist/navis-release/update.json index ccf972b..39887e5 100644 --- a/dist/navis-release/update.json +++ b/dist/navis-release/update.json @@ -1,16 +1,16 @@ { - "version": "3.9.0", - "notes": "3.9.0+3: fix pasting a subscription URL into the server-link field (no more 'proxy URI missing username'), RU country names + city hints for emoji flags, admin provisioning via Remnawave API («Выдать доступ», configs/remnawave-api.json). Windows 3.9.0.3.", + "version": "3.10.0", + "notes": "3.10.0+1: новый интерфейс с боковым меню (Главная / Профили / Настройки / Логи / О программе), аккаунт с продлением 50 ГБ / +30 дней и автопродлением, режим VPN на Windows (TUN, весь трафик, нужны права администратора и wintun.dll). Windows 3.10.0.1.", "platform": "windows-amd64", "os": "windows", "arch": "amd64", "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/windows/Navis.exe", - "sha256": "cddcfa9b2748ec951ec3265b99cdd79e5f0947370f88f28c10edf6ed28e3996d", + "sha256": "2d1face047cf2fa8e6479c2e078495fff6233c28baa4d4c7cab0cef39d065d30", "mandatory": false, "platforms": { "windows-amd64": { "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/windows/Navis.exe", - "sha256": "cddcfa9b2748ec951ec3265b99cdd79e5f0947370f88f28c10edf6ed28e3996d", + "sha256": "2d1face047cf2fa8e6479c2e078495fff6233c28baa4d4c7cab0cef39d065d30", "os": "windows", "arch": "amd64" }, diff --git a/dist/navis-release/windows/Navis.exe b/dist/navis-release/windows/Navis.exe index ba43683..6fe2e86 100644 Binary files a/dist/navis-release/windows/Navis.exe and b/dist/navis-release/windows/Navis.exe differ diff --git a/dist/navis-release/windows/vpnclient.exe b/dist/navis-release/windows/vpnclient.exe index 143a91c..d05ff91 100644 Binary files a/dist/navis-release/windows/vpnclient.exe and b/dist/navis-release/windows/vpnclient.exe differ diff --git a/dist/update.json b/dist/update.json index ccf972b..39887e5 100644 --- a/dist/update.json +++ b/dist/update.json @@ -1,16 +1,16 @@ { - "version": "3.9.0", - "notes": "3.9.0+3: fix pasting a subscription URL into the server-link field (no more 'proxy URI missing username'), RU country names + city hints for emoji flags, admin provisioning via Remnawave API («Выдать доступ», configs/remnawave-api.json). Windows 3.9.0.3.", + "version": "3.10.0", + "notes": "3.10.0+1: новый интерфейс с боковым меню (Главная / Профили / Настройки / Логи / О программе), аккаунт с продлением 50 ГБ / +30 дней и автопродлением, режим VPN на Windows (TUN, весь трафик, нужны права администратора и wintun.dll). Windows 3.10.0.1.", "platform": "windows-amd64", "os": "windows", "arch": "amd64", "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/windows/Navis.exe", - "sha256": "cddcfa9b2748ec951ec3265b99cdd79e5f0947370f88f28c10edf6ed28e3996d", + "sha256": "2d1face047cf2fa8e6479c2e078495fff6233c28baa4d4c7cab0cef39d065d30", "mandatory": false, "platforms": { "windows-amd64": { "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/windows/Navis.exe", - "sha256": "cddcfa9b2748ec951ec3265b99cdd79e5f0947370f88f28c10edf6ed28e3996d", + "sha256": "2d1face047cf2fa8e6479c2e078495fff6233c28baa4d4c7cab0cef39d065d30", "os": "windows", "arch": "amd64" }, diff --git a/go.mod b/go.mod index 5c0121b..f15a98f 100644 --- a/go.mod +++ b/go.mod @@ -1,13 +1,15 @@ module vpnclient -go 1.25.0 +go 1.26.3 require ( github.com/amnezia-vpn/amneziawg-go v0.2.19 github.com/diskfs/go-diskfs v1.9.4 github.com/jchv/go-webview2 v0.0.0-20260205173254-56598839c808 + github.com/xjasonlyu/tun2socks/v2 v2.7.0 golang.org/x/image v0.44.0 - golang.org/x/sys v0.43.0 + golang.org/x/sys v0.46.0 + gvisor.dev/gvisor v0.0.0-20260701204157-69c2d17aea96 ) require ( @@ -22,9 +24,13 @@ require ( github.com/pkg/xattr v0.4.12 // indirect github.com/sirupsen/logrus v1.9.4 // indirect github.com/ulikunitz/xz v0.5.15 // indirect - golang.org/x/crypto v0.42.0 // indirect - golang.org/x/net v0.44.0 // indirect - golang.org/x/time v0.9.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.28.0 // indirect + golang.org/x/crypto v0.53.0 // indirect + golang.org/x/exp v0.0.0-20260611194520-c48552f49976 // indirect + golang.org/x/net v0.56.0 // indirect + golang.org/x/time v0.15.0 // indirect golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect - gvisor.dev/gvisor v0.0.0-20231202080848-1f7806d17489 // indirect + golang.zx2c4.com/wireguard v0.0.0-20260522210424-ecfc5a8d5446 // indirect ) diff --git a/go.sum b/go.sum index 64e466e..c4d26d1 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,8 @@ github.com/amnezia-vpn/amneziawg-go v0.2.19 h1:l3rOmrA4o5z38kpgnA5iSk1yOm7Cv3Aaf github.com/amnezia-vpn/amneziawg-go v0.2.19/go.mod h1:aMgOk9MuX0xI7b5TKAYp8pLM54RlXcOPzDvYw3YEO5A= github.com/anchore/go-lzo v0.1.0 h1:NgAacnzqPeGH49Ky19QKLBZEuFRqtTG9cdaucc3Vncs= github.com/anchore/go-lzo v0.1.0/go.mod h1:3kLx0bve2oN1iDwgM1U5zGku1Tfbdb0No5qp1eL1fIk= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/diskfs/go-diskfs v1.9.4 h1:0j2d7eG4IjyxL6+ChWbDPocdBCF6HQ4HBWU2WDYWVnc= github.com/diskfs/go-diskfs v1.9.4/go.mod h1:TePJORO83Adh5pb2SqsxAwaP0fofFxKLkxctiS/9OQc= github.com/djherbis/times v1.6.0 h1:w2ctJ92J8fBvWPxugmXIv7Nz7Q3iDMKNx9v5ocVH20c= @@ -32,29 +32,43 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/xjasonlyu/tun2socks/v2 v2.7.0 h1:fYEN0Q1sSanuoID8xvUTsMODbKLJJH/J5ywYoMRxIPw= +github.com/xjasonlyu/tun2socks/v2 v2.7.0/go.mod h1:XHgJ3wbs63mZxGbJawt6jjNX65aPDl+Qhn2ePPEE4KI= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= -golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.28.0 h1:IZzaP1Fv73/T/pBMLk4VutPl36uNC+OSUh3JLG3FIjo= +go.uber.org/zap v1.28.0/go.mod h1:rDLpOi171uODNm/mxFcuYWxDsqWSAVkFdX4XojSKg/Q= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= +golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= +golang.org/x/exp v0.0.0-20260611194520-c48552f49976 h1:X8Hz2ImujgbmetVuW+w2YkyZChE3cBpZi2P158rTG9M= +golang.org/x/exp v0.0.0-20260611194520-c48552f49976/go.mod h1:vnf4pv9iKZXY58sQE1L86zmNWJ4159e1RkcWiLCkeEY= golang.org/x/image v0.44.0 h1:+tDekMZED9+LrtB3G5xzRggpVh9CARjZqROla3R3R+I= golang.org/x/image v0.44.0/go.mod h1:V8K3KE9KKKE+pLpQDOeN18w9oacNSvy1tDOirTu4xtY= -golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= -golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= +golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= +golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210218145245-beda7e5e158e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= -golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= -golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= +golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 h1:B82qJJgjvYKsXS9jeunTOisW56dUokqW/FOteYJJ/yg= golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI= +golang.zx2c4.com/wireguard v0.0.0-20260522210424-ecfc5a8d5446 h1:cqHQ3AycTHvM2R7ikgyX57D+XvtcSnGylsLkOVhta/w= +golang.zx2c4.com/wireguard v0.0.0-20260522210424-ecfc5a8d5446/go.mod h1:rpwXGsirqLqN2L0JDJQlwOboGHmptD5ZD6T2VmcqhTw= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gvisor.dev/gvisor v0.0.0-20231202080848-1f7806d17489 h1:ze1vwAdliUAr68RQ5NtufWaXaOg8WUO2OACzEV+TNdE= -gvisor.dev/gvisor v0.0.0-20231202080848-1f7806d17489/go.mod h1:10sU+Uh5KKNv1+2x2A0Gvzt8FjD3ASIhorV3YsauXhk= +gvisor.dev/gvisor v0.0.0-20260701204157-69c2d17aea96 h1:LZXOf4NwvAwUy/eI8P+Y3DUdYLyaCEDNPEjsL2OP2ro= +gvisor.dev/gvisor v0.0.0-20260701204157-69c2d17aea96/go.mod h1:8aLQqUBHDH8fY5y60lzmwDpMMbQCcT3EBfoSwhfaGCY= diff --git a/internal/apphost/app.go b/internal/apphost/app.go index 3ee9417..4d6748e 100644 --- a/internal/apphost/app.go +++ b/internal/apphost/app.go @@ -59,6 +59,10 @@ type UIState struct { Hy2 core.Hy2Options `json:"hy2"` StorePackaged bool `json:"store_packaged,omitempty"` ProvisionReady bool `json:"provision_ready,omitempty"` + Account *remnawave.Account `json:"account,omitempty"` + Mode string `json:"mode"` + VPNSupported bool `json:"vpn_mode_supported"` + VPNActive bool `json:"vpn_active"` } type PingBestResult struct { @@ -70,6 +74,8 @@ type PingBestResult struct { } func New(mgr *core.Manager, cfgPath string, logBuf *bytes.Buffer) *App { + // Monthly plan upkeep: check at start and then periodically. + mgr.StartAutoRenew(6 * time.Hour) return &App{ Mgr: mgr, CfgPath: cfgPath, @@ -139,6 +145,10 @@ func (a *App) GetState() (UIState, error) { Hy2: a.Mgr.ActiveHy2Options(), StorePackaged: update.IsStorePackaged(), ProvisionReady: a.Mgr.ProvisionConfigured(), + Account: a.Mgr.Account(), + Mode: a.Mgr.Mode(), + VPNSupported: a.Mgr.VPNModeSupported(), + VPNActive: st.VPNActive, } if out.Protocol == "" { if p, err := cfg.ActiveProfile(); err == nil { @@ -259,6 +269,27 @@ func (a *App) ProvisionUser(username string) (core.ProvisionOutcome, error) { return a.Mgr.ProvisionAccess(username) } +func (a *App) RenewAccount() (core.ProvisionOutcome, error) { + return a.Mgr.RenewAccount() +} + +func (a *App) SetMode(mode string) error { + return a.Mgr.SetMode(strings.TrimSpace(mode)) +} + +// GetLogs returns the tail of the core log buffer for the «Логи» page. +func (a *App) GetLogs() (string, error) { + if a.LogBuf == nil { + return "", nil + } + const maxTail = 64 * 1024 + b := a.LogBuf.Bytes() + if len(b) > maxTail { + b = b[len(b)-maxTail:] + } + return string(b), nil +} + func (a *App) PingServers() ([]netcheck.Result, error) { return a.runPings() } @@ -519,6 +550,12 @@ func (a *App) dispatch(name string, args []json.RawMessage) (any, error) { return a.ImportRemnawave(s) case "provisionUser": return a.ProvisionUser(arg(args, 0, "")) + case "renewAccount": + return a.RenewAccount() + case "setMode": + return nil, a.SetMode(arg(args, 0, "")) + case "getLogs": + return a.GetLogs() case "quit": go func() { time.Sleep(200 * time.Millisecond) diff --git a/internal/appui/index.html b/internal/appui/index.html index 4575d50..0094648 100644 --- a/internal/appui/index.html +++ b/internal/appui/index.html @@ -22,7 +22,7 @@ -
-
- Доступно обновление -

-
- - -
-
- -
- -
-
-

Navis

- 3.9.0 +
+ +
-
-
-
- - Отключено -
- протокол +
+
+ Navis +
-
- -
-

Выберите профиль и нажмите Подключить

-
+ -
-
-
Серверы
-
- - - - + +
+
+ Доступно обновление +

+
+ +
- -
- -
- Редактировать / подписка / Remnawave -
-
- - -
-
- - -
-
- -
- - +
+ +
+
+ +
+ + Отключено +
+
+ протокол + +
+

Выберите профиль и нажмите на кнопку

+
+ + + + + + + +
+ + +
+

Профили

+
+
Серверы
+
+ + + +
-
-
Remnawave API
-

Панель → short UUID пользователя. Токен API — опционально (для /api/subscriptions/… и /users/…).

-
- - +
+ + +
+ Редактировать / подписка +
+
+ + +
+
+ + +
+
+ +
+ + +
+
+
-
- - -
-
- - -
-
- - -
-
- - -
-
+
+ + - -
- -
+ - + +
+

Настройки

-
- Системный прокси - +
+
Режим трафика
+
+ + +
+

Прокси — трафик идёт через локальный прокси (и системный прокси Windows). VPN — весь трафик, включая игры и приложения, через TUN-адаптер; нужны права администратора и wintun.dll рядом с Navis.exe. Меняется в отключённом состоянии.

+
+ +
+ Системный прокси + В режиме VPN не используется — TUN и так захватывает всё + + +
+ +
+ Тёмная тема + +
+ +
+ Авто-лучший сервер + Пинг всех серверов и автоподключение к лучшему + + +
+ +
+ Hysteria 2 · BBR / obfuscation +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+ +
+ Remnawave API +
+

Панель → short UUID пользователя. Токен API — опционально (для /api/subscriptions/… и /users/…).

+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+ Сервис · cores, обновления +
+ + +
+ +
+
+ + +
+

Логи

+
Пусто — подключитесь, чтобы увидеть логи ядра.
+
+ + +
+
+ + +
+

О программе

+
+ +

Navis

+

версия…

+

VPN/прокси-клиент: Remnawave · Naive · Hysteria 2 · AWG · Xray

+
+
+ +
+
+

Нужен доступ?

+

Ключи и тарифы на evilfox.win — демо от 30₽.

+ + +
+ +
+ + +

Загрузка…

- -
- Hysteria 2 · BBR / obfuscation -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - - -
- -
- Сервис · cores, обновления -
- - -
- -
- -

Загрузка…

- -
-

Нужен доступ?

-

Ключи и тарифы на evilfox.win — демо от 30₽.

- - -
-

Navis

- -
+