Xamarin Android - VpnService блокирует все приложения - PullRequest
0 голосов
/ 21 мая 2018

Приложение, которое я разрабатываю, использует VpnService вместе с VpnService.Builder, классы для генерации VPN, чтобы блокировать трафик от определенных приложений.Согласно документации на developer.android.com, все приложения должны быть разрешены через VPN, пока не будет вызван Builder.AddAllowedApplication или Builder.AddDisallowedApplication.

Когда по какой-то причине моя служба VPN запускается, все приложениязапрещено, что странно.Как только я отключаюсь от VPN, все приложения снова становятся доступными.Мне нужно разрешить все, если не указано иное (что и должно быть в документации).Я запускаю VPN, позвонив по следующему номеру:

    private string _sTag = typeof(VpnService).Name;
    private VpnServiceBinder _objBinder;
    private ParcelFileDescriptor _objVpnInterface = null;
    private PendingIntent _objPendingIntent = null;
    ...

        if (_objVpnInterface == null)
        {
            Builder objVpnBuilder = new Builder(this);
            objVpnBuilder.AddAddress("10.0.0.2", 32);
            objVpnBuilder.AddRoute("0.0.0.0", 0);

            // Form the interface
            _objVpnInterface = objVpnBuilder.SetSession("Squelch").SetConfigureIntent(_objPendingIntent).Establish();

            // Disallow instagram as a test
            objVpnBuilder.AddDisallowedApplication("com.instagram.android");

            // Set flag
            _bVpnIsRunning = true;
        }

Таким образом, в приведенном выше примере instagram должен быть единственным заблокированным приложением, но кажется, что весь трафик заблокирован (невозможно использовать приложение chrome, facebook,так далее).Есть ли что-то, что мне не хватает в отношении этого?Должен ли я что-то указывать до / после установки интерфейса?Буду очень признателен за любую помощь или направление!

Примечание: в случае, если это имеет значение, я нацеливаюсь на Android 6.0 и выше.Я могу предоставить больше источника, если требуется.

1 Ответ

0 голосов
/ 22 мая 2018

addDisallowedApplication:

По умолчанию всем приложениям разрешен доступ, кроме тех, которые запрещены этим методом.Запрещенные приложения будут использовать сеть, как если бы VPN не работал.

AddDisallowedApplication исключает приложение из вашего VPNService и позволяет ему продолжать использовать "не-VPN "сетевой стек.

addAllowedApplication:

Добавляет приложение, которому разрешен доступ к VPN-подключению

Примечание. Вы можете использоватьсписок запрещен, но не оба одновременно.

Допустим, мы хотим «заблокировать» любой пакет Chrome от доступа к обычному сетевому стеку и перенаправить любые приложения Chrome на доступ к сети через нашу «блокирующую» VPN., мы можем добавить все имена пакетов приложений Chrome в нашу VPNService реализацию.

Примечание: есть 4 (?) различных приложения Chrome, альфа, бета и т. д., поэтому давайте просто заблокируем любой пакет, которыйимеет имя chrome, не совсем идеальное, но для примера оно работает.

using (var pm = Application.Context.PackageManager)
{
    var packageList = pm.GetInstalledPackages(0);
    foreach (var package in packageList)
    {
        if (package.PackageName.Contains("chrome"))
        {
            Log.Debug(TAG, package.PackageName);
            builder.AddAllowedApplication(package.PackageName);
        }
    }
}

После подключения .Establish() VPN все сетевые приложения Chrome будут перенаправлены на ваш VPNServiceи, таким образом, заблокирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...