Вот ключевые аспекты того, чего я пытаюсь достичь:
Вот ключевые аспекты того, чего я пытаюсь достичь:
Вот ключевые аспекты того, чего я пытаюсь достичь:
p>
- Настройка локального VPN:
- Создание и управлять службой VPN локально на устройстве Android с помощью Kotlin.
- Настройте параметры VPN, такие как IP-адрес, маршрутизацию и DNS-серверы.
- Фильтрация контента:
- Перехват и фильтрация HTTP-трафика маршрутизируется через локальную VPN.
- Внедрите правила фильтрации, чтобы блокировать или разрешать определенный контент.
- Управление жизненным циклом VPN:
- Запуск и остановка службы VPN на основе действий пользователя (т. е. « Кнопки «Включить VPN» и «Отключить VPN»).
Вот упрощенная версия моих MainActivity и MyVpnService:
MainActivity:
Код: Выделить всё
package com.example.adblocker
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.SharedPreferences
import android.net.VpnService
import android.os.Bundle
import android.preference.PreferenceManager
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.example.adblocker.ui.theme.AdblockerTheme
class MainActivity : ComponentActivity() {
private var websiteList by mutableStateOf(emptyList())
private lateinit var sharedPreferences: SharedPreferences
private val websiteReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val newWebsites = intent?.getStringArrayListExtra("websiteList") ?: emptyList()
websiteList = newWebsites
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
setContent {
AdblockerTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
VpnScreen(
websiteList = websiteList,
onStartVpnClick = { startVpnService() },
onStopVpnClick = { stopVpnService() }
)
}
}
}
registerReceiver(websiteReceiver, IntentFilter("com.example.adblocker.UPDATE_WEBSITES"))
}
override fun onDestroy() {
super.onDestroy()
unregisterReceiver(websiteReceiver)
}
private fun startVpnService() {
val vpnIntent = VpnService.prepare(this)
if (vpnIntent != null) {
startActivityForResult(vpnIntent, 0)
} else {
onActivityResult(0, RESULT_OK, null)
}
}
private fun stopVpnService() {
val intent = Intent(this, MyVpnService::class.java)
stopService(intent)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == 0 && resultCode == RESULT_OK) {
val intent = Intent(this, MyVpnService::class.java)
startService(intent)
}
}
}
@Composable
fun VpnScreen(
websiteList: List,
onStartVpnClick: () -> Unit,
onStopVpnClick: () -> Unit
) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
text = "AdBlocker VPN",
style = MaterialTheme.typography.titleLarge,
modifier = Modifier.padding(bottom = 20.dp)
)
Button(onClick = onStartVpnClick) {
Text(text = "Enable VPN")
}
Spacer(modifier = Modifier.height(20.dp))
Button(onClick = onStopVpnClick) {
Text(text = "Disable VPN")
}
Spacer(modifier = Modifier.height(20.dp))
LazyColumn(
modifier = Modifier
.fillMaxWidth()
.weight(1f)
) {
items(websiteList) { website ->
Text(text = website)
}
}
}
}
@Preview(showBackground = true)
@Composable
fun VpnScreenPreview() {
AdblockerTheme {
VpnScreen(websiteList = emptyList(), onStartVpnClick = {}, onStopVpnClick = {})
}
}
Код: Выделить всё
package com.example.adblocker
import android.net.VpnService
import android.os.ParcelFileDescriptor
import android.util.Log
class MyVpnService : VpnService() {
private var vpnInterface: ParcelFileDescriptor? = null
override fun onCreate() {
super.onCreate()
startVpn()
}
override fun onDestroy() {
super.onDestroy()
vpnInterface?.close()
}
private fun startVpn() {
try {
val builder = Builder()
builder.setSession("My VPN Service")
builder.addAddress("10.0.0.2", 24) // Local VPN IP address
builder.addRoute("0.0.0.0", 0) // Route all traffic through the VPN
builder.addDnsServer("8.8.8.8") // DNS server for name resolution
builder.addDnsServer("8.8.4.4") // Optional additional DNS server
vpnInterface = builder.establish()
Log.d("MyVpnService", "VPN started with address 10.0.0.2")
} catch (e: Exception) {
e.printStackTrace()
Log.e("MyVpnService", "Error starting VPN: ${e.message}")
}
}
}
`
Код: Выделить всё
Проблема:
После запуска службы VPN сетевое подключение не работает, и я вижу ошибку «нет подключения к Интернету». Служба VPN запускается, но устройство не может получить доступ к Интернету или правильно маршрутизировать трафик. введите описание изображения здесь
Вопрос:
Как решить проблему с неработающим сетевым подключением после запуска VPN услуга? Требуются ли определенные настройки или дополнительные действия, чтобы VPN правильно маршрутизировала и фильтровала сетевой трафик на устройстве?
Не стесняйтесь настраивать или расширять при необходимости задайте вопрос.
Предпринятые действия по устранению неполадок:
- Проверенная конфигурация VPN (IP-адрес , маршрутизация и DNS).
- Проверены журналы на наличие ошибок, связанных с настройкой VPN.
- Протестированы минимальные конфигурации VPN для выявления проблем.
- Гарантируется правильность настройки сети устройства при активном VPN.
Подробнее здесь: https://stackoverflow.com/questions/788 ... server-dep
Мобильная версия