Как убрать рекламу в приложениях

лучший блокировщик рекламы

Как-то я купил смартфон и всем был доволен, кроме рекламы в некоторых приложениях. Да, есть функция, которая ее должна отключать, но полностью от нее избавиться не получается. По этой причине я почти не использовал телефон для просмотра сайтов, ведь в мобильных браузерах вообще нельзя включить блокировщики рекламы.

Последней каплей стало то, что я решил перехватить и анализировать трафик приложения Xiaomi MiFit и обнаружил в ответах серверов ссылки на странные APK-файлы (описывать их я не стану, это выходит за рамки статьи). Желающие могут самостоятельно перехватить злополучные запросы, тем более что они идут по обычному HTTP.

РЕКОМЕНДУЕМ:
Обзор лучших блокировщиков рекламы

Долго думать не пришлось, под рукой был свободный сервер с белым IP. Его я и решил использовать, чтобы развернуть VPN, а заодно и настроить там блокировку всего лишнего — единожды и для всех подключенных устройств.

Как убрать рекламу в приложениях на телефоне

Предполагается, что у тебя уже есть сервер с публичным IP-адресом, где установлен Linux: в моем случае это был Ubuntu 16.10. Представленные примеры будут работать и на других дистрибутивах Linux, с той разницей, что нужно будет адаптировать установку пакетов под твой пакетный менеджер.

Что делать со старой версией Ubuntu

Так получилось, что мне достался сервер с устаревшими ссылками на репозитории, а следовательно, при попытке обновиться я получал множество ошибок.

Попытка обновиться
Попытка обновиться

Google ненавязчиво подсказал мне, что репозитории были перемещены на поддомен old-releases. Исправляем и обновляемся:

Установка OpenVPN

Есть два пути:
+ простой — с использованием уже готового образа Docker (для тех, кто не хочет заморачиваться и вникать в конфиги OpenVPN);
+ сложный — с ручной установкой и конфигурированием OpenVPN.

Мы рассмотрим оба варианта и начнем с простого.

Docker-образ с OpenVPN

Скачиваем образ.

На гитхабе автора лежит достаточно полная документация в виде файла README. Им мы и воспользуемся. Для начала нам нужно создать файл конфигурации для сервера VPN.

Указываем тут протокол, в который будет оборачиваться трафик и белый IP твоего сервера. Давай посмотрим на полученный конфиг.

Если необходимо сменить порт, то меняем его в этом файле, а также в /etc/openvpn/ovpn_env.sh. Переходим к генерации сертификатов для удостоверяющего центра.

Будет запрошен пароль для создания ключа удостоверяющего центра.

Теперь генерируется сертификат и ключ сервера, ключи протокола Диффи — Хеллмана, а также подпись HMAC для проверки целостности TLS.

После этого мы должны добавить пользователей. Делается это так же просто.

В качестве CLIENTNAME я буду использовать имя хоста клиента (позже ты узнаешь, для чего это нужно). Создаем сертификат для пользователя user-pc, нас сразу же попросят указать пароль от сертификата удостоверяющего центра. Сертификат готов, но нам-то нужно получить файл конфигурации для OpenVPN. Выполняем следующую команду.

Смотрим на результат.

Ключи в формате Base64 намеренно убраны из вывода, чтобы уменьшить его содержимое. На этом все: запускаем OpenVPN в режиме демона.

На стороне клиента пробуем подключиться.

Если все прошло успешно, то в конце лога ты увидишь надпись Initialization Sequence Completed, а в списке интерфейсов появится tun0 с IP-адресом из подсети 192.168.255.0/24. Для наших целей этого вполне хватит, нужно только добавить команду на запуск контейнера в автозагрузку и переходить к части с настройкой DNS.

Ручная настройка OpenVPN

Второй вариант — это настроить OpenVPN полностью вручную. Поехали по шагам.

1. Устанавливаем OpenVPN.

2. Скачиваем easy-rsa.

3. Выставляем переменные для easy-rsa в файле /etc/openvpn/easy-rsa/easyrsa3/vars, остальное по желанию. Файл /etc/openvpn/easy-rsa/easyrsa3/vars.example содержит полный перечень доступных переменных, но нам хватит и этого.

4. Инициализация PKI.

5. Создание центра сертификации. Указываем пароль и Common Name.

6. Создание ключей сервера. Везде используем имя хоста как Common Name для создания сертификата.

7. Создание ключей клиента.

8. По желанию: если нужно сгенерировать ключи Диффи — Хеллмана и TLS.

На этом создание сертификатов завершено, переходим к написанию конфига для VPN-сервера /etc/openvpn/server.conf:

Плюс установки OpenVPN из репозитория еще и в том, что дополнительно он прописывается как сервис в systemctl. Подправим его для работы с нашим конфигом.

Получив путь к файлу, немного изменим его под наши нужды.

Запускаем сервис.

И проверяем на ошибки.

В прошлом примере с Docker у нас была возможность получить конфиг клиента одной командой. Пора написать для этого скрипт.

Описывать его не вижу необходимости: тут все то же самое, а за подробностями можешь заглянуть в man openvpn.

Теперь, когда у нас готов сервер VPN и настроено подключение клиентов, пора приступать к конфигурации сервера DNS.

Unbound

Выбор на него пал по нескольким причинам:

  • есть поддержка DNSSEC;
  • умеет кешировать;
  • можно настроить DoT (DNS over TLS);
  • очень прост в конфигурировании;
  • большая скорость работы и малый размер по сравнению с BIND.

Компиляция Unbound DNS Resolver

Скачиваем с GitHub последнюю версию Unbound, устанавливаем зависимости.

Теперь можно приступать к компиляции.

Тут мы указываем:

  • --with-conf-file — стандартный путь к файлу конфигурации;
  • --enable-dnscrypt — включаем поддержку dnssec;
  • --with-rootkey-file — путь к файлу с доверенными ключами;
  • --enable-dnstap — включаем поддержку dnstap.

После успешной сборки нам осталось добавить пару нюансов. Во-первых, создать пользователя.

Во-вторых, добавить сервис /lib/systemd/system/unbound.service. Его содержимое будет таким.

Добавим якорь в tmpfiles.d.

Конфигурация DNS over TLS

DoT добавит нам больше конфиденциальности и позволит защититься от спуфинга. Ниже пример файла конфигурации /etc/unbound/unbound.conf.

Конфиг готов! Создадим файл ключей /etc/unbound/trusted-key.key для DNSSEC.

Союз с NetworkManager

Для обновления файла /etc/resolv.conf нам потребуется утилита openresolv. Создадим для нее конфиг /etc/resolvconf.conf.

Тут мы указываем путь к resolv.conf и адрес DNS по умолчанию для всей системы. Командой $ resolvconf -u обновляем resolv.conf, чтобы в него добавились изменения. Если ты подключаешься к интернету при помощи NetworkManager, то для того, чтобы он тоже использовал openresolv, нужно поправить файл /etc/NetworkManager/conf.d/rc-manager.conf:

Запуск Unbound

Запускаем резолвер командой

После этого все должно работать.

Важно убедиться, что перед запуском Unbound у тебя отключены другие DNS-серверы или резолверы! Возможные ошибки и их причину можешь узнать, написав journalctl -xeu unbound.

Блокировка рекламы

Переходим к самой важной части всего нашего процесса. Поискав информацию в Сети и посмотрев фильтры uBlock, который установлен в моем браузере, я нашел несколько списков с доменами:

Создаем скрипт /etc/unbound/local.d/update_ads_filters.py, который будет это все парсить и генерировать правила для нашего Unbound.

Тут все очень просто: для каждого домена создается следующая запись.

Как потом выяснилось, можно вместо редиректа на 127.0.0.1 использовать более простую запись и возвращать NXDOMAIN. Если коротко, то это означает, что запрашиваемый домен не существует.

Добавляем этот скрипт в crontab с периодом запуска не чаще одного раза в неделю (не думаю, что домены будут обновляться чаще) и запускаем.

Дополнительно создадим еще один скрипт /etc/unbound/insert_filter_domain.sh, который позволит вручную блокировать необходимые домены. Я с его помощью добавил Яндекс.Метрику.

Добавляем резолвинг DNS для клиентов

Все может работать и без этого, но приятно будет вместо обращения по IP использовать короткий адрес, который легко запомнить. Есть и еще одна причина: все клиенты при подключении получают IP-адреса от встроенного в OpenVPN сервера DHCP и каждый раз эти адреса могут меняться.

Это можно было бы решить, прописав все IP статически, или вместо интерфейса TUN для OpenVPN использовать TAN и развернуть сверху собственный сервер DHCP, но это не наш путь. Мы воспользуемся тем, что у нас есть, а заодно и узнаем некоторые особенности OpenVPN.

Для начала нам нужно обновить конфиг OpenVPN (файл /etc/openvpn/server.conf), добавив туда следующие строки:

Сам скрипт /etc/openvpn/connect.sh выглядит так.

Из мануала по OpenVPN можно узнать, что для запускаемых им скриптов и команд доступны некоторые глобальные переменные:

  • script_type — событие, вызвавшее запуск скрипта, доступны варианты up, down, ipchange, route-up, tls-verify, auth-user-pass-verify, client-connect, client-disconnect и learn-address;
  • common_name — поле Common Name из сертификата клиента. Помни, что при генерации сертификатов мы указывали там имя хоста;
  • ifconfig_pool_remote_ip — внутренний IP клиента.

Функции add_to_unbound() и del_from_unbound(), используя интерфейс удаленного управления конфигурацией Unbound, добавляют записи, которые резолвят имена хостов клиентов.

Дополнительно создадим файл /etc/unbound/local.d/localzone.conf, который будет содержать записи для резолва имени текущего сервера и всей подсети в целом.

Итог

На этом настройка нашей системы фильтрации закончена. Устанавливаем на телефон OpenVPN, подключаемся и проверяем. Вот как результаты выглядят в браузере.

Результаты до и после
Результаты до и после
Результаты до и после

В приложении MiFit.

И Avito.

Идеально!

Понравилась статья? Поделиться с друзьями:
Добавить комментарий