Как реализовать локальный VPN в Android для фильтрации контента без зависимости от сервера?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как реализовать локальный VPN в Android для фильтрации контента без зависимости от сервера?

Сообщение Anonymous »

Я работаю над приложением для Android, которое требует создания локальной VPN для маршрутизации всего сетевого трафика устройств в целях фильтрации контента. Вместо использования удаленного VPN-сервера моя цель — разработать VPN-сервис, который будет работать локально на устройстве.
Вот ключевые аспекты того, чего я пытаюсь достичь:
Вот ключевые аспекты того, чего я пытаюсь достичь:
Вот ключевые аспекты того, чего я пытаюсь достичь:
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 = {})
}
}
MyVpnService:

Код: Выделить всё

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}")
}
}
}
AndroidmanifestXml:
` `
Проблема:
После запуска службы VPN сетевое подключение не работает, и я вижу ошибку «нет подключения к Интернету». Служба VPN запускается, но устройство не может получить доступ к Интернету или правильно маршрутизировать трафик. введите описание изображения здесь
Вопрос:
Как решить проблему с неработающим сетевым подключением после запуска VPN услуга? Требуются ли определенные настройки или дополнительные действия, чтобы VPN правильно маршрутизировала и фильтровала сетевой трафик на устройстве?

Не стесняйтесь настраивать или расширять при необходимости задайте вопрос.
Предпринятые действия по устранению неполадок:
  • Проверенная конфигурация VPN (IP-адрес , маршрутизация и DNS).
  • Проверены журналы на наличие ошибок, связанных с настройкой VPN.
  • Протестированы минимальные конфигурации VPN для выявления проблем.
  • Гарантируется правильность настройки сети устройства при активном VPN.


Подробнее здесь: https://stackoverflow.com/questions/788 ... server-dep
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»