WireGuard на Android работает через официальный клиент, который использует реализацию протокола в userspace (wireguard-go) или ядро устройства, если оно поддерживает модуль. Клиент принимает конфигурацию в том же формате, что и десктопные версии, но мобильная ОС накладывает ограничения на маршрутизацию, фоновую работу и обработку DNS. Ниже — полный цикл настройки и разбор типичных проблем.
Официальное приложение доступно в Google Play и в репозитории F-Droid. Пакет называется
Альтернативные клиенты с поддержкой WireGuard:
Для большинства задач достаточно официального клиента. Альтернативы нужны, когда провайдер блокирует сам протокол по сигнатурам.
Клиент поддерживает три способа добавления туннеля:
Файл конфигурации можно передать на устройство любым способом (мессенджер, облако, USB) и открыть через приложение. Формат файла идентичен десктопному:
Многие серверные панели (например, wg-easy, Amnezia) генерируют QR-код с конфигурацией. Достаточно навести камеру в приложении — конфиг импортируется автоматически.
Можно создать туннель вручную, заполнив поля в интерфейсе приложения. Это удобно, если вы генерируете ключи через
IP-адрес клиента внутри туннеля. Должен совпадать с тем, что назначен на сервере для данного пира. Указывается в CIDR-нотации, например
Адрес DNS-резолвера, который клиент будет использовать при активном туннеле. Если не указать, Android продолжит использовать DNS мобильной сети или Wi-Fi, что приводит к утечкам запросов мимо туннеля.
Рекомендуемые варианты:
Определяет, какой трафик направляется в туннель:
Интервал в секундах, с которым клиент отправляет пустые пакеты для поддержания NAT-маппинга. Значение
По умолчанию клиент использует MTU 1280 — безопасное значение для WireGuard поверх UDP. Если сеть позволяет, можно поднять до 1420, но на мобильных сетях это редко даёт выигрыш и иногда вызывает фрагментацию.
Android агрессивно убивает фоновые процессы для экономии батареи. WireGuard-туннель может разорваться, когда система переводит приложение в спящий режим. Решение:
При переходе с Wi-Fi на мобильную сеть Android может кратковременно использовать DNS новой сети до того, как туннель переподключится. Это окно обычно длится доли секунды, но при параноидальном подходе можно включить в настройках приложения опцию «Блокировать трафик вне туннеля» (kill switch).
На устройствах с Android ниже 10 или с ядром без модуля
В отличие от Linux-десктопа, на Android без root нет прямого доступа к правилам файрвола. Все правила маршрутизации и фильтрации внутри туннеля управляются через VpnService API. Это означает, что тонкая настройка (например, маршрутизация только определённых приложений через туннель) возможна только через встроенные средства клиента или через root.
WireGuard использует UDP с фиксированным заголовком, который хорошо распознаётся системами DPI. В сетях с активной блокировкой VPN стандартный WireGuard может не подключаться. Варианты решения:
Модификация протокола, которая изменяет размер и порядок полей в заголовке пакета, делая сигнатуру нераспознаваемой для DPI. Клиент AmneziaVPN на Android поддерживает AmneziaWG из коробки. Серверная часть требует установки AmneziaWG на сервере — конфигурация описана в AmneziaWG: настройка собственного VPN-сервера с защитой от DPI.
Если DPI блокирует UDP-трафик на нестандартных портах, можно попробовать:
Некоторые провайдеры блокируют UDP-пакеты определённого размера. Уменьшение MTU до 1200 или ниже иногда помогает обойти такие фильтры. В конфигурации клиента это делается добавлением строки
Проверьте:
Типичные причины:
Это ожидаемое поведение: при смене IP-адреса клиента сервер не знает новый endpoint, пока не получит пакет.
После подключения туннеля убедитесь, что трафик действительно идёт через VPN:
Установка клиента
Официальное приложение доступно в Google Play и в репозитории F-Droid. Пакет называется
com.wireguard.android. После установки приложение запрашивает разрешение на создание VPN-соединения — это стандартный механизм Android, через который работает любой VPN-клиент.Альтернативные клиенты с поддержкой WireGuard:
- AmneziaVPN — поддерживает WireGuard и AmneziaWG (модификация с изменёнными заголовками пакетов для обхода DPI).
- v2rayNG — может работать с WireGuard-конфигурацией через ядро Xray.
Для большинства задач достаточно официального клиента. Альтернативы нужны, когда провайдер блокирует сам протокол по сигнатурам.
Импорт конфигурации
Клиент поддерживает три способа добавления туннеля:
Из файла .conf
Файл конфигурации можно передать на устройство любым способом (мессенджер, облако, USB) и открыть через приложение. Формат файла идентичен десктопному:
INI:
[Interface]
PrivateKey = <ваш приватный ключ>
Address = 10.8.0.2/24
DNS = 1.1.1.1
[Peer]
PublicKey = <публичный ключ сервера>
Endpoint = server.example.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
Сканирование QR-кода
Многие серверные панели (например, wg-easy, Amnezia) генерируют QR-код с конфигурацией. Достаточно навести камеру в приложении — конфиг импортируется автоматически.
Ручной ввод
Можно создать туннель вручную, заполнив поля в интерфейсе приложения. Это удобно, если вы генерируете ключи через
wg genkey и wg pubkey на сервере и хотите вставить их напрямую.Ключевые параметры конфигурации
Address
IP-адрес клиента внутри туннеля. Должен совпадать с тем, что назначен на сервере для данного пира. Указывается в CIDR-нотации, например
10.8.0.2/24.DNS
Адрес DNS-резолвера, который клиент будет использовать при активном туннеле. Если не указать, Android продолжит использовать DNS мобильной сети или Wi-Fi, что приводит к утечкам запросов мимо туннеля.
Рекомендуемые варианты:
| Резолвер | Адрес | Примечание |
|---|---|---|
| Cloudflare | 1.1.1.1 | Быстрый, без логирования по заявлению |
| Quad9 | 9.9.9.9 | Блокирует известные вредоносные домены |
| Собственный | Зависит от сервера | Если на сервере поднят Unbound или dnsmasq |
AllowedIPs
Определяет, какой трафик направляется в туннель:
0.0.0.0/0— весь IPv4-трафик идёт через VPN. Это стандартный режим для приватности.
0.0.0.0/0, ::/0— весь трафик, включая IPv6.
- Конкретные подсети, например
10.0.0.0/8— только трафик к указанным сетям (режим split tunneling).
PersistentKeepalive
Интервал в секундах, с которым клиент отправляет пустые пакеты для поддержания NAT-маппинга. Значение
25 подходит для большинства мобильных сетей. Без этого параметра соединение может «засыпать» за NAT и не восстанавливаться при смене сети.MTU
По умолчанию клиент использует MTU 1280 — безопасное значение для WireGuard поверх UDP. Если сеть позволяет, можно поднять до 1420, но на мобильных сетях это редко даёт выигрыш и иногда вызывает фрагментацию.
Ограничения Android
Фоновая работа
Android агрессивно убивает фоновые процессы для экономии батареи. WireGuard-туннель может разорваться, когда система переводит приложение в спящий режим. Решение:
- Отключить оптимизацию батареи для WireGuard: Настройки → Приложения → WireGuard → Батарея → Не ограничивать.
- На некоторых оболочках (MIUI, ColorOS, One UI) нужно дополнительно добавить приложение в исключения автозапуска и запретить очистку из недавних.
Утечки DNS при переключении сетей
При переходе с Wi-Fi на мобильную сеть Android может кратковременно использовать DNS новой сети до того, как туннель переподключится. Это окно обычно длится доли секунды, но при параноидальном подходе можно включить в настройках приложения опцию «Блокировать трафик вне туннеля» (kill switch).
Отсутствие доступа к ядру на старых устройствах
На устройствах с Android ниже 10 или с ядром без модуля
wireguard клиент работает через userspace-реализацию (wireguard-go). Это добавляет небольшие накладные расходы на копирование пакетов между userspace и kernel space. На практике разница заметна только на слабых устройствах с процессорами начального уровня.Нет поддержки iptables/nftables
В отличие от Linux-десктопа, на Android без root нет прямого доступа к правилам файрвола. Все правила маршрутизации и фильтрации внутри туннеля управляются через VpnService API. Это означает, что тонкая настройка (например, маршрутизация только определённых приложений через туннель) возможна только через встроенные средства клиента или через root.
Обход блокировок
WireGuard использует UDP с фиксированным заголовком, который хорошо распознаётся системами DPI. В сетях с активной блокировкой VPN стандартный WireGuard может не подключаться. Варианты решения:
AmneziaWG
Модификация протокола, которая изменяет размер и порядок полей в заголовке пакета, делая сигнатуру нераспознаваемой для DPI. Клиент AmneziaVPN на Android поддерживает AmneziaWG из коробки. Серверная часть требует установки AmneziaWG на сервере — конфигурация описана в AmneziaWG: настройка собственного VPN-сервера с защитой от DPI.
Обфускация через транспорт
Если DPI блокирует UDP-трафик на нестандартных портах, можно попробовать:
- Сменить порт сервера на 443 или 53 (имитация HTTPS или DNS-трафика). Это не меняет сигнатуру пакета, но может обойти простые правила блокировки по порту.
- Использовать прокси-слой (например, v2ray с транспортом WebSocket + TLS), внутри которого работает WireGuard. Это сложнее в настройке, но устойчивее к продвинутому DPI.
Смена порта и MTU
Некоторые провайдеры блокируют UDP-пакеты определённого размера. Уменьшение MTU до 1200 или ниже иногда помогает обойти такие фильтры. В конфигурации клиента это делается добавлением строки
MTU = 1200 в секцию [Interface].Диагностика проблем
Туннель подключается, но нет интернета
Проверьте:
- AllowedIPs — должно быть
0.0.0.0/0для полного туннелирования.
- DNS — указан ли резолвер в конфиге. Попробуйте
ping 1.1.1.1(по IP) иnslookup example.com(по имени). Если ping проходит, а DNS нет — проблема в резолвере.
- Endpoint — доступен ли сервер. Проверьте
pingилиtracerouteдо IP сервера без VPN.
Соединение устанавливается и сразу рвётся
Типичные причины:
- Несовпадение ключей: публичный ключ клиента не добавлен на сервере, или приватный ключ клиента не соответствует публичному, который ожидает сервер.
- Сервер за NAT без проброса порта. Убедитесь, что UDP-порт из
ListenPortпроброшен на сервер.
- Файрвол на сервере блокирует UDP. Проверьте правила
iptablesилиnftables.
Высокая задержка или потеря пакетов
- Проверьте
PersistentKeepalive. Если он не задан, добавьтеPersistentKeepalive = 25.
- Убедитесь, что сервер не перегружен:
wg showна сервере покажет последний handshake и объём трафика по каждому пиру.
- На мобильных сетях задержка часто зависит от качества связи, а не от VPN.
Туннель не поднимается после смены сети
Это ожидаемое поведение: при смене IP-адреса клиента сервер не знает новый endpoint, пока не получит пакет.
PersistentKeepalive решает эту проблему, заставляя клиент периодически отправлять пакеты и тем самым обновлять endpoint на сервере.Проверка результата
После подключения туннеля убедитесь, что трафик действительно идёт через VPN:
- Откройте в браузере сервис проверки IP (например, 2ip.ru или ifconfig.me). Показанный IP должен совпадать с IP сервера.
- Проверьте DNS: на сайте dnsleaktest.com убедитесь, что запросы идут через указанный в конфиге резолвер, а не через DNS провайдера.
- Проверьте утечки WebRTC: на том же dnsleaktest.com или на browserleaks.com. WebRTC может раскрывать реальный IP даже при активном VPN — это ограничение браузера, а не WireGuard.
Практический чек-лист
- [ ] Официальный клиент установлен из Google Play или F-Droid
- [ ] Конфигурация импортирована, ключи совпадают с серверными
- [ ]
AllowedIPs = 0.0.0.0/0для полного туннелирования
- [ ] DNS указан явно в секции
[Interface]
- [ ]
PersistentKeepalive = 25задан для стабильности на мобильных сетях
- [ ] Оптимизация батареи отключена для приложения WireGuard
- [ ] Kill switch включён, если критична защита от утечек при переподключении
- [ ] IP и DNS проверены после подключения
