"Быстрый
<br />
VPN перестал работать потому что:</p>
<ul>
<li>Провайдер распознаёт протокол через DPI и режет соединение ещё до установки туннеля</li>
<li>DNS-запросы уходят мимо тоннеля напрямую к серверам провайдера — ты «анонимен», но тебя видно насквозь</li>
<li>WireGuard имеет фиксированную сигнатуру (handshake 148 байт) — ТСПУ блокирует его без проблем с середины 2025 года</li>
<li>Классические протоколы OpenVPN и IPSec давно в чёрных списках у крупных провайдеров</li>
</ul>
<p>Работающее решение: AmneziaWG 2.0 (обфусцированный WireGuard) или Tailscale через Headscale для mesh-сетей. Ниже — разбор каждой проблемы с командами и конфигами.<br />
<h2>Диагноз: VPN включён, но ничего не изменилось</h2>
<p>Почему VPN не работает — вопрос который в 2025 году задают десятки тысяч людей одновременно. Ты настроил VPN, подключился, иконка горит. Но сайт не открывается. Или открывается, но провайдер всё равно видит куда ты ходишь. Или скорость упала до нуля и через 30 секунд соединение рвётся.</p>
<p>Это не баг конкретного клиента. Это системная проблема — мир изменился, а большинство VPN-гайдов в интернете застряли в 2019 году.</p>
<p>Есть три принципиально разных сценария когда «VPN не работает», и их нужно различать. Первый — туннель вообще не поднимается, DPI блокирует handshake ещё до установки соединения. Второй — туннель работает, IP сменился, но <a class="wpil_keyword_link" href="https://it-apteka.com/tag/dns/" target="_blank" rel="noopener" title="DNS" data-wpil-keyword-link="linked" data-wpil-monitor-id="2994">DNS</a> течёт мимо — провайдер видит все твои домены. Третий — туннель и DNS в порядке, но конкретные сайты заблокированы на уровне IP и твой VPS тоже в этом списке. Для каждого сценария — своё решение, и я разберу все три.</p>
<p>Что разберём в этой статье:</p>
<ul>
<li>Как работает DPI и почему он распознаёт твой VPN-трафик</li>
<li>Что такое ТСПУ и почему с сентября 2025 года стало хуже</li>
<li>Почему WireGuard блокируют как по учебнику</li>
<li>Как утечка DNS сводит на нет всю защиту</li>
<li>AmneziaWG 2.0 — практическая <a href="https://it-apteka.com/mikrotik-dlja-professionalov-pravilnaja-nastrojka-s-nulja-do-production-2026/" title="MikroTik для профессионалов: правильная настройка с нуля до production [2026]" target="_blank" rel="noopener" data-wpil-monitor-id="2984">настройка с нуля</a></li>
<li>Tailscale vs WireGuard — когда что выбирать</li>
<li>Выбор VPS, безопасность сервера, <a class="wpil_keyword_link" href="https://it-apteka.com/category/monitoring/" target="_blank" rel="noopener" title="Мониторинг" data-wpil-keyword-link="linked" data-wpil-monitor-id="2993">мониторинг</a></li>
</ul>
<p>Времени потребуется: 20-40 минут на чтение и настройку. Нужен VPS или сервер за пределами зоны блокировок.</p>
<h2>Краткая история: как VPN превратился из инструмента в мишень</h2>
<p>В 2015 году настроить VPN означало: поднял OpenVPN на DigitalOcean, скопировал .ovpn файл на телефон, готово. Всё работало потому что провайдеры смотрели только на порты и IP-адреса. Если порт 1194 UDP не в чёрном списке — проходи.</p>
<p>Потом появились реестры заблокированных IP. Провайдеры начали блокировать целые подсети дата-центров. Все быстро переехали на случайные порты и менее известные VPS-провайдеры. Кошки-мышки, раунд один.</p>
<p>Раунд два начался когда в России запустили ТСПУ — Технические Средства Противодействия Угрозам. Система работает на уровне магистральных операторов, не на уровне конкретного провайдера. Ты можешь сменить ISP — это не поможет, потому что ТСПУ стоит выше.</p>
<p>Раунд три — 2025 год. В ТСПУ включили ML-классификаторы. Теперь система не ищет конкретные байты в заголовках — она анализирует поведение трафика в целом. Размер пакетов, временные паттерны, соотношение входящего и исходящего, энтропия данных. WireGuard заблокировали первым потому что его паттерны слишком характерны. OpenVPN лежит давно. IPSec выживает только в корпоративных исключениях.</p>
<p>Это не апокалипсис и не причина отчаиваться. Это просто новые условия задачи. Протоколы с обфускацией работают — просто об этом надо знать.</p>
<h2>Как провайдер видит твой VPN-трафик: DPI изнутри</h2>
<p>DPI — Deep Packet Inspection, глубокая инспекция пакетов. Это не волшебство и не слежка в голливудском смысле. Это промышленная система анализа трафика которая стоит между тобой и интернетом.</p>
<p>Классический файрвол смотрит только на заголовки пакетов: IP-адрес источника, порт назначения. DPI смотрит глубже — на структуру самого пакета, размеры, интервалы между пакетами, паттерны handshake.</p>
<pre class="mermaid">%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
A["Твой компьютер"] --> B["Пакет выходит в сеть"]
B --> C["DPI / ТСПУ"]
C --> D["Анализ: что за протокол?"]
D --> E["Известная сигнатура WireGuard?"]
E --> F["Блокировка / RST"]
E --> G["Нет сигнатуры - пропускаем"]
G --> H["VPN-сервер"]
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style F fill:#f8fafc,stroke:#ef4444,stroke-width:2px,color:#dc2626
style H fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style C fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#c2410c
</pre>
<p>DPI умеет несколько вещей которые делают обычный VPN бесполезным:</p>
<table>
<thead>
<tr>
<th>Метод DPI</th>
<th>Что анализирует</th>
<th>Что блокирует</th>
</tr>
</thead>
<tbody>
<tr>
<td>Сигнатурный анализ</td>
<td>Первые байты пакета, структура handshake</td>
<td>OpenVPN, WireGuard, IPSec по шаблону</td>
</tr>
<tr>
<td>Поведенческий анализ</td>
<td>Размеры пакетов, временные паттерны</td>
<td>Зашифрованные туннели с характерным ритмом</td>
</tr>
<tr>
<td>Статистический анализ</td>
<td>Распределение длин пакетов, энтропия</td>
<td>Трафик с нетипично высокой энтропией (= шифрование)</td>
</tr>
<tr>
<td>ML-классификация</td>
<td>Комбинация всех параметров</td>
<td>Даже обфусцированные протоколы если ML обучен</td>
</tr>
<tr>
<td>Active Probing</td>
<td>DPI сам подключается к твоему серверу и проверяет</td>
<td>VPN-серверы по результату зондирования</td>
</tr>
</tbody>
</table>
<p>В России это реализовано через ТСПУ — Технические Средства Противодействия Угрозам. К 2026 году ТСПУ покрывает более 95% интернет-трафика страны. С сентября 2025 года в системе включены ML-алгоритмы нового поколения которые блокируют большинство классических VPN-протоколов автоматически.</p>
<h2>Почему WireGuard заблокировали первым</h2>
<p>WireGuard — отличный протокол. Быстрый, простой, криптографически безупречный. И именно поэтому его заблокировали раньше всех остальных.</p>
<p>Проблема в предсказуемости. WireGuard handshake initiation всегда имеет фиксированный размер — 148 байт. Первые четыре байта UDP-пакета всегда <code>[0x01, 0x00, 0x00, 0x00]</code>. Это цифровой отпечаток на лбу.</p>
<p>DPI не нужно расшифровывать содержимое. Ему достаточно увидеть:</p>
<ul>
<li>UDP-пакет размером 148 байт</li>
<li>Первые байты совпадают с WireGuard Handshake Initiation</li>
<li>Через 92 байта приходит ответ (Handshake Response)</li>
</ul>
<p>Готово — соединение убито RST-пакетом ещё до завершения рукопожатия. Туннель не поднялся ни разу.</p>
<pre><code class="language-bash">
# Проверь - твой WireGuard блокируется до handshake или после
# Запусти tcpdump на клиенте во время подключения
sudo tcpdump -i eth0 udp port 51820 -v
# Если видишь 148-байтный исходящий пакет без ответа - DPI блокирует на входе
# Если видишь SYN/RST - блокировка по IP
</code></pre>
<p>С середины 2025 года обычный WireGuard перестал работать через большинство российских операторов. Это не слухи — это подтверждённый факт от пользователей на Хабре и GitHub.</p>
<p>Кстати, аналогичная история произошла с WireGuard в Египте ещё в 2021 году — DPI научился распознавать Handshake Initiate пакеты по фиксированному размеру 148 байт и первым четырём байтам <code>[0x01, 0x00, 0x00, 0x00]</code>. Россия прошла тот же путь, только позже. И решение такое же: убрать предсказуемость.</p>
<p>Ещё одна причина почему WireGuard лёгкая мишень — он работает строго по UDP. Это само по себе сигнал для DPI. Большинство легитимного трафика ходит по TCP. Длинная UDP-сессия с характерными размерами пакетов — именно тот паттерн который DPI ищет в первую очередь.</p>
<h2>AmneziaWG: как WireGuard научился прятаться</h2>
<p>AmneziaWG — форк WireGuard от команды Amnezia VPN. Криптографическое ядро не тронуто: Curve25519, ChaCha20-Poly1305, BLAKE2s — всё то же самое. Поменяли только транспортный слой.</p>
<p>Первая версия AmneziaWG 1.x заменяла стандартные заголовки фиксированными кастомными значениями. Помогло ненадолго — DPI обучился на новых статических значениях так же быстро как на старых. Версия 2.0 пошла другим путём: вместо замены фиксированных значений на другие фиксированные — рандомизация при каждом соединении.</p>
<p>AmneziaWG 2.0 (выпущен в конце 2025 года) делает следующее:</p>
<ul>
<li>Рандомизирует заголовки всех типов пакетов — handshake initiation, handshake response, data packet, under-load packet</li>
<li>Использует динамические диапазоны значений заголовков вместо статических</li>
<li>Добавляет случайный паддинг к пакетам — размер больше не предсказуем</li>
<li>Имитирует паттерны трафика популярных UDP-протоколов</li>
<li>Добавляет junk-пакеты перед handshake — это параметры Jc, Jmin, Jmax в конфиге</li>
</ul>
<p>DPI видит случайный поток UDP-пакетов с непредсказуемыми заголовками. Никакой знакомой сигнатуры — нечего блокировать.</p>
<p>Важный момент про параметры Jc/S1/S2: эти значения должны быть одинаковы на <a href="https://it-apteka.com/nastrojka-ntp-na-mikrotik-klient-i-server-shpargalka-dlja-ros-6-i-7/" title="Настройка NTP MikroTik: клиент, сервер и всё что ломается без него" target="_blank" rel="noopener" data-wpil-monitor-id="2980">сервере и клиенте</a> — это не ключи шифрования, а просто договорённость о формате пакетов. Но при этом они должны быть уникальными для твоей инсталляции. Если ты скопировал значения из публичного гайда (как это сделали тысячи людей) — DPI просто добавит эту комбинацию в базу сигнатур. Генерируй свои.</p>
<h3>Установка AmneziaWG сервера на Ubuntu/Debian</h3>
"Требования"
<br />
VPS за пределами зоны блокировок. Ubuntu 22.04 или 24.04, <a class="wpil_keyword_link" href="https://it-apteka.com/tag/debian/" target="_blank" rel="noopener" title="Debian" data-wpil-keyword-link="linked" data-wpil-monitor-id="2988">Debian</a> 11/12. Root-доступ. Минимум 512 МБ RAM. На момент публикации актуальна AmneziaWG 2.0. Перед установкой проверь свежие релизы на github.com/amnezia-vpn/amneziawg-linux-kernel-module<br />
<pre><code class="language-bash">
# Обновляем систему
apt update && apt upgrade -y
# Устанавливаем зависимости
apt install -y wireguard-tools linux-headers-$(uname -r) build-essential git
# Клонируем репозиторий AmneziaWG
git clone https://github.com/amnezia-vpn/amneziawg-linux-kernel-module.git
cd amneziawg-linux-kernel-module
# Собираем и устанавливаем модуль ядра
make
make install
# Загружаем модуль
modprobe amneziawg
# Проверяем что модуль загружен
lsmod | grep amnezia
</code></pre>
<pre><code class="language-bash">
# Генерируем ключи сервера
awg genkey | tee /etc/amnezia/server_private.key | awg pubkey > /etc/amnezia/server_public.key
# Генерируем ключи клиента
awg genkey | tee /etc/amnezia/client_private.key | awg pubkey > /etc/amnezia/client_public.key
# Просматриваем ключи - они понадобятся для конфигов
cat /etc/amnezia/server_private.key
cat /etc/amnezia/server_public.key
cat /etc/amnezia/client_private.key
cat /etc/amnezia/client_public.key
</code></pre>
<p>Конфиг сервера с обфускацией. Параметры Jc, Jmin, Jmax, S1, S2, H1-H4 — это магия AmneziaWG. Они рандомизируют заголовки и добавляют junk-пакеты перед handshake:</p>
<pre><code class="language-text">
# /etc/amnezia/awg0.conf - серверный конфиг
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = ТВОЙ_ПРИВАТНЫЙ_КЛЮЧ_СЕРВЕРА
# Обфускация AmneziaWG 2.0 - рандомизирует сигнатуру
Jc = 5
Jmin = 50
Jmax = 1000
S1 = 30
S2 = 40
H1 = 1234567891
H2 = 1234567892
H3 = 1234567893
H4 = 1234567894
# IP-форвардинг и NAT
PostUp = iptables -A FORWARD -i awg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i awg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = ПУБЛИЧНЫЙ_КЛЮЧ_КЛИЕНТА
AllowedIPs = 10.8.0.2/32
</code></pre>
"Важно
<br />
Значения H1-H4 в примере — учебные. Для продакшна сгенерируй свои случайные 32-битные числа командой ниже. Одинаковые значения у всех пользователей — это новая сигнатура для DPI.<br />
<pre><code class="language-bash">
# Генерируем уникальные H1-H4 для своей инсталляции
for i in 1 2 3 4; do echo "H$i = $(od -A n -t d4 -N 4 /dev/urandom | tr -d ' ')"; done
</code></pre>
<pre><code class="language-bash">
# Запускаем интерфейс AmneziaWG
awg-quick up /etc/amnezia/awg0.conf
# Включаем автозапуск
systemctl enable awg-quick@awg0
# Включаем IP-форвардинг на сервере
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
</code></pre>
<p>Конфиг клиента — зеркальная структура с параметрами обфускации:</p>
<pre><code class="language-text">
# Клиентский конфиг awg-client.conf
[Interface]
Address = 10.8.0.2/24
PrivateKey = ТВОЙ_ПРИВАТНЫЙ_КЛЮЧ_КЛИЕНТА
DNS = 1.1.1.1
# Те же параметры обфускации что и на сервере - должны совпадать
Jc = 5
Jmin = 50
Jmax = 1000
S1 = 30
S2 = 40
H1 = 1234567891
H2 = 1234567892
H3 = 1234567893
H4 = 1234567894
[Peer]
PublicKey = ПУБЛИЧНЫЙ_КЛЮЧ_СЕРВЕРА
Endpoint = IP_СЕРВЕРА:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
</code></pre>
<h3>Проверка что AmneziaWG работает</h3>
<pre><code class="language-bash">
# На сервере - проверяем статус
awg show
# Должно показать интерфейс awg0, пиров и last handshake
# Если latest handshake есть - туннель работает
# На клиенте Linux
awg-quick up /path/to/awg-client.conf
curl ifconfig.me
# Должен показать IP твоего VPS, а не домашний IP
</code></pre>
<h2>Утечка DNS: анонимность со сквозняком</h2>
<p>Вот сценарий который встречается у 40% пользователей VPN. Туннель поднят. IP поменялся. Но DNS-запросы уходят мимо туннеля — напрямую к серверам провайдера.</p>
<p>Что это означает на практике: провайдер не видит твои HTTP-запросы, но видит все DNS-резолвы. То есть знает каждый домен который ты посетил. ТСПУ анализирует DNS-трафик на магистральных каналах и использует его для блокировки ресурсов и детекции самого факта использования VPN.</p>
<p>Почему DNS вообще может уйти мимо туннеля? Несколько механизмов.</p>
<p>Первый — DNS не указан в конфиге VPN-клиента. Операционная система использует свои настройки DNS которые были до VPN, то есть сервер провайдера. Решается добавлением строки DNS в секцию [Interface] конфига WireGuard.</p>
<p>Второй — операционная система игнорирует DNS из конфига VPN. Windows особенно грешит этим через механизм Smart Multi-Homed Name Resolution: если один DNS-сервер отвечает медленно, <a href="https://it-apteka.com/kak-opredelit-chto-windows-serveru-ne-hvataet-pamjati-shpargalka/" title="Как определить, что Windows серверу не хватает памяти: шпаргалка IT-инженера с примерами" target="_blank" rel="noopener" data-wpil-monitor-id="2982">Windows спрашивает все доступные серверы</a> параллельно и берёт первый ответ. Первым обычно отвечает провайдерский DNS, он рядом.</p>
<p>Третий — IPv6 DNS утечка. Если в AllowedIPs не прописан <code>::/0</code>, весь IPv6-трафик включая DNS идёт напрямую. Современные операционные системы активно используют IPv6 когда он доступен.</p>
<p>Четвёртый — split DNS. Некоторые корпоративные VPN настроены так что только корпоративные домены идут через туннель, остальное — напрямую. В этом случае все твои личные запросы видит провайдер.</p>
<pre class="mermaid">%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
A["Твой браузер"] --> B["DNS-запрос: example.com?"]
B --> C{Куда идёт DNS?}
C --> D["Через VPN-туннель"]
C --> E["Мимо туннеля к провайдеру"]
D --> F["DNS-сервер VPN или 1.1.1.1"]
E --> G["DNS провайдера - УТЕЧКА"]
G --> H["Провайдер знает все твои сайты"]
F --> I["Анонимность сохранена"]
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style E fill:#f8fafc,stroke:#ef4444,stroke-width:2px,color:#dc2626
style G fill:#f8fafc,stroke:#ef4444,stroke-width:2px,color:#dc2626
style I fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
</pre>
<h3>Как проверить утечку DNS</h3>
<pre><code class="language-bash">
# Быстрая проверка в терминале
# Без VPN - запомни какой DNS показывает
dig +short myip.opendns.com @resolver1.opendns.com
# Включи VPN и проверь снова
dig +short myip.opendns.com @resolver1.opendns.com
# Если оба раза один и тот же IP - VPN не работает
# Если разные - хорошо, но DNS может всё равно течь
# Проверяем именно DNS-резолвер
nslookup whoami.akamai.net
# Ответ должен быть с IP твоего VPS или публичного DoH-резолвера
</code></pre>
<p>Также используй онлайн-сервисы: <a href="https://dnsleaktest.com" target="_blank" rel="noopener">dnsleaktest.com</a> или <a href="https://browserleaks.com/dns" target="_blank" rel="noopener">browserleaks.com/dns</a>. Запусти тест дважды — до и после включения VPN. DNS-серверы в результате должны смениться.</p>
<h3>Как исправить утечку DNS в WireGuard/AmneziaWG</h3>
<p>Причина утечки обычно одна из трёх: DNS не указан в конфиге клиента, AllowedIPs не включает DNS-трафик, или операционная система игнорирует DNS из конфига (привет, <a class="wpil_keyword_link" href="https://it-apteka.com/category/windows-server/" target="_blank" rel="noopener" title="Windows Server" data-wpil-keyword-link="linked" data-wpil-monitor-id="2990">Windows</a> с его Smart Multi-Homed Name Resolution).</p>
<pre><code class="language-text">
# В клиентском конфиге WireGuard/AmneziaWG обязательно:
[Interface]
DNS = 1.1.1.1, 1.0.0.1
# Или используй DNS своего VPS: 10.8.0.1 (если поднял unbound/dnsmasq там)
[Peer]
AllowedIPs = 0.0.0.0/0, ::/0
# AllowedIPs = 0.0.0.0/0 - весь IPv4 трафик через туннель
# ::/0 - весь IPv6, иначе DNS через IPv6 утечёт мимо
</code></pre>
<pre><code class="language-bash">
# На сервере поднять локальный DNS чтобы не светить 1.1.1.1 в логах
apt install -y unbound
# Минимальный конфиг unbound - слушает только на интерфейсе VPN
cat > /etc/unbound/unbound.conf.d/vpn.conf << 'EOF'
server:
interface: 10.8.0.1
access-control: 10.8.0.0/24 allow
hide-identity: yes
hide-version: yes
use-caps-for-id: yes
prefetch: yes
EOF
systemctl restart unbound
systemctl enable unbound
</code></pre>
<pre><code class="language-bash">
# Windows: отключить Smart Multi-Homed Name Resolution через реестр
# (причина №1 утечек DNS на Windows даже при правильном конфиге WG)
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\DNSClient" /v DisableSmartNameResolution /t REG_DWORD /d 1 /f
# Проверить результат - запусти после изменения:
ipconfig /flushdns
# И снова тест на dnsleaktest.com
</code></pre>
<h2>Tailscale и WireGuard: когда что выбирать</h2>
<p>Tailscale часто рекламируют как «WireGuard только проще». Это правда, но неполная.</p>
<p>Tailscale — это продукт поверх WireGuard. Он добавляет control plane: автоматическое обнаружение устройств, обмен ключами, NAT traversal, MagicDNS, ACL. Ты не пишешь конфиги вручную — просто устанавливаешь клиент и устройства видят друг друга.</p>
<p>Проблема в том что control plane Tailscale — закрытый код и хостится у Tailscale Inc. Они не могут читать твой трафик (шифрование end-to-end на WireGuard), но видят метаданные: какие устройства онлайн, с каких IP подключаются. Для корпоративной среды это серьёзный вопрос.</p>
<p>Другая проблема Tailscale в контексте этой статьи: он не решает задачу обхода DPI для исходящего трафика. Tailscale отлично подходит чтобы с телефона достучаться до <a href="https://it-apteka.com/docker-compose-dlja-domashnego-servera-struktura-reverse-proxy-sekrety-i-obnovlenija/" title="Docker Compose для домашнего сервера: структура, reverse proxy, секреты и обновления" target="_blank" rel="noopener" data-wpil-monitor-id="2983">домашнего NAS или до рабочего сервера</a>. Но если цель — выходить в <a href="https://it-apteka.com/ttl-shpargalka-po-time-to-live-dlja-obhoda-blokirovok-razdachi-interneta/" title="TTL: шпаргалка по Time To Live для обхода блокировок раздачи интернета" target="_blank" rel="noopener" data-wpil-monitor-id="2985">интернет через VPS обходя</a> блокировки — для этого нужен exit node, и его трафик всё равно идёт через WireGuard который может быть заблокирован. AmneziaWG решает именно задачу выхода в интернет через обфусцированный туннель.</p>
<p>По факту это не конкуренты, а инструменты для разных задач. У меня в инфраструктуре оба: Tailscale для mesh-доступа к своим сервисам, AmneziaWG для выхода в интернет.</p>
<table>
<thead>
<tr>
<th>Критерий</th>
<th>WireGuard (self-hosted)</th>
<th>Tailscale (облако)</th>
<th>Headscale (self-hosted)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Сложность настройки</td>
<td>Высокая — конфиги вручную</td>
<td>Минимальная — 5 минут</td>
<td>Средняя</td>
</tr>
<tr>
<td>Control plane</td>
<td>Нет — ты сам</td>
<td>Tailscale Inc.</td>
<td>Твой сервер</td>
</tr>
<tr>
<td>NAT traversal</td>
<td>Вручную / не всегда</td>
<td>Автоматически</td>
<td>Автоматически</td>
</tr>
<tr>
<td>Утечка метаданных</td>
<td>Нет</td>
<td>К Tailscale Inc.</td>
<td>Нет</td>
</tr>
<tr>
<td>CGNAT/Starlink</td>
<td>Сложно</td>
<td>Работает</td>
<td>Работает</td>
</tr>
<tr>
<td>Обход DPI</td>
<td>Нет (нужен AmneziaWG)</td>
<td>Частично</td>
<td>Частично</td>
</tr>
<tr>
<td>Цена</td>
<td>Бесплатно</td>
<td>Free/20$/мес</td>
<td>Бесплатно</td>
</tr>
<tr>
<td>Подходит для</td>
<td>Site-to-site, продакшн</td>
<td>Homelab, команды</td>
<td>Privacy-ориентированный homelab</td>
</tr>
</tbody>
</table>
<p>Tailscale выигрывает когда ты за CGNAT или Starlink, когда нужно быстро подключить несколько устройств без возни с конфигами, когда в команде есть нетехнические люди. Чистый <a href="https://it-apteka.com/vpn-na-mikrotik-polnyj-gajd-2026-wireguard-l2tp-ipsec-ikev2-nastrojka-servera-i-klienta/" title="VPN на MikroTik: полный гайд 2026 — WireGuard, L2TP/IPsec, IKEv2, настройка сервера и клиента" target="_blank" rel="noopener" data-wpil-monitor-id="2986">WireGuard — когда нужен полный</a> контроль, site-to-site между роутерами, или ты строишь что-то для продакшна где зависимость от внешнего сервиса недопустима.</p>
<h3>Headscale: Tailscale без Tailscale</h3>
<p>Headscale — open-source реализация control server от Tailscale. Разворачиваешь на своём VPS и получаешь всю удобность Tailscale без зависимости от их инфраструктуры.</p>
<pre><code class="language-bash">
# Установка Headscale на Ubuntu
HEADSCALE_VERSION=$(curl -s https://api.github.com/repos/juanfont/headscale/releases/latest | grep tag_name | cut -d '"' -f 4)
wget "https://github.com/juanfont/headscale/releases/download/${HEADSCALE_VERSION}/headscale_linux_amd64"
chmod +x headscale_linux_amd64
mv headscale_linux_amd64 /usr/local/bin/headscale
# Создаём конфиг директорию
mkdir -p /etc/headscale /var/lib/headscale
# Скачиваем пример конфига
wget https://raw.githubusercontent.com/juanfont/headscale/main/config-example.yaml \
-O /etc/headscale/config.yaml
# Правим server_url на свой домен/IP
# После - запускаем
headscale serve
# Создаём пользователя и генерируем ключ для клиента
headscale users create myuser
headscale preauthkeys create --user myuser --reusable --expiration 24h
</code></pre>
<h2>Другие утечки: WebRTC и IPv6</h2>
<p>DNS — самая частая утечка, но не единственная.</p>
<p>WebRTC — браузерный протокол для видеозвонков. Он умеет определять реальный IP даже за NAT и даже при включённом VPN через STUN-серверы. Если ты открываешь meet.google.com или Discord в браузере с включённым VPN — есть шанс что WebRTC засветил твой домашний IP.</p>
<p>Механизм такой: браузер запрашивает STUN-сервер (stun.google.com и подобные) для определения своего публичного IP. Этот запрос идёт в обход VPN-туннеля на уровне браузера, а не операционной системы. VPN-клиент который работает как сетевой интерфейс — не видит этот трафик.</p>
<pre><code class="language-bash">
# Проверить WebRTC утечку можно на:
# https://browserleaks.com/webrtc
# или https://ipleak.net
# Отключить WebRTC в Firefox через about:config:
# media.peerconnection.enabled = false
# Chrome/Edge - только через расширение WebRTC Network Limiter
# или через режим "Route all traffic through VPN" в настройках системы
</code></pre>
<p>IPv6 — ещё одна дыра. WireGuard по умолчанию роутит только IPv4 если не указать явно <code>::/0</code> в AllowedIPs. Все IPv6-запросы уходят напрямую. Если у твоего провайдера есть IPv6 (а у большинства в 2025 году он есть) — ты светишься по IPv6 даже при правильно настроенном IPv4-туннеле.</p>
<pre><code class="language-bash">
# Проверяем есть ли IPv6 утечка
curl -6 ifconfig.me
# Если ответил - IPv6 работает напрямую
# Решение 1: добавить в AllowedIPs клиентского конфига
# AllowedIPs = 0.0.0.0/0, ::/0
# Решение 2: отключить IPv6 на интерфейсе если VPS его не поддерживает
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
</code></pre>
<h2>Системные требования</h2>
<table>
<thead>
<tr>
<th>Компонент</th>
<th>Минимум</th>
<th>Рекомендуется</th>
</tr>
</thead>
<tbody>
<tr>
<td>ОС сервера (VPS)</td>
<td><a href="https://it-apteka.com/nastrojka-staticheskogo-ip-v-ubuntu-22-04-24-04-i-debian-12-13-nov/" title="Настройка статического IP в Ubuntu 22.04-24.04 и Debian 12-13: Новый мир Netplan" target="_blank" rel="noopener" data-wpil-monitor-id="2987">Ubuntu 20.04 / Debian</a> 11</td>
<td>Ubuntu 24.04 / Debian 12</td>
</tr>
<tr>
<td>Ядро <a class="wpil_keyword_link" href="https://it-apteka.com/category/linux/" target="_blank" rel="noopener" title="Linux" data-wpil-keyword-link="linked" data-wpil-monitor-id="2991">Linux</a></td>
<td>5.4+</td>
<td>6.1+ (нативный WireGuard в ядре)</td>
</tr>
<tr>
<td>AmneziaWG</td>
<td>2.0 (конец 2025)</td>
<td>Последний релиз с GitHub</td>
</tr>
<tr>
<td>Tailscale</td>
<td>1.70+</td>
<td>Последний стабильный</td>
</tr>
<tr>
<td>Headscale</td>
<td>0.23+</td>
<td>Последний релиз</td>
</tr>
<tr>
<td>RAM сервера</td>
<td>512 МБ</td>
<td>1 ГБ (с unbound DNS)</td>
</tr>
<tr>
<td>ОС клиента</td>
<td>Windows 10, Android 8, iOS 15</td>
<td>Windows 11, Android 12+, iOS 16+</td>
</tr>
</tbody>
</table>
<h2>Порты и фаервол</h2>
<table>
<thead>
<tr>
<th>Порт</th>
<th>Протокол</th>
<th>Назначение</th>
<th>Открыт снаружи</th>
</tr>
</thead>
<tbody>
<tr>
<td>51820</td>
<td>UDP</td>
<td>WireGuard / AmneziaWG</td>
<td>Да</td>
</tr>
<tr>
<td>41641</td>
<td>UDP</td>
<td>Tailscale DERP relay</td>
<td>Нет (исходящий)</td>
</tr>
<tr>
<td>853</td>
<td>TCP</td>
<td><a href="https://it-apteka.com/dns-over-tls-nastrojka-dot-na-android-keenetic-i-v-nulls-proxy/" title="DNS over TLS: настройка DoT на Android, Keenetic и в Nulls Proxy" target="_blank" rel="noopener" data-wpil-monitor-id="2979">DNS over TLS</a> (часто блокируется)</td>
<td>Нет</td>
</tr>
<tr>
<td>443</td>
<td>TCP/UDP</td>
<td>DoH, QUIC-маскировка</td>
<td>Нет (исходящий)</td>
</tr>
<tr>
<td>53</td>
<td>UDP</td>
<td>Локальный unbound DNS</td>
<td>Нет (только LAN)</td>
</tr>
</tbody>
</table>
<pre><code class="language-bash">
# Минимальная настройка UFW на VPS
ufw allow ssh
ufw allow 51820/udp
ufw enable
# Проверяем что правила применились
ufw status verbose
</code></pre>
<h2>Выбор VPS: где поднимать сервер и на что смотреть</h2>
<p>Даже идеально настроенный AmneziaWG не поможет если IP твоего сервера уже в чёрных списках. Это первое на что нужно смотреть при выборе VPS для VPN.</p>
<p>Проверь IP перед покупкой. Большинство хостингов позволяют узнать IP заранее или дают тестовый период. Прогони через <a href="https://check.torproject.org/cgi-bin/TorBulkExitList.py" target="_blank" rel="noopener">базы блокировок</a> и через простой тест — просто зайди на заблокированный в твоей стране сайт напрямую с этого IP через curl:</p>
<pre><code class="language-bash">
# Проверяем с сервера - доступен ли условно заблокированный ресурс
curl -I --max-time 10 https://example-blocked-site.com
# Проверяем что IP не в спам-листах
curl "https://api.abuseipdb.com/api/v2/check?ipAddress=$(curl -s ifconfig.me)" \
-H "Key: ВАШ_API_KEY" \
-H "Accept: application/json"
</code></pre>
<p>Географически лучше брать серверы в Финляндии, Нидерландах, Германии или в Прибалтике. Они близко по пингу к России, хорошая связность, и эти страны не участвуют в массовой блокировке VPS-провайдеров. Американские и азиатские серверы работают, но пинг выше.</p>
<p>Избегай слишком дешёвых хостингов с общими IP-пулами. Если один клиент на этом IP занимается спамом или чем похуже — IP попадает в базы блокировок и тянет за собой всех соседей. Платить за выделенный IP — это не роскошь, это минимальная гигиена.</p>
<p>Отдельный момент: некоторые операторы блокируют не конкретные IP, а целые ASN (автономные системы) крупных хостингов. DigitalOcean ASN, Hetzner ASN, Vultr ASN — в отдельных сетях они могут быть заблокированы полностью. Если VPS на Hetzner не работает — попробуй менее популярный хостинг с другим ASN.</p>
<h2>Безопасность VPN-сервера: минимальный чеклист</h2>
<p>VPN-сервер — это твоя точка выхода в интернет. Если его взломают — весь твой трафик скомпрометирован. Несколько обязательных шагов которые нужно сделать сразу после установки.</p>
<p>SSH hardening. Первым делом меняй порт и запрещай вход по паролю:</p>
<pre><code class="language-bash">
# Редактируем /etc/ssh/sshd_config
# Меняем порт с 22 на произвольный
Port 2222
# Запрещаем вход root по SSH
PermitRootLogin no
# Запрещаем вход по паролю
PasswordAuthentication no
# Перезапускаем SSH (не закрывай текущую сессию до проверки!)
systemctl restart sshd
# Открываем новый порт в UFW
ufw allow 2222/tcp
</code></pre>
<pre><code class="language-bash">
# fail2ban - защита от брутфорса SSH
apt install -y fail2ban
# Конфиг для SSH
cat > /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = 2222
maxretry = 3
bantime = 3600
findtime = 600
EOF
systemctl enable fail2ban
systemctl start fail2ban
# Проверяем статус
fail2ban-client status sshd
</code></pre>
<p>Закрываем всё лишнее. После установки AmneziaWG на сервере должны быть открыты только два порта: SSH (твой кастомный) и UDP 51820 для VPN. Всё остальное — закрыто:</p>
<pre><code class="language-bash">
# Проверяем текущие правила
ufw status verbose
# Должно быть примерно так:
# 2222/tcp ALLOW IN
# 51820/udp ALLOW IN
# Всё остальное - DENY
# Если что-то лишнее открыто:
ufw delete allow 80/tcp # например если открыли для проверки
</code></pre>
<p>Автоматические обновления безопасности. Сервер должен получать security-патчи без твоего участия. Прострел через незакрытую уязвимость ядра — классическая история:</p>
<pre><code class="language-bash">
apt install -y unattended-upgrades
# Активируем автообновления безопасности
dpkg-reconfigure --priority=low unattended-upgrades
# Проверяем конфиг
cat /etc/apt/apt.conf.d/50unattended-upgrades | grep -A5 "Unattended-Upgrade::Allowed"
</code></pre>
<p>Один пользователь для VPN. Не запускай awg-quick от root в продакшне. Создай отдельного пользователя с минимальными правами:</p>
<pre><code class="language-bash">
# Создаём системного пользователя для VPN
useradd -r -s /sbin/nologin vpnuser
# Даём права на управление интерфейсом через sudo
echo "vpnuser ALL=(root) NOPASSWD: /usr/bin/awg-quick" >> /etc/sudoers.d/vpnuser
chmod 440 /etc/sudoers.d/vpnuser
</code></pre>
<h2>Клиенты AmneziaWG: что ставить на телефон и ноутбук</h2>
<p>Официальные клиенты AmneziaWG поддерживают Android, iOS, Windows, macOS и Linux. Это важно: нельзя использовать обычный клиент WireGuard с конфигом AmneziaWG — он не понимает параметры обфускации и просто их игнорирует, работая как чистый WireGuard.</p>
<p>Android: приложение AmneziaWG доступно на <a href="https://github.com/amnezia-vpn/amneziawg-android/releases" target="_blank" rel="nofollow noopener">GitHub releases</a> и в F-Droid. В Google Play может быть устаревшая версия — лучше брать с GitHub.</p>
<p>iOS: приложение AmneziaVPN в App Store. Поддерживает AmneziaWG конфиги, импорт через QR-код или файл.</p>
<p>Windows: клиент доступен на официальном сайте <a href="https://amnezia.org" target="_blank" rel="noopener">amnezia.org</a>. Поддерживает импорт .conf файла. Убедись что версия не старше 4.x — старые клиенты не поддерживают AWG 2.0 параметры.</p>
<p>Linux: можно использовать awg-quick напрямую (как в этой статье) или установить GUI клиент. Для headless серверов awg-quick через systemd — это всё что нужно.</p>
<pre><code class="language-bash">
# Генерируем QR-код для импорта на мобильное устройство
# (на сервере, устанавливаем qrencode)
apt install -y qrencode
# Генерируем QR из клиентского конфига
qrencode -t ANSIUTF8 < /etc/amnezia/client.conf
# Или сохраняем как PNG
qrencode -t PNG -o /tmp/vpn-client-qr.png < /etc/amnezia/client.conf
</code></pre>
<p>Важный момент для мобильных: на Android и iOS VPN-клиент должен быть настроен как Always-on VPN с опцией Block connections without VPN. Это предотвращает утечку трафика в момент переключения между WiFi и мобильным интернетом — именно тогда чаще всего происходят DNS-утечки на мобильных устройствах.</p>
<h2>Проверка через tcpdump: что реально уходит в сеть</h2>
<p>Онлайн-тесты удобны, но иногда нужно видеть трафик своими глазами. tcpdump — твой главный инструмент диагностики когда что-то идёт не так.</p>
<pre><code class="language-bash">
# Смотрим весь DNS-трафик на клиентской машине
# -n не резолвить имена, -i any все интерфейсы, port 53 только DNS
sudo tcpdump -n -i any port 53
# Включи VPN и посмотри что происходит
# Если видишь DNS-запросы с интерфейса не-VPN - это утечка
# Нормально: DNS только через интерфейс туннеля (wg0, awg0, utun)
</code></pre>
<pre><code class="language-bash">
# Проверяем что WireGuard/AmneziaWG трафик идёт через нужный интерфейс
sudo tcpdump -n -i eth0 udp port 51820
# Должно показывать UDP-пакеты с твоим IP и IP сервера
# Если пакеты есть - туннель поднимается
# Если пакетов нет после wg-quick up - проверь firewall на клиенте
</code></pre>
<pre><code class="language-bash">
# Проверяем маршрутизацию - куда идут пакеты
ip route get 8.8.8.8
# Должно показать через интерфейс VPN: dev awg0
# Если показывает физический интерфейс - маршрут не прописался
# Проверь AllowedIPs в конфиге - должен быть 0.0.0.0/0
</code></pre>
<p>Ещё один полезный трюк — посмотреть на статистику интерфейса до и после тестирования. Если байты растут только на VPN-интерфейсе — трафик идёт туда куда надо:</p>
<pre><code class="language-bash">
# Статистика интерфейсов
watch -n 1 'cat /proc/net/dev | grep -E "awg0|eth0|wg0"'
# Открываешь сайт - смотришь на каком интерфейсе растут RX/TX байты
</code></pre>
<table>
<thead>
<tr>
<th>Симптом</th>
<th>Причина</th>
<th>Решение</th>
</tr>
</thead>
<tbody>
<tr>
<td>Handshake не проходит, соединение рвётся через 30 сек</td>
<td>DPI блокирует WireGuard по сигнатуре</td>
<td>Переход на AmneziaWG с обфускацией, уникальные H1-H4</td>
</tr>
<tr>
<td>Туннель поднят, IP сменился, но DNS светит провайдера</td>
<td>DNS не идёт через туннель (утечка)</td>
<td>Указать DNS в конфиге, AllowedIPs = 0.0.0.0/0, ::/0</td>
</tr>
<tr>
<td>VPN работает, но IPv6 не через туннель</td>
<td>AllowedIPs не включает IPv6</td>
<td>Добавить ::/0 в AllowedIPs или отключить IPv6</td>
</tr>
<tr>
<td>Туннель работает, но сайты иногда не открываются</td>
<td>MTU mismatch — WireGuard overhead</td>
<td>Установить MTU 1380 в [Interface] обоих конфигов</td>
</tr>
<tr>
<td>После подключения пропал интернет полностью</td>
<td>IP-форвардинг выключен на сервере или PostUp не сработал</td>
<td>sysctl net.ipv4.ip_forward=1, проверить iptables правила</td>
</tr>
<tr>
<td>AmneziaWG клиент не видит сервер</td>
<td>Параметры Jc/S1/S2/H1-H4 не совпадают на клиенте и сервере</td>
<td>Скопировать параметры обфускации точно, без изменений</td>
</tr>
<tr>
<td>Tailscale не устанавливает прямое соединение, идёт через relay</td>
<td>Оба устройства за строгим NAT</td>
<td>Настроить exit node или subnet router на VPS</td>
</tr>
<tr>
<td>awg: command not found после установки модуля</td>
<td>Пакет wireguard-tools не установлен или awg не в PATH</td>
<td>apt install wireguard-tools, проверить /usr/bin/awg</td>
</tr>
</tbody>
</table>
<h2>Разбор типичных ситуаций из практики</h2>
<p>Теория это хорошо, но давай разберём конкретные сценарии которые встречаются чаще всего.</p>
<p>Ситуация первая: WireGuard работал, потом перестал. Без изменений с твоей стороны. Это классика. Провайдер обновил ТСПУ или активировал новое правило. Первый шаг диагностики: проверь тот же конфиг через мобильный интернет (другой провайдер). Если через мобильный работает — проблема у конкретного домашнего провайдера. Решение: переход на AmneziaWG или смена порта. Если и через мобильный не работает — IP VPS заблокирован. Смени IP или хостинг.</p>
<p>Ситуация вторая: VPN работает, IP сменился, но некоторые сайты всё равно недоступны. Возможны два варианта. Первый: сайт заблокирован по IP и IP твоего VPS тоже в списке — это случается с популярными хостингами где много VPN-пользователей. Смени хостинг на менее популярный. Второй вариант: утечка DNS. Твой браузер резолвит домен через провайдерский DNS, получает заблокированный IP и не открывает сайт. Проверь и исправь DNS как описано выше.</p>
<p>Ситуация третья: VPN работает дома, не работает на работе или в другом месте. Скорее всего корпоративная сеть или сеть отеля блокирует исходящий UDP 51820. Решение: поднять второй экземпляр AmneziaWG на порту 443 UDP. Этот порт блокируют крайне редко. Альтернатива — VLESS Reality на TCP 443, это вообще неотличимо от обычного HTTPS.</p>
<p>Ситуация четвёртая: скорость через VPN в 3-5 раз ниже чем без VPN. Первое что проверяем — MTU. Установи в конфиге клиента MTU = 1380 и перезапусти туннель. Второе — физическое расстояние до VPS. Если сервер в Сингапуре а ты в Москве — 100+ мс пинга это физика, не баг. Третье — throttling. Некоторые провайдеры специально режут скорость VPN-трафика не блокируя его полностью. Обфускация через AmneziaWG помогает и здесь — трафик выглядит как обычный UDP и не попадает в правила throttling.</p>
<pre><code class="language-bash">
# Диагностика MTU - ищем оптимальный размер
# Пингуем с размером пакета и смотрим когда начинают дропаться
ping -M do -s 1450 IP_СЕРВЕРА
ping -M do -s 1400 IP_СЕРВЕРА
ping -M do -s 1350 IP_СЕРВЕРА
# Первый размер при котором пинг проходит - добавь 28 (IP+ICMP заголовки)
# Это и есть твой оптимальный MTU для WireGuard интерфейса
</code></pre>
<pre><code class="language-bash">
# Тест скорости через туннель
# Установи iperf3 на сервере и клиенте
# На сервере:
iperf3 -s
# На клиенте (при активном VPN-туннеле):
iperf3 -c IP_СЕРВЕРА -t 10
# Если скорость нормальная - проблема не в туннеле
# Если низкая - MTU или throttling
</code></pre>
<p>Ситуация пятая: на Android VPN постоянно отключается в фоне. Это оптимизация батареи убивает VPN-процесс. На Android нужно: добавить AmneziaWG или Tailscale в исключения из оптимизации батареи, включить Always-on VPN в настройках сети (Настройки — Сеть — VPN — шестерёнка у нужного VPN), и убедиться что включена опция Block connections without VPN. После этого система не будет убивать VPN-процесс.</p>
<p>Ситуация шестая: IPv6 работает а IPv4 через туннель не идёт. Странный сценарий но бывает. Проверь что PostUp правила в конфиге сервера применились — запусти iptables -t nat -L POSTROUTING на сервере. Если правила есть но трафик не идёт — проверь net.ipv4.ip_forward через sysctl net.ipv4.ip_forward. Должно быть 1. После каждой перезагрузки значение сбрасывается если не прописать в /etc/sysctl.conf.</p>
<h2>DNS-over-HTTPS: дополнительная защита поверх VPN</h2>
<p>Даже с правильно настроенным VPN и Unbound на сервере есть одна точка утечки: DNS-запросы от самого сервера к вышестоящим резолверам. Unbound по умолчанию делает рекурсивные запросы напрямую к root-серверам — это работает, но трафик виден операторам на пути.</p>
<p>Решение: настроить Unbound использовать DoH (DNS-over-HTTPS) или DoT (DNS-over-TLS) к доверенному резолверу. Cloudflare 1.1.1.1, Quad9 9.9.9.9 или Mullvad DNS поддерживают оба протокола.</p>
<pre><code class="language-bash">
# Устанавливаем dnscrypt-proxy для DoH
apt install -y dnscrypt-proxy
# Конфиг dnscrypt-proxy
cat > /etc/dnscrypt-proxy/dnscrypt-proxy.toml << 'EOF'
listen_addresses = ['127.0.0.1:5300']
server_names = ['cloudflare', 'cloudflare-ipv6']
require_dnssec = true
require_nolog = true
require_nolog = true
EOF
systemctl enable dnscrypt-proxy
systemctl start dnscrypt-proxy
</code></pre>
<pre><code class="language-bash">
# Настраиваем Unbound использовать dnscrypt-proxy как upstream
# Добавляем в /etc/unbound/unbound.conf.d/vpn.conf:
cat >> /etc/unbound/unbound.conf.d/vpn.conf << 'EOF'
forward-zone:
name: "."
forward-addr: 127.0.0.1@5300
EOF
systemctl restart unbound
# Проверяем что DNS резолвится через наш стек
dig @10.8.0.1 example.com
# Должен отвечать с минимальной задержкой
</code></pre>
<p>Теперь цепочка полная: браузер — AmneziaWG туннель — Unbound на сервере — dnscrypt-proxy (DoH) — Cloudflare. Каждый уровень шифрует и изолирует DNS от провайдера.</p>
<p>Настроил один раз — не значит работает вечно. DPI-системы обновляются, сигнатуры меняются, блокировки расширяются. Несколько практик которые снижают вероятность «опять не работает».</p>
<p>Мониторинг туннеля. Простой <a class="wpil_keyword_link" href="https://it-apteka.com/category/scripts/" target="_blank" rel="noopener" title="Скрипты" data-wpil-keyword-link="linked" data-wpil-monitor-id="2989">скрипт</a> который проверяет что last handshake был недавно и пингует внешний IP через туннель:</p>
<pre><code class="language-bash">
#!/bin/bash
# /usr/local/bin/check-vpn.sh - запускать через cron каждые 5 минут
PEER_PUBKEY="ПУБЛИЧНЫЙ_КЛЮЧ_КЛИЕНТА"
MAX_HANDSHAKE_AGE=300 # 5 минут в секундах
LAST_HANDSHAKE=$(awg show awg0 latest-handshakes | grep "$PEER_PUBKEY" | awk '{print $2}')
NOW=$(date +%s)
AGE=$((NOW - LAST_HANDSHAKE))
if [ "$AGE" -gt "$MAX_HANDSHAKE_AGE" ]; then
echo "$(date): Peer $PEER_PUBKEY handshake too old (${AGE}s), restarting tunnel"
systemctl restart awg-quick@awg0
fi
</code></pre>
<pre><code class="language-bash">
# Добавляем в cron
(crontab -l; echo "*/5 * * * * /usr/local/bin/check-vpn.sh >> /var/log/vpn-check.log 2>&1") | crontab -
</code></pre>
<p>Резервный порт. Если порт 51820 начали блокировать — у тебя должен быть запасной. Добавь второй ListenPort в конфиге сервера или подними второй экземпляр на порту 443 UDP. Блокировку 443 UDP провайдеры избегают — там сидит QUIC/HTTP3.</p>
<pre><code class="language-bash">
# Проверяем что порт 51820 UDP реально достижим с клиентской стороны
# (запускаем на сервере)
nc -u -l 51820 &
# На клиенте:
echo "test" | nc -u IP_СЕРВЕРА 51820
# Если на сервере пришло "test" - порт открыт
</code></pre>
<p>Бэкап конфигов. Кажется очевидным, но после пятого «перенастрой мне VPN» от знакомых я убедился что нет.</p>
<pre><code class="language-bash">
# Бэкапим все ключи и конфиги
tar czf /root/vpn-backup-$(date +%Y%m%d).tar.gz /etc/amnezia/ /etc/wireguard/
# Проверяем что бэкап читается
tar tzf /root/vpn-backup-*.tar.gz | head -20
</code></pre>
<h3>Как обновлять AmneziaWG безопасно</h3>
<p>AmneziaWG — kernel module. Обновление требует пересборки модуля под новое ядро. Если сначала обновить ядро а потом забыть пересобрать модуль — после перезагрузки VPN не поднимется. Алгоритм обновления такой:</p>
<pre><code class="language-bash">
# 1. Проверяем текущую версию модуля
modinfo amneziawg | grep version
# 2. Перед обновлением системы - сохрани рабочий конфиг
awg showconf awg0 > /root/awg0-backup-$(date +%Y%m%d).conf
# 3. Обновляем систему
apt update && apt upgrade -y
# 4. Проверяем версию ядра - изменилась ли
uname -r
# 5. Если ядро обновилось - пересобираем модуль
cd /root/amneziawg-linux-kernel-module
git pull
make clean
make
make install
modprobe amneziawg
# 6. Перезапускаем туннель
systemctl restart awg-quick@awg0
# 7. Проверяем
awg show
</code></pre>
<p>Как откатиться если что-то пошло не так: у тебя есть бэкап конфига и бэкап архива с ключами. Переустанови модуль из сохранённой версии репозитория или скачай предыдущий релиз с GitHub. Ключи не меняются — туннель поднимется с теми же настройками.</p>
<h2>Альтернативы: когда AmneziaWG не помогает</h2>
<p>Бывает что и AmneziaWG не проходит — особенно на некоторых мобильных операторах где DPI особенно агрессивный. Вот что пробовать дальше.</p>
<p>VLESS + Reality — протокол из экосистемы Xray. Маскируется под TLS-трафик к реальному HTTPS-сайту (например cloudflare.com). DPI видит обычный TLS handshake к легитимному домену. Сложнее в настройке, но устойчивее к active probing. Active probing — это когда DPI не просто анализирует твой трафик, а сам подключается к твоему серверу и проверяет как тот отвечает. VLESS Reality отвечает как обычный HTTPS-сервер — проверка проходит.</p>
<p>Hysteria2 — работает поверх QUIC (UDP 443). Имитирует HTTP/3 трафик. Хорошо проходит через операторов где UDP 51820 заблокирован, но QUIC разрешён. Дополнительный бонус: QUIC имеет congestion control оптимизированный для нестабильных соединений, поэтому Hysteria2 субъективно ощущается быстрее на мобильном интернете с потерями пакетов.</p>
<p>Shadowsocks-2022 с плагином obfs4 — проверенная классика для ситуаций где нужна максимальная совместимость со старыми клиентами. Версия 2022 с AEAD шифрованием значительно устойчивее к детекции чем старый Shadowsocks. Clients: Android, iOS, Windows, macOS, Linux — всё есть.</p>
<p>AmneziaVPN (клиент) — отдельная история. Это не только AmneziaWG, это клиент который поддерживает несколько протоколов включая OpenVPN поверх Cloak, WireGuard с обфускацией и AmneziaWG. Если у тебя уже есть OpenVPN конфиг — Amnezia может обернуть его в Cloak и попробовать пробить блокировку без смены протокола. Иногда это самый быстрый путь реанимировать уже настроенный VPN.</p>
<table>
<thead>
<tr>
<th>Протокол</th>
<th>Устойчивость к DPI</th>
<th>Скорость</th>
<th>Сложность настройки</th>
<th>Клиенты</th>
</tr>
</thead>
<tbody>
<tr>
<td>WireGuard (чистый)</td>
<td>Низкая (блокируется)</td>
<td>Максимальная</td>
<td>Низкая</td>
<td>Все ОС</td>
</tr>
<tr>
<td>AmneziaWG 2.0</td>
<td>Высокая</td>
<td>Высокая</td>
<td>Средняя</td>
<td>Android, iOS, Linux, Windows</td>
</tr>
<tr>
<td>VLESS + Reality</td>
<td>Очень высокая</td>
<td>Высокая</td>
<td>Высокая</td>
<td>Hiddify, v2rayNG, Nekobox</td>
</tr>
<tr>
<td>Hysteria2</td>
<td>Высокая</td>
<td>Высокая (QUIC)</td>
<td>Средняя</td>
<td>Android, iOS, Windows, Linux</td>
</tr>
<tr>
<td>Tailscale</td>
<td>Средняя</td>
<td>Высокая</td>
<td>Минимальная</td>
<td>Все ОС</td>
</tr>
<tr>
<td>OpenVPN + obfsproxy</td>
<td>Средняя</td>
<td>Низкая</td>
<td>Высокая</td>
<td>Все ОС</td>
</tr>
</tbody>
</table>
<h2>Мифы о VPN которые стоят тебе анонимности</h2>
<p>За 25 лет в профессии я слышал достаточно уверенных заявлений о VPN которые были полной ерундой. Разберём самые живучие.</p>
<p>Миф первый: «VPN скрывает меня полностью». Нет. VPN скрывает содержимое трафика и подменяет IP. Но не скрывает сам факт использования VPN — это видно по паттернам трафика. Не скрывает тебя от браузерных fingerprint-техник: canvas, WebGL, user-agent. Не скрывает cookies и аккаунты в браузере. Если ты вошёл в Google под своим аккаунтом через VPN — Google знает кто ты. IP тут не причём.</p>
<p>Миф второй: «Платный VPN надёжнее бесплатного». Иногда да, иногда нет. Критерий не цена, а независимый аудит. Лучшие VPN-сервисы публикуют проверки своих систем логирования сторонними компаниями. Если провайдер говорит «мы не храним логи» но аудита нет — это просто слова. Mullvad, ProtonVPN, IVPN публикуют такие аудиты. Это не реклама, это факт.</p>
<p>Миф третий: «WireGuard быстрее OpenVPN значит лучше». Быстрее — да. Но в условиях блокировок скорость не главный параметр. Главный — проходит или нет. AmneziaWG немного медленнее чистого WireGuard из-за оверхеда обфускации. Это цена за прохождение через DPI. Платить стоит.</p>
<p>Миф четвёртый: «VPN защищает от вирусов». Нет. VPN — это шифрованный туннель для трафика. Он никак не влияет на вредоносное ПО которое уже на твоей машине. Антивирус и VPN решают разные задачи.</p>
<p>Миф пятый: «Если VPN работает — DNS тоже в порядке». Это мы уже разобрали выше. Нет — проверяй отдельно всегда.</p>
<h2>Архитектура: как всё связано в рабочей схеме</h2>
<pre class="mermaid">%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '14px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 40, 'rankSpacing': 50}
}}%%
flowchart TD
A["Клиент: телефон/ноутбук"] --> B["AmneziaWG клиент"]
B --> C["Обфускация: рандомные заголовки AWG 2.0"]
C --> D["ТСПУ / DPI анализирует трафик"]
D --> E["Сигнатура не распознана - пропуск"]
E --> F["VPS в Финляндии/Нидерландах"]
F --> G["AmneziaWG сервер + Unbound DNS"]
G --> H["Выход в открытый интернет"]
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style D fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#c2410c
style E fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style F fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style H fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
</pre>
<p>Клиент отправляет трафик через AmneziaWG с рандомизированными заголовками — DPI не видит знакомой сигнатуры и пропускает пакеты. На сервере Unbound принимает DNS-запросы через туннель — они не светятся провайдеру. iptables делает NAT — трафик выходит с IP сервера.</p>
<p>Если нужен mesh-доступ к нескольким своим устройствам — добавляем Tailscale/Headscale поверх этой схемы. Они работают независимо: AmneziaWG для выхода наружу, Tailscale для доступа к своей инфраструктуре.</p>
<h2>План действий: с чего начать прямо сейчас</h2>
<p>Если после прочтения голова немного кружится от количества информации — вот конкретный порядок действий.</p>
<p>Шаг первый: проверь текущее состояние. Запусти dnsleaktest.com с включённым VPN. Если DNS-серверы принадлежат провайдеру — утечка. Это самая быстрая победа: исправить DNS-конфиг занимает пять минут.</p>
<p>Шаг второй: если обычный WireGuard перестал работать — переходи на AmneziaWG. Установка модуля ядра занимает 20-30 минут. Сгенерируй уникальные H1-H4. Это решит проблему блокировки по сигнатуре для большинства операторов.</p>
<p>Шаг третий: если нужен доступ к своим сервисам с телефона — поставь Tailscale. Это отдельная задача от VPN для обхода блокировок, не путай их между собой.</p>
<p>Шаг четвёртый: настрой мониторинг. Простой cron-скрипт который проверяет handshake и перезапускает туннель если нужно — сэкономит нервы в нужный момент.</p>
<p>Шаг пятый: подпишись на обновления AmneziaWG на GitHub. Не потому что обновляться нужно каждый месяц, а потому что когда выходит критическое обновление — лучше узнать сразу, а не когда VPN вдруг перестанет работать в самый неподходящий момент.</p>
<h2>FAQ</h2>
<h3>Почему VPN перестал работать после того как всё настроил?</h3>
<p>Скорее всего провайдер обновил DPI и добавил сигнатуру твоего протокола в чёрный список. Или IP твоего VPS попал в базу блокировок. Диагностика простая: попробуй подключиться через мобильный интернет другого оператора. Если работает — проблема у конкретного провайдера, его DPI заблокировал твой протокол. Если не работает нигде — скорее всего IP VPS заблокирован. Смени IP на хостинге (обычно стоит 1-3 евро) или смени протокол на AmneziaWG с уникальными параметрами обфускации. Проверь также что порт 51820 UDP доступен с клиентской стороны командой nc -u.</p>
<h3>Как проверить что VPN работает правильно и нет утечек?</h3>
<p>Три проверки по порядку. Первая: открой <a href="https://ifconfig.me" target="_blank" rel="noopener">ifconfig.me</a> — должен показать IP твоего VPS, а не домашний. Вторая: запусти <a href="https://dnsleaktest.com" target="_blank" rel="noopener">dnsleaktest.com</a> в расширенном режиме — DNS-серверы в результате должны быть чужие, не провайдера. Третья: проверь <a href="https://browserleaks.com/webrtc" target="_blank" rel="noopener">browserleaks.com/webrtc</a> — реальный IP не должен светиться через WebRTC. Если все три теста прошли — всё в порядке. Повторяй проверку каждый раз после смены конфигурации.</p>
<h3>Что делать если WireGuard заблокирован провайдером?</h3>
<p>Переходи на AmneziaWG 2.0. Это форк WireGuard с рандомизацией заголовков — DPI не видит знакомой сигнатуры. Установи серверную часть через модуль ядра, сгенерируй уникальные H1-H4 параметры командой <code>od -A n -t d4 -N 4 /dev/urandom</code>, скопируй их одинаково в серверный и клиентский конфиги. Клиент для Android и iOS доступен на GitHub репозитории amnezia-vpn. Если и AmneziaWG блокируют на конкретном операторе — попробуй поменять порт на 443 UDP, или переходи на VLESS Reality.</p>
<h3>Чем Tailscale отличается от WireGuard и что выбрать?</h3>
<p>WireGuard — это протокол, Tailscale — продукт поверх WireGuard. Tailscale добавляет автоматическое управление ключами, NAT traversal и mesh-сеть, но требует доверия к серверам Tailscale Inc. — они видят метаданные о твоих устройствах. <a href="https://it-apteka.com/nastrojka-wireguard-na-vps-i-podkljuchenie-mikrotik-kak-klienta-poshagovoe-rukovodstvo/" title="Настройка WireGuard на VPS и подключение MikroTik как клиента: пошаговое руководство" target="_blank" rel="noopener" data-wpil-monitor-id="2981">WireGuard требует ручной настройки</a>, зато ты полностью контролируешь инфраструктуру и никаких внешних зависимостей. Если нужен домашний NAS доступный с телефона — Tailscale быстрее настроить. Если строишь site-to-site VPN или нужен полный контроль над данными — WireGuard. Headscale даёт удобство Tailscale без зависимости от их серверов.</p>
<h3>Безопасно ли использовать бесплатные VPN-сервисы?</h3>
<p>По данным исследований 2025 года, более 40% бесплатных VPN-сервисов не перенаправляют DNS через туннель — это означает что провайдер видит все твои DNS-запросы. Часть сервисов логирует трафик и продаёт данные рекламодателям. Несколько крупных бесплатных VPN были пойманы на встроенной рекламе, перехвате HTTP и продаже пользовательского трафика. Если нужна реальная <a class="wpil_keyword_link" href="https://it-apteka.com/category/security/" target="_blank" rel="noopener" title="Безопасность" data-wpil-keyword-link="linked" data-wpil-monitor-id="2992">защита</a> — или платный сервис с публичным независимым аудитом, или self-hosted решение на своём VPS: $5 в месяц на Hetzner закрывают задачу полностью.</p>
<h3>Почему VPN замедляет интернет и что с этим делать?</h3>
<p>Четыре причины замедления: шифрование (накладные расходы на процессор, обычно незначительны), MTU mismatch (пакеты фрагментируются — потеря скорости до 30%), расстояние до VPN-сервера (лишние 50+ мс пинга), и throttling со стороны провайдера (специально замедляет VPN-трафик не блокируя полностью). Решения: MTU в конфиге установить в 1380, выбирать VPS физически близко, при throttling пробовать другой порт или обфусцированный протокол.</p>
<h2>Итог: что реально работает в 2026</h2>
<p>VPN не умер. Он повзрослел. Та эпоха когда любой OpenVPN с любым IP гарантированно решал все проблемы — закончилась примерно в 2022-2023 годах. Сейчас это гонка технологий между DPI-системами и разработчиками протоколов обфускации, и пока что разработчики держатся.</p>
<p>Что изменилось за последние два года: блокировки стали умнее, но и инструменты обхода тоже. AmneziaWG 2.0 — это не патч поверх старого протокола, это переосмысление транспортного слоя с нуля. VLESS Reality закрывает проблему active probing которую не решает обфускация на уровне заголовков. Hysteria2 использует QUIC который провайдеры не могут заблокировать без того чтобы сломать половину современного веба.</p>
<p>Работающий стек на 2026 год: AmneziaWG 2.0 с уникальными параметрами обфускации для выхода в интернет, Tailscale или Headscale для mesh-сетки между своими устройствами, unbound или DNS-over-HTTPS для защиты DNS-трафика. Проверка через dnsleaktest.com после каждой смены конфигурации — обязательно. Это не паранойя, это базовая гигиена.</p>
<p>Ещё одна вещь которую стоит принять: нет решения которое работает вечно без обслуживания. Любой протокол потребует обновления через 6-12 месяцев когда DPI обучится на новых паттернах. Следи за релизами AmneziaWG на GitHub, подпишись на Хабр по теме — и будешь узнавать о изменениях раньше чем они тебя коснутся.</p>
"Не
<br />
Настроил по гайду, но что-то пошло не так — пиши в комментарии. Опиши: провайдер, ОС клиента, какой протокол, что показывает awg show на сервере и что за ошибка на клиенте. Разберёмся.<br />
Быстрый ответ
VPN перестал работать потому что:
- Провайдер распознаёт протокол через DPI и режет соединение ещё до установки туннеля
- DNS-запросы уходят мимо тоннеля напрямую к серверам провайдера — ты «анонимен», но тебя видно насквозь
- WireGuard имеет фиксированную сигнатуру (handshake 148 байт) — ТСПУ блокирует его без проблем с середины 2025 года
- Классические протоколы OpenVPN и IPSec давно в чёрных списках у крупных провайдеров
Работающее решение: AmneziaWG 2.0 (обфусцированный WireGuard) или Tailscale через Headscale для mesh-сетей. Ниже — разбор каждой проблемы с командами и конфигами.
Диагноз: VPN включён, но ничего не изменилось
Почему VPN не работает — вопрос который в 2025 году задают десятки тысяч людей одновременно. Ты настроил VPN, подключился, иконка горит. Но сайт не открывается. Или открывается, но провайдер всё равно видит куда ты ходишь. Или скорость упала до нуля и через 30 секунд соединение рвётся.
Это не баг конкретного клиента. Это системная проблема — мир изменился, а большинство VPN-гайдов в интернете застряли в 2019 году.
Есть три принципиально разных сценария когда «VPN не работает», и их нужно различать. Первый — туннель вообще не поднимается, DPI блокирует handshake ещё до установки соединения. Второй — туннель работает, IP сменился, но DNS течёт мимо — провайдер видит все твои домены. Третий — туннель и DNS в порядке, но конкретные сайты заблокированы на уровне IP и твой VPS тоже в этом списке. Для каждого сценария — своё решение, и я разберу все три.
Что разберём в этой статье:
- Как работает DPI и почему он распознаёт твой VPN-трафик
- Что такое ТСПУ и почему с сентября 2025 года стало хуже
- Почему WireGuard блокируют как по учебнику
- Как утечка DNS сводит на нет всю защиту
- AmneziaWG 2.0 — практическая настройка с нуля
- Tailscale vs WireGuard — когда что выбирать
- Выбор VPS, безопасность сервера, мониторинг
Времени потребуется: 20-40 минут на чтение и настройку. Нужен VPS или сервер за пределами зоны блокировок.
Краткая история: как VPN превратился из инструмента в мишень
В 2015 году настроить VPN означало: поднял OpenVPN на DigitalOcean, скопировал .ovpn файл на телефон, готово. Всё работало потому что провайдеры смотрели только на порты и IP-адреса. Если порт 1194 UDP не в чёрном списке — проходи.
Потом появились реестры заблокированных IP. Провайдеры начали блокировать целые подсети дата-центров. Все быстро переехали на случайные порты и менее известные VPS-провайдеры. Кошки-мышки, раунд один.
Раунд два начался когда в России запустили ТСПУ — Технические Средства Противодействия Угрозам. Система работает на уровне магистральных операторов, не на уровне конкретного провайдера. Ты можешь сменить ISP — это не поможет, потому что ТСПУ стоит выше.
Раунд три — 2025 год. В ТСПУ включили ML-классификаторы. Теперь система не ищет конкретные байты в заголовках — она анализирует поведение трафика в целом. Размер пакетов, временные паттерны, соотношение входящего и исходящего, энтропия данных. WireGuard заблокировали первым потому что его паттерны слишком характерны. OpenVPN лежит давно. IPSec выживает только в корпоративных исключениях.
Это не апокалипсис и не причина отчаиваться. Это просто новые условия задачи. Протоколы с обфускацией работают — просто об этом надо знать.
Как провайдер видит твой VPN-трафик: DPI изнутри
DPI — Deep Packet Inspection, глубокая инспекция пакетов. Это не волшебство и не слежка в голливудском смысле. Это промышленная система анализа трафика которая стоит между тобой и интернетом.
Классический файрвол смотрит только на заголовки пакетов: IP-адрес источника, порт назначения. DPI смотрит глубже — на структуру самого пакета, размеры, интервалы между пакетами, паттерны handshake.
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
A["Твой компьютер"] --> B["Пакет выходит в сеть"]
B --> C["DPI / ТСПУ"]
C --> D["Анализ: что за протокол?"]
D --> E["Известная сигнатура WireGuard?"]
E --> F["Блокировка / RST"]
E --> G["Нет сигнатуры - пропускаем"]
G --> H["VPN-сервер"]
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style F fill:#f8fafc,stroke:#ef4444,stroke-width:2px,color:#dc2626
style H fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style C fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#c2410c
DPI умеет несколько вещей которые делают обычный VPN бесполезным:
| Метод DPI |
Что анализирует |
Что блокирует |
| Сигнатурный анализ |
Первые байты пакета, структура handshake |
OpenVPN, WireGuard, IPSec по шаблону |
| Поведенческий анализ |
Размеры пакетов, временные паттерны |
Зашифрованные туннели с характерным ритмом |
| Статистический анализ |
Распределение длин пакетов, энтропия |
Трафик с нетипично высокой энтропией (= шифрование) |
| ML-классификация |
Комбинация всех параметров |
Даже обфусцированные протоколы если ML обучен |
| Active Probing |
DPI сам подключается к твоему серверу и проверяет |
VPN-серверы по результату зондирования |
В России это реализовано через ТСПУ — Технические Средства Противодействия Угрозам. К 2026 году ТСПУ покрывает более 95% интернет-трафика страны. С сентября 2025 года в системе включены ML-алгоритмы нового поколения которые блокируют большинство классических VPN-протоколов автоматически.
Почему WireGuard заблокировали первым
WireGuard — отличный протокол. Быстрый, простой, криптографически безупречный. И именно поэтому его заблокировали раньше всех остальных.
Проблема в предсказуемости. WireGuard handshake initiation всегда имеет фиксированный размер — 148 байт. Первые четыре байта UDP-пакета всегда [0x01, 0x00, 0x00, 0x00]. Это цифровой отпечаток на лбу.
DPI не нужно расшифровывать содержимое. Ему достаточно увидеть:
- UDP-пакет размером 148 байт
- Первые байты совпадают с WireGuard Handshake Initiation
- Через 92 байта приходит ответ (Handshake Response)
Готово — соединение убито RST-пакетом ещё до завершения рукопожатия. Туннель не поднялся ни разу.
# Проверь - твой WireGuard блокируется до handshake или после
# Запусти tcpdump на клиенте во время подключения
sudo tcpdump -i eth0 udp port 51820 -v
# Если видишь 148-байтный исходящий пакет без ответа - DPI блокирует на входе
# Если видишь SYN/RST - блокировка по IP
С середины 2025 года обычный WireGuard перестал работать через большинство российских операторов. Это не слухи — это подтверждённый факт от пользователей на Хабре и GitHub.
Кстати, аналогичная история произошла с WireGuard в Египте ещё в 2021 году — DPI научился распознавать Handshake Initiate пакеты по фиксированному размеру 148 байт и первым четырём байтам [0x01, 0x00, 0x00, 0x00]. Россия прошла тот же путь, только позже. И решение такое же: убрать предсказуемость.
Ещё одна причина почему WireGuard лёгкая мишень — он работает строго по UDP. Это само по себе сигнал для DPI. Большинство легитимного трафика ходит по TCP. Длинная UDP-сессия с характерными размерами пакетов — именно тот паттерн который DPI ищет в первую очередь.
AmneziaWG: как WireGuard научился прятаться
AmneziaWG — форк WireGuard от команды Amnezia VPN. Криптографическое ядро не тронуто: Curve25519, ChaCha20-Poly1305, BLAKE2s — всё то же самое. Поменяли только транспортный слой.
Первая версия AmneziaWG 1.x заменяла стандартные заголовки фиксированными кастомными значениями. Помогло ненадолго — DPI обучился на новых статических значениях так же быстро как на старых. Версия 2.0 пошла другим путём: вместо замены фиксированных значений на другие фиксированные — рандомизация при каждом соединении.
AmneziaWG 2.0 (выпущен в конце 2025 года) делает следующее:
- Рандомизирует заголовки всех типов пакетов — handshake initiation, handshake response, data packet, under-load packet
- Использует динамические диапазоны значений заголовков вместо статических
- Добавляет случайный паддинг к пакетам — размер больше не предсказуем
- Имитирует паттерны трафика популярных UDP-протоколов
- Добавляет junk-пакеты перед handshake — это параметры Jc, Jmin, Jmax в конфиге
DPI видит случайный поток UDP-пакетов с непредсказуемыми заголовками. Никакой знакомой сигнатуры — нечего блокировать.
Важный момент про параметры Jc/S1/S2: эти значения должны быть одинаковы на сервере и клиенте — это не ключи шифрования, а просто договорённость о формате пакетов. Но при этом они должны быть уникальными для твоей инсталляции. Если ты скопировал значения из публичного гайда (как это сделали тысячи людей) — DPI просто добавит эту комбинацию в базу сигнатур. Генерируй свои.
Установка AmneziaWG сервера на Ubuntu/Debian
Требования
VPS за пределами зоны блокировок. Ubuntu 22.04 или 24.04,
Debian 11/12. Root-доступ. Минимум 512 МБ RAM. На момент публикации актуальна AmneziaWG 2.0. Перед установкой проверь свежие релизы на github.com/amnezia-vpn/amneziawg-linux-kernel-module
# Обновляем систему
apt update && apt upgrade -y
# Устанавливаем зависимости
apt install -y wireguard-tools linux-headers-$(uname -r) build-essential git
# Клонируем репозиторий AmneziaWG
git clone https://github.com/amnezia-vpn/amneziawg-linux-kernel-module.git
cd amneziawg-linux-kernel-module
# Собираем и устанавливаем модуль ядра
make
make install
# Загружаем модуль
modprobe amneziawg
# Проверяем что модуль загружен
lsmod | grep amnezia
# Генерируем ключи сервера
awg genkey | tee /etc/amnezia/server_private.key | awg pubkey > /etc/amnezia/server_public.key
# Генерируем ключи клиента
awg genkey | tee /etc/amnezia/client_private.key | awg pubkey > /etc/amnezia/client_public.key
# Просматриваем ключи - они понадобятся для конфигов
cat /etc/amnezia/server_private.key
cat /etc/amnezia/server_public.key
cat /etc/amnezia/client_private.key
cat /etc/amnezia/client_public.key
Конфиг сервера с обфускацией. Параметры Jc, Jmin, Jmax, S1, S2, H1-H4 — это магия AmneziaWG. Они рандомизируют заголовки и добавляют junk-пакеты перед handshake:
# /etc/amnezia/awg0.conf - серверный конфиг
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = ТВОЙ_ПРИВАТНЫЙ_КЛЮЧ_СЕРВЕРА
# Обфускация AmneziaWG 2.0 - рандомизирует сигнатуру
Jc = 5
Jmin = 50
Jmax = 1000
S1 = 30
S2 = 40
H1 = 1234567891
H2 = 1234567892
H3 = 1234567893
H4 = 1234567894
# IP-форвардинг и NAT
PostUp = iptables -A FORWARD -i awg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i awg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = ПУБЛИЧНЫЙ_КЛЮЧ_КЛИЕНТА
AllowedIPs = 10.8.0.2/32
Важно про H1-H4
Значения H1-H4 в примере — учебные. Для продакшна сгенерируй свои случайные 32-битные числа командой ниже. Одинаковые значения у всех пользователей — это новая сигнатура для DPI.
# Генерируем уникальные H1-H4 для своей инсталляции
for i in 1 2 3 4; do echo "H$i = $(od -A n -t d4 -N 4 /dev/urandom | tr -d ' ')"; done
# Запускаем интерфейс AmneziaWG
awg-quick up /etc/amnezia/awg0.conf
# Включаем автозапуск
systemctl enable awg-quick@awg0
# Включаем IP-форвардинг на сервере
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
Конфиг клиента — зеркальная структура с параметрами обфускации:
# Клиентский конфиг awg-client.conf
[Interface]
Address = 10.8.0.2/24
PrivateKey = ТВОЙ_ПРИВАТНЫЙ_КЛЮЧ_КЛИЕНТА
DNS = 1.1.1.1
# Те же параметры обфускации что и на сервере - должны совпадать
Jc = 5
Jmin = 50
Jmax = 1000
S1 = 30
S2 = 40
H1 = 1234567891
H2 = 1234567892
H3 = 1234567893
H4 = 1234567894
[Peer]
PublicKey = ПУБЛИЧНЫЙ_КЛЮЧ_СЕРВЕРА
Endpoint = IP_СЕРВЕРА:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
Проверка что AmneziaWG работает
# На сервере - проверяем статус
awg show
# Должно показать интерфейс awg0, пиров и last handshake
# Если latest handshake есть - туннель работает
# На клиенте Linux
awg-quick up /path/to/awg-client.conf
curl ifconfig.me
# Должен показать IP твоего VPS, а не домашний IP
Утечка DNS: анонимность со сквозняком
Вот сценарий который встречается у 40% пользователей VPN. Туннель поднят. IP поменялся. Но DNS-запросы уходят мимо туннеля — напрямую к серверам провайдера.
Что это означает на практике: провайдер не видит твои HTTP-запросы, но видит все DNS-резолвы. То есть знает каждый домен который ты посетил. ТСПУ анализирует DNS-трафик на магистральных каналах и использует его для блокировки ресурсов и детекции самого факта использования VPN.
Почему DNS вообще может уйти мимо туннеля? Несколько механизмов.
Первый — DNS не указан в конфиге VPN-клиента. Операционная система использует свои настройки DNS которые были до VPN, то есть сервер провайдера. Решается добавлением строки DNS в секцию [Interface] конфига WireGuard.
Второй — операционная система игнорирует DNS из конфига VPN. Windows особенно грешит этим через механизм Smart Multi-Homed Name Resolution: если один DNS-сервер отвечает медленно, Windows спрашивает все доступные серверы параллельно и берёт первый ответ. Первым обычно отвечает провайдерский DNS, он рядом.
Третий — IPv6 DNS утечка. Если в AllowedIPs не прописан ::/0, весь IPv6-трафик включая DNS идёт напрямую. Современные операционные системы активно используют IPv6 когда он доступен.
Четвёртый — split DNS. Некоторые корпоративные VPN настроены так что только корпоративные домены идут через туннель, остальное — напрямую. В этом случае все твои личные запросы видит провайдер.
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
A["Твой браузер"] --> B["DNS-запрос: example.com?"]
B --> C{Куда идёт DNS?}
C --> D["Через VPN-туннель"]
C --> E["Мимо туннеля к провайдеру"]
D --> F["DNS-сервер VPN или 1.1.1.1"]
E --> G["DNS провайдера - УТЕЧКА"]
G --> H["Провайдер знает все твои сайты"]
F --> I["Анонимность сохранена"]
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style E fill:#f8fafc,stroke:#ef4444,stroke-width:2px,color:#dc2626
style G fill:#f8fafc,stroke:#ef4444,stroke-width:2px,color:#dc2626
style I fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
Как проверить утечку DNS
# Быстрая проверка в терминале
# Без VPN - запомни какой DNS показывает
dig +short myip.opendns.com @resolver1.opendns.com
# Включи VPN и проверь снова
dig +short myip.opendns.com @resolver1.opendns.com
# Если оба раза один и тот же IP - VPN не работает
# Если разные - хорошо, но DNS может всё равно течь
# Проверяем именно DNS-резолвер
nslookup whoami.akamai.net
# Ответ должен быть с IP твоего VPS или публичного DoH-резолвера
Также используй онлайн-сервисы: dnsleaktest.com или browserleaks.com/dns. Запусти тест дважды — до и после включения VPN. DNS-серверы в результате должны смениться.
Как исправить утечку DNS в WireGuard/AmneziaWG
Причина утечки обычно одна из трёх: DNS не указан в конфиге клиента, AllowedIPs не включает DNS-трафик, или операционная система игнорирует DNS из конфига (привет, Windows с его Smart Multi-Homed Name Resolution).
# В клиентском конфиге WireGuard/AmneziaWG обязательно:
[Interface]
DNS = 1.1.1.1, 1.0.0.1
# Или используй DNS своего VPS: 10.8.0.1 (если поднял unbound/dnsmasq там)
[Peer]
AllowedIPs = 0.0.0.0/0, ::/0
# AllowedIPs = 0.0.0.0/0 - весь IPv4 трафик через туннель
# ::/0 - весь IPv6, иначе DNS через IPv6 утечёт мимо
# На сервере поднять локальный DNS чтобы не светить 1.1.1.1 в логах
apt install -y unbound
# Минимальный конфиг unbound - слушает только на интерфейсе VPN
cat > /etc/unbound/unbound.conf.d/vpn.conf << 'EOF'
server:
interface: 10.8.0.1
access-control: 10.8.0.0/24 allow
hide-identity: yes
hide-version: yes
use-caps-for-id: yes
prefetch: yes
EOF
systemctl restart unbound
systemctl enable unbound
# Windows: отключить Smart Multi-Homed Name Resolution через реестр
# (причина №1 утечек DNS на Windows даже при правильном конфиге WG)
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\DNSClient" /v DisableSmartNameResolution /t REG_DWORD /d 1 /f
# Проверить результат - запусти после изменения:
ipconfig /flushdns
# И снова тест на dnsleaktest.com
Tailscale и WireGuard: когда что выбирать
Tailscale часто рекламируют как «WireGuard только проще». Это правда, но неполная.
Tailscale — это продукт поверх WireGuard. Он добавляет control plane: автоматическое обнаружение устройств, обмен ключами, NAT traversal, MagicDNS, ACL. Ты не пишешь конфиги вручную — просто устанавливаешь клиент и устройства видят друг друга.
Проблема в том что control plane Tailscale — закрытый код и хостится у Tailscale Inc. Они не могут читать твой трафик (шифрование end-to-end на WireGuard), но видят метаданные: какие устройства онлайн, с каких IP подключаются. Для корпоративной среды это серьёзный вопрос.
Другая проблема Tailscale в контексте этой статьи: он не решает задачу обхода DPI для исходящего трафика. Tailscale отлично подходит чтобы с телефона достучаться до домашнего NAS или до рабочего сервера. Но если цель — выходить в интернет через VPS обходя блокировки — для этого нужен exit node, и его трафик всё равно идёт через WireGuard который может быть заблокирован. AmneziaWG решает именно задачу выхода в интернет через обфусцированный туннель.
По факту это не конкуренты, а инструменты для разных задач. У меня в инфраструктуре оба: Tailscale для mesh-доступа к своим сервисам, AmneziaWG для выхода в интернет.
| Критерий |
WireGuard (self-hosted) |
Tailscale (облако) |
Headscale (self-hosted) |
| Сложность настройки |
Высокая — конфиги вручную |
Минимальная — 5 минут |
Средняя |
| Control plane |
Нет — ты сам |
Tailscale Inc. |
Твой сервер |
| NAT traversal |
Вручную / не всегда |
Автоматически |
Автоматически |
| Утечка метаданных |
Нет |
К Tailscale Inc. |
Нет |
| CGNAT/Starlink |
Сложно |
Работает |
Работает |
| Обход DPI |
Нет (нужен AmneziaWG) |
Частично |
Частично |
| Цена |
Бесплатно |
Free/20$/мес |
Бесплатно |
| Подходит для |
Site-to-site, продакшн |
Homelab, команды |
Privacy-ориентированный homelab |
Tailscale выигрывает когда ты за CGNAT или Starlink, когда нужно быстро подключить несколько устройств без возни с конфигами, когда в команде есть нетехнические люди. Чистый WireGuard — когда нужен полный контроль, site-to-site между роутерами, или ты строишь что-то для продакшна где зависимость от внешнего сервиса недопустима.
Headscale: Tailscale без Tailscale
Headscale — open-source реализация control server от Tailscale. Разворачиваешь на своём VPS и получаешь всю удобность Tailscale без зависимости от их инфраструктуры.
# Установка Headscale на Ubuntu
HEADSCALE_VERSION=$(curl -s https://api.github.com/repos/juanfont/headscale/releases/latest | grep tag_name | cut -d '"' -f 4)
wget "https://github.com/juanfont/headscale/releases/download/${HEADSCALE_VERSION}/headscale_linux_amd64"
chmod +x headscale_linux_amd64
mv headscale_linux_amd64 /usr/local/bin/headscale
# Создаём конфиг директорию
mkdir -p /etc/headscale /var/lib/headscale
# Скачиваем пример конфига
wget https://raw.githubusercontent.com/juanfont/headscale/main/config-example.yaml \
-O /etc/headscale/config.yaml
# Правим server_url на свой домен/IP
# После - запускаем
headscale serve
# Создаём пользователя и генерируем ключ для клиента
headscale users create myuser
headscale preauthkeys create --user myuser --reusable --expiration 24h
Другие утечки: WebRTC и IPv6
DNS — самая частая утечка, но не единственная.
WebRTC — браузерный протокол для видеозвонков. Он умеет определять реальный IP даже за NAT и даже при включённом VPN через STUN-серверы. Если ты открываешь meet.google.com или Discord в браузере с включённым VPN — есть шанс что WebRTC засветил твой домашний IP.
Механизм такой: браузер запрашивает STUN-сервер (stun.google.com и подобные) для определения своего публичного IP. Этот запрос идёт в обход VPN-туннеля на уровне браузера, а не операционной системы. VPN-клиент который работает как сетевой интерфейс — не видит этот трафик.
# Проверить WebRTC утечку можно на:
# https://browserleaks.com/webrtc
# или https://ipleak.net
# Отключить WebRTC в Firefox через about:config:
# media.peerconnection.enabled = false
# Chrome/Edge - только через расширение WebRTC Network Limiter
# или через режим "Route all traffic through VPN" в настройках системы
IPv6 — ещё одна дыра. WireGuard по умолчанию роутит только IPv4 если не указать явно ::/0 в AllowedIPs. Все IPv6-запросы уходят напрямую. Если у твоего провайдера есть IPv6 (а у большинства в 2025 году он есть) — ты светишься по IPv6 даже при правильно настроенном IPv4-туннеле.
# Проверяем есть ли IPv6 утечка
curl -6 ifconfig.me
# Если ответил - IPv6 работает напрямую
# Решение 1: добавить в AllowedIPs клиентского конфига
# AllowedIPs = 0.0.0.0/0, ::/0
# Решение 2: отключить IPv6 на интерфейсе если VPS его не поддерживает
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
Системные требования
| Компонент |
Минимум |
Рекомендуется |
| ОС сервера (VPS) |
Ubuntu 20.04 / Debian 11 |
Ubuntu 24.04 / Debian 12 |
| Ядро Linux |
5.4+ |
6.1+ (нативный WireGuard в ядре) |
| AmneziaWG |
2.0 (конец 2025) |
Последний релиз с GitHub |
| Tailscale |
1.70+ |
Последний стабильный |
| Headscale |
0.23+ |
Последний релиз |
| RAM сервера |
512 МБ |
1 ГБ (с unbound DNS) |
| ОС клиента |
Windows 10, Android 8, iOS 15 |
Windows 11, Android 12+, iOS 16+ |
Порты и фаервол
| Порт |
Протокол |
Назначение |
Открыт снаружи |
| 51820 |
UDP |
WireGuard / AmneziaWG |
Да |
| 41641 |
UDP |
Tailscale DERP relay |
Нет (исходящий) |
| 853 |
TCP |
DNS over TLS (часто блокируется) |
Нет |
| 443 |
TCP/UDP |
DoH, QUIC-маскировка |
Нет (исходящий) |
| 53 |
UDP |
Локальный unbound DNS |
Нет (только LAN) |
# Минимальная настройка UFW на VPS
ufw allow ssh
ufw allow 51820/udp
ufw enable
# Проверяем что правила применились
ufw status verbose
Выбор VPS: где поднимать сервер и на что смотреть
Даже идеально настроенный AmneziaWG не поможет если IP твоего сервера уже в чёрных списках. Это первое на что нужно смотреть при выборе VPS для VPN.
Проверь IP перед покупкой. Большинство хостингов позволяют узнать IP заранее или дают тестовый период. Прогони через базы блокировок и через простой тест — просто зайди на заблокированный в твоей стране сайт напрямую с этого IP через curl:
# Проверяем с сервера - доступен ли условно заблокированный ресурс
curl -I --max-time 10 https://example-blocked-site.com
# Проверяем что IP не в спам-листах
curl "https://api.abuseipdb.com/api/v2/check?ipAddress=$(curl -s ifconfig.me)" \
-H "Key: ВАШ_API_KEY" \
-H "Accept: application/json"
Географически лучше брать серверы в Финляндии, Нидерландах, Германии или в Прибалтике. Они близко по пингу к России, хорошая связность, и эти страны не участвуют в массовой блокировке VPS-провайдеров. Американские и азиатские серверы работают, но пинг выше.
Избегай слишком дешёвых хостингов с общими IP-пулами. Если один клиент на этом IP занимается спамом или чем похуже — IP попадает в базы блокировок и тянет за собой всех соседей. Платить за выделенный IP — это не роскошь, это минимальная гигиена.
Отдельный момент: некоторые операторы блокируют не конкретные IP, а целые ASN (автономные системы) крупных хостингов. DigitalOcean ASN, Hetzner ASN, Vultr ASN — в отдельных сетях они могут быть заблокированы полностью. Если VPS на Hetzner не работает — попробуй менее популярный хостинг с другим ASN.
Безопасность VPN-сервера: минимальный чеклист
VPN-сервер — это твоя точка выхода в интернет. Если его взломают — весь твой трафик скомпрометирован. Несколько обязательных шагов которые нужно сделать сразу после установки.
SSH hardening. Первым делом меняй порт и запрещай вход по паролю:
# Редактируем /etc/ssh/sshd_config
# Меняем порт с 22 на произвольный
Port 2222
# Запрещаем вход root по SSH
PermitRootLogin no
# Запрещаем вход по паролю
PasswordAuthentication no
# Перезапускаем SSH (не закрывай текущую сессию до проверки!)
systemctl restart sshd
# Открываем новый порт в UFW
ufw allow 2222/tcp
# fail2ban - защита от брутфорса SSH
apt install -y fail2ban
# Конфиг для SSH
cat > /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = 2222
maxretry = 3
bantime = 3600
findtime = 600
EOF
systemctl enable fail2ban
systemctl start fail2ban
# Проверяем статус
fail2ban-client status sshd
Закрываем всё лишнее. После установки AmneziaWG на сервере должны быть открыты только два порта: SSH (твой кастомный) и UDP 51820 для VPN. Всё остальное — закрыто:
# Проверяем текущие правила
ufw status verbose
# Должно быть примерно так:
# 2222/tcp ALLOW IN
# 51820/udp ALLOW IN
# Всё остальное - DENY
# Если что-то лишнее открыто:
ufw delete allow 80/tcp # например если открыли для проверки
Автоматические обновления безопасности. Сервер должен получать security-патчи без твоего участия. Прострел через незакрытую уязвимость ядра — классическая история:
apt install -y unattended-upgrades
# Активируем автообновления безопасности
dpkg-reconfigure --priority=low unattended-upgrades
# Проверяем конфиг
cat /etc/apt/apt.conf.d/50unattended-upgrades | grep -A5 "Unattended-Upgrade::Allowed"
Один пользователь для VPN. Не запускай awg-quick от root в продакшне. Создай отдельного пользователя с минимальными правами:
# Создаём системного пользователя для VPN
useradd -r -s /sbin/nologin vpnuser
# Даём права на управление интерфейсом через sudo
echo "vpnuser ALL=(root) NOPASSWD: /usr/bin/awg-quick" >> /etc/sudoers.d/vpnuser
chmod 440 /etc/sudoers.d/vpnuser
Клиенты AmneziaWG: что ставить на телефон и ноутбук
Официальные клиенты AmneziaWG поддерживают Android, iOS, Windows, macOS и Linux. Это важно: нельзя использовать обычный клиент WireGuard с конфигом AmneziaWG — он не понимает параметры обфускации и просто их игнорирует, работая как чистый WireGuard.
Android: приложение AmneziaWG доступно на GitHub releases и в F-Droid. В Google Play может быть устаревшая версия — лучше брать с GitHub.
iOS: приложение AmneziaVPN в App Store. Поддерживает AmneziaWG конфиги, импорт через QR-код или файл.
Windows: клиент доступен на официальном сайте amnezia.org. Поддерживает импорт .conf файла. Убедись что версия не старше 4.x — старые клиенты не поддерживают AWG 2.0 параметры.
Linux: можно использовать awg-quick напрямую (как в этой статье) или установить GUI клиент. Для headless серверов awg-quick через systemd — это всё что нужно.
# Генерируем QR-код для импорта на мобильное устройство
# (на сервере, устанавливаем qrencode)
apt install -y qrencode
# Генерируем QR из клиентского конфига
qrencode -t ANSIUTF8 < /etc/amnezia/client.conf
# Или сохраняем как PNG
qrencode -t PNG -o /tmp/vpn-client-qr.png < /etc/amnezia/client.conf
Важный момент для мобильных: на Android и iOS VPN-клиент должен быть настроен как Always-on VPN с опцией Block connections without VPN. Это предотвращает утечку трафика в момент переключения между WiFi и мобильным интернетом — именно тогда чаще всего происходят DNS-утечки на мобильных устройствах.
Проверка через tcpdump: что реально уходит в сеть
Онлайн-тесты удобны, но иногда нужно видеть трафик своими глазами. tcpdump — твой главный инструмент диагностики когда что-то идёт не так.
# Смотрим весь DNS-трафик на клиентской машине
# -n не резолвить имена, -i any все интерфейсы, port 53 только DNS
sudo tcpdump -n -i any port 53
# Включи VPN и посмотри что происходит
# Если видишь DNS-запросы с интерфейса не-VPN - это утечка
# Нормально: DNS только через интерфейс туннеля (wg0, awg0, utun)
# Проверяем что WireGuard/AmneziaWG трафик идёт через нужный интерфейс
sudo tcpdump -n -i eth0 udp port 51820
# Должно показывать UDP-пакеты с твоим IP и IP сервера
# Если пакеты есть - туннель поднимается
# Если пакетов нет после wg-quick up - проверь firewall на клиенте
# Проверяем маршрутизацию - куда идут пакеты
ip route get 8.8.8.8
# Должно показать через интерфейс VPN: dev awg0
# Если показывает физический интерфейс - маршрут не прописался
# Проверь AllowedIPs в конфиге - должен быть 0.0.0.0/0
Ещё один полезный трюк — посмотреть на статистику интерфейса до и после тестирования. Если байты растут только на VPN-интерфейсе — трафик идёт туда куда надо:
# Статистика интерфейсов
watch -n 1 'cat /proc/net/dev | grep -E "awg0|eth0|wg0"'
# Открываешь сайт - смотришь на каком интерфейсе растут RX/TX байты
| Симптом |
Причина |
Решение |
| Handshake не проходит, соединение рвётся через 30 сек |
DPI блокирует WireGuard по сигнатуре |
Переход на AmneziaWG с обфускацией, уникальные H1-H4 |
| Туннель поднят, IP сменился, но DNS светит провайдера |
DNS не идёт через туннель (утечка) |
Указать DNS в конфиге, AllowedIPs = 0.0.0.0/0, ::/0 |
| VPN работает, но IPv6 не через туннель |
AllowedIPs не включает IPv6 |
Добавить ::/0 в AllowedIPs или отключить IPv6 |
| Туннель работает, но сайты иногда не открываются |
MTU mismatch — WireGuard overhead |
Установить MTU 1380 в [Interface] обоих конфигов |
| После подключения пропал интернет полностью |
IP-форвардинг выключен на сервере или PostUp не сработал |
sysctl net.ipv4.ip_forward=1, проверить iptables правила |
| AmneziaWG клиент не видит сервер |
Параметры Jc/S1/S2/H1-H4 не совпадают на клиенте и сервере |
Скопировать параметры обфускации точно, без изменений |
| Tailscale не устанавливает прямое соединение, идёт через relay |
Оба устройства за строгим NAT |
Настроить exit node или subnet router на VPS |
| awg: command not found после установки модуля |
Пакет wireguard-tools не установлен или awg не в PATH |
apt install wireguard-tools, проверить /usr/bin/awg |
Разбор типичных ситуаций из практики
Теория это хорошо, но давай разберём конкретные сценарии которые встречаются чаще всего.
Ситуация первая: WireGuard работал, потом перестал. Без изменений с твоей стороны. Это классика. Провайдер обновил ТСПУ или активировал новое правило. Первый шаг диагностики: проверь тот же конфиг через мобильный интернет (другой провайдер). Если через мобильный работает — проблема у конкретного домашнего провайдера. Решение: переход на AmneziaWG или смена порта. Если и через мобильный не работает — IP VPS заблокирован. Смени IP или хостинг.
Ситуация вторая: VPN работает, IP сменился, но некоторые сайты всё равно недоступны. Возможны два варианта. Первый: сайт заблокирован по IP и IP твоего VPS тоже в списке — это случается с популярными хостингами где много VPN-пользователей. Смени хостинг на менее популярный. Второй вариант: утечка DNS. Твой браузер резолвит домен через провайдерский DNS, получает заблокированный IP и не открывает сайт. Проверь и исправь DNS как описано выше.
Ситуация третья: VPN работает дома, не работает на работе или в другом месте. Скорее всего корпоративная сеть или сеть отеля блокирует исходящий UDP 51820. Решение: поднять второй экземпляр AmneziaWG на порту 443 UDP. Этот порт блокируют крайне редко. Альтернатива — VLESS Reality на TCP 443, это вообще неотличимо от обычного HTTPS.
Ситуация четвёртая: скорость через VPN в 3-5 раз ниже чем без VPN. Первое что проверяем — MTU. Установи в конфиге клиента MTU = 1380 и перезапусти туннель. Второе — физическое расстояние до VPS. Если сервер в Сингапуре а ты в Москве — 100+ мс пинга это физика, не баг. Третье — throttling. Некоторые провайдеры специально режут скорость VPN-трафика не блокируя его полностью. Обфускация через AmneziaWG помогает и здесь — трафик выглядит как обычный UDP и не попадает в правила throttling.
# Диагностика MTU - ищем оптимальный размер
# Пингуем с размером пакета и смотрим когда начинают дропаться
ping -M do -s 1450 IP_СЕРВЕРА
ping -M do -s 1400 IP_СЕРВЕРА
ping -M do -s 1350 IP_СЕРВЕРА
# Первый размер при котором пинг проходит - добавь 28 (IP+ICMP заголовки)
# Это и есть твой оптимальный MTU для WireGuard интерфейса
# Тест скорости через туннель
# Установи iperf3 на сервере и клиенте
# На сервере:
iperf3 -s
# На клиенте (при активном VPN-туннеле):
iperf3 -c IP_СЕРВЕРА -t 10
# Если скорость нормальная - проблема не в туннеле
# Если низкая - MTU или throttling
Ситуация пятая: на Android VPN постоянно отключается в фоне. Это оптимизация батареи убивает VPN-процесс. На Android нужно: добавить AmneziaWG или Tailscale в исключения из оптимизации батареи, включить Always-on VPN в настройках сети (Настройки — Сеть — VPN — шестерёнка у нужного VPN), и убедиться что включена опция Block connections without VPN. После этого система не будет убивать VPN-процесс.
Ситуация шестая: IPv6 работает а IPv4 через туннель не идёт. Странный сценарий но бывает. Проверь что PostUp правила в конфиге сервера применились — запусти iptables -t nat -L POSTROUTING на сервере. Если правила есть но трафик не идёт — проверь net.ipv4.ip_forward через sysctl net.ipv4.ip_forward. Должно быть 1. После каждой перезагрузки значение сбрасывается если не прописать в /etc/sysctl.conf.
DNS-over-HTTPS: дополнительная защита поверх VPN
Даже с правильно настроенным VPN и Unbound на сервере есть одна точка утечки: DNS-запросы от самого сервера к вышестоящим резолверам. Unbound по умолчанию делает рекурсивные запросы напрямую к root-серверам — это работает, но трафик виден операторам на пути.
Решение: настроить Unbound использовать DoH (DNS-over-HTTPS) или DoT (DNS-over-TLS) к доверенному резолверу. Cloudflare 1.1.1.1, Quad9 9.9.9.9 или Mullvad DNS поддерживают оба протокола.
# Устанавливаем dnscrypt-proxy для DoH
apt install -y dnscrypt-proxy
# Конфиг dnscrypt-proxy
cat > /etc/dnscrypt-proxy/dnscrypt-proxy.toml << 'EOF'
listen_addresses = ['127.0.0.1:5300']
server_names = ['cloudflare', 'cloudflare-ipv6']
require_dnssec = true
require_nolog = true
require_nolog = true
EOF
systemctl enable dnscrypt-proxy
systemctl start dnscrypt-proxy
# Настраиваем Unbound использовать dnscrypt-proxy как upstream
# Добавляем в /etc/unbound/unbound.conf.d/vpn.conf:
cat >> /etc/unbound/unbound.conf.d/vpn.conf << 'EOF'
forward-zone:
name: "."
forward-addr: 127.0.0.1@5300
EOF
systemctl restart unbound
# Проверяем что DNS резолвится через наш стек
dig @10.8.0.1 example.com
# Должен отвечать с минимальной задержкой
Теперь цепочка полная: браузер — AmneziaWG туннель — Unbound на сервере — dnscrypt-proxy (DoH) — Cloudflare. Каждый уровень шифрует и изолирует DNS от провайдера.
Настроил один раз — не значит работает вечно. DPI-системы обновляются, сигнатуры меняются, блокировки расширяются. Несколько практик которые снижают вероятность «опять не работает».
Мониторинг туннеля. Простой скрипт который проверяет что last handshake был недавно и пингует внешний IP через туннель:
#!/bin/bash
# /usr/local/bin/check-vpn.sh - запускать через cron каждые 5 минут
PEER_PUBKEY="ПУБЛИЧНЫЙ_КЛЮЧ_КЛИЕНТА"
MAX_HANDSHAKE_AGE=300 # 5 минут в секундах
LAST_HANDSHAKE=$(awg show awg0 latest-handshakes | grep "$PEER_PUBKEY" | awk '{print $2}')
NOW=$(date +%s)
AGE=$((NOW - LAST_HANDSHAKE))
if [ "$AGE" -gt "$MAX_HANDSHAKE_AGE" ]; then
echo "$(date): Peer $PEER_PUBKEY handshake too old (${AGE}s), restarting tunnel"
systemctl restart awg-quick@awg0
fi
# Добавляем в cron
(crontab -l; echo "*/5 * * * * /usr/local/bin/check-vpn.sh >> /var/log/vpn-check.log 2>&1") | crontab -
Резервный порт. Если порт 51820 начали блокировать — у тебя должен быть запасной. Добавь второй ListenPort в конфиге сервера или подними второй экземпляр на порту 443 UDP. Блокировку 443 UDP провайдеры избегают — там сидит QUIC/HTTP3.
# Проверяем что порт 51820 UDP реально достижим с клиентской стороны
# (запускаем на сервере)
nc -u -l 51820 &
# На клиенте:
echo "test" | nc -u IP_СЕРВЕРА 51820
# Если на сервере пришло "test" - порт открыт
Бэкап конфигов. Кажется очевидным, но после пятого «перенастрой мне VPN» от знакомых я убедился что нет.
# Бэкапим все ключи и конфиги
tar czf /root/vpn-backup-$(date +%Y%m%d).tar.gz /etc/amnezia/ /etc/wireguard/
# Проверяем что бэкап читается
tar tzf /root/vpn-backup-*.tar.gz | head -20
Как обновлять AmneziaWG безопасно
AmneziaWG — kernel module. Обновление требует пересборки модуля под новое ядро. Если сначала обновить ядро а потом забыть пересобрать модуль — после перезагрузки VPN не поднимется. Алгоритм обновления такой:
# 1. Проверяем текущую версию модуля
modinfo amneziawg | grep version
# 2. Перед обновлением системы - сохрани рабочий конфиг
awg showconf awg0 > /root/awg0-backup-$(date +%Y%m%d).conf
# 3. Обновляем систему
apt update && apt upgrade -y
# 4. Проверяем версию ядра - изменилась ли
uname -r
# 5. Если ядро обновилось - пересобираем модуль
cd /root/amneziawg-linux-kernel-module
git pull
make clean
make
make install
modprobe amneziawg
# 6. Перезапускаем туннель
systemctl restart awg-quick@awg0
# 7. Проверяем
awg show
Как откатиться если что-то пошло не так: у тебя есть бэкап конфига и бэкап архива с ключами. Переустанови модуль из сохранённой версии репозитория или скачай предыдущий релиз с GitHub. Ключи не меняются — туннель поднимется с теми же настройками.
Альтернативы: когда AmneziaWG не помогает
Бывает что и AmneziaWG не проходит — особенно на некоторых мобильных операторах где DPI особенно агрессивный. Вот что пробовать дальше.
VLESS + Reality — протокол из экосистемы Xray. Маскируется под TLS-трафик к реальному HTTPS-сайту (например cloudflare.com). DPI видит обычный TLS handshake к легитимному домену. Сложнее в настройке, но устойчивее к active probing. Active probing — это когда DPI не просто анализирует твой трафик, а сам подключается к твоему серверу и проверяет как тот отвечает. VLESS Reality отвечает как обычный HTTPS-сервер — проверка проходит.
Hysteria2 — работает поверх QUIC (UDP 443). Имитирует HTTP/3 трафик. Хорошо проходит через операторов где UDP 51820 заблокирован, но QUIC разрешён. Дополнительный бонус: QUIC имеет congestion control оптимизированный для нестабильных соединений, поэтому Hysteria2 субъективно ощущается быстрее на мобильном интернете с потерями пакетов.
Shadowsocks-2022 с плагином obfs4 — проверенная классика для ситуаций где нужна максимальная совместимость со старыми клиентами. Версия 2022 с AEAD шифрованием значительно устойчивее к детекции чем старый Shadowsocks. Clients: Android, iOS, Windows, macOS, Linux — всё есть.
AmneziaVPN (клиент) — отдельная история. Это не только AmneziaWG, это клиент который поддерживает несколько протоколов включая OpenVPN поверх Cloak, WireGuard с обфускацией и AmneziaWG. Если у тебя уже есть OpenVPN конфиг — Amnezia может обернуть его в Cloak и попробовать пробить блокировку без смены протокола. Иногда это самый быстрый путь реанимировать уже настроенный VPN.
| Протокол |
Устойчивость к DPI |
Скорость |
Сложность настройки |
Клиенты |
| WireGuard (чистый) |
Низкая (блокируется) |
Максимальная |
Низкая |
Все ОС |
| AmneziaWG 2.0 |
Высокая |
Высокая |
Средняя |
Android, iOS, Linux, Windows |
| VLESS + Reality |
Очень высокая |
Высокая |
Высокая |
Hiddify, v2rayNG, Nekobox |
| Hysteria2 |
Высокая |
Высокая (QUIC) |
Средняя |
Android, iOS, Windows, Linux |
| Tailscale |
Средняя |
Высокая |
Минимальная |
Все ОС |
| OpenVPN + obfsproxy |
Средняя |
Низкая |
Высокая |
Все ОС |
Мифы о VPN которые стоят тебе анонимности
За 25 лет в профессии я слышал достаточно уверенных заявлений о VPN которые были полной ерундой. Разберём самые живучие.
Миф первый: «VPN скрывает меня полностью». Нет. VPN скрывает содержимое трафика и подменяет IP. Но не скрывает сам факт использования VPN — это видно по паттернам трафика. Не скрывает тебя от браузерных fingerprint-техник: canvas, WebGL, user-agent. Не скрывает cookies и аккаунты в браузере. Если ты вошёл в Google под своим аккаунтом через VPN — Google знает кто ты. IP тут не причём.
Миф второй: «Платный VPN надёжнее бесплатного». Иногда да, иногда нет. Критерий не цена, а независимый аудит. Лучшие VPN-сервисы публикуют проверки своих систем логирования сторонними компаниями. Если провайдер говорит «мы не храним логи» но аудита нет — это просто слова. Mullvad, ProtonVPN, IVPN публикуют такие аудиты. Это не реклама, это факт.
Миф третий: «WireGuard быстрее OpenVPN значит лучше». Быстрее — да. Но в условиях блокировок скорость не главный параметр. Главный — проходит или нет. AmneziaWG немного медленнее чистого WireGuard из-за оверхеда обфускации. Это цена за прохождение через DPI. Платить стоит.
Миф четвёртый: «VPN защищает от вирусов». Нет. VPN — это шифрованный туннель для трафика. Он никак не влияет на вредоносное ПО которое уже на твоей машине. Антивирус и VPN решают разные задачи.
Миф пятый: «Если VPN работает — DNS тоже в порядке». Это мы уже разобрали выше. Нет — проверяй отдельно всегда.
Архитектура: как всё связано в рабочей схеме
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '14px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 40, 'rankSpacing': 50}
}}%%
flowchart TD
A["Клиент: телефон/ноутбук"] --> B["AmneziaWG клиент"]
B --> C["Обфускация: рандомные заголовки AWG 2.0"]
C --> D["ТСПУ / DPI анализирует трафик"]
D --> E["Сигнатура не распознана - пропуск"]
E --> F["VPS в Финляндии/Нидерландах"]
F --> G["AmneziaWG сервер + Unbound DNS"]
G --> H["Выход в открытый интернет"]
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style D fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#c2410c
style E fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style F fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style H fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
Клиент отправляет трафик через AmneziaWG с рандомизированными заголовками — DPI не видит знакомой сигнатуры и пропускает пакеты. На сервере Unbound принимает DNS-запросы через туннель — они не светятся провайдеру. iptables делает NAT — трафик выходит с IP сервера.
Если нужен mesh-доступ к нескольким своим устройствам — добавляем Tailscale/Headscale поверх этой схемы. Они работают независимо: AmneziaWG для выхода наружу, Tailscale для доступа к своей инфраструктуре.
План действий: с чего начать прямо сейчас
Если после прочтения голова немного кружится от количества информации — вот конкретный порядок действий.
Шаг первый: проверь текущее состояние. Запусти dnsleaktest.com с включённым VPN. Если DNS-серверы принадлежат провайдеру — утечка. Это самая быстрая победа: исправить DNS-конфиг занимает пять минут.
Шаг второй: если обычный WireGuard перестал работать — переходи на AmneziaWG. Установка модуля ядра занимает 20-30 минут. Сгенерируй уникальные H1-H4. Это решит проблему блокировки по сигнатуре для большинства операторов.
Шаг третий: если нужен доступ к своим сервисам с телефона — поставь Tailscale. Это отдельная задача от VPN для обхода блокировок, не путай их между собой.
Шаг четвёртый: настрой мониторинг. Простой cron-скрипт который проверяет handshake и перезапускает туннель если нужно — сэкономит нервы в нужный момент.
Шаг пятый: подпишись на обновления AmneziaWG на GitHub. Не потому что обновляться нужно каждый месяц, а потому что когда выходит критическое обновление — лучше узнать сразу, а не когда VPN вдруг перестанет работать в самый неподходящий момент.
FAQ
Почему VPN перестал работать после того как всё настроил?
Скорее всего провайдер обновил DPI и добавил сигнатуру твоего протокола в чёрный список. Или IP твоего VPS попал в базу блокировок. Диагностика простая: попробуй подключиться через мобильный интернет другого оператора. Если работает — проблема у конкретного провайдера, его DPI заблокировал твой протокол. Если не работает нигде — скорее всего IP VPS заблокирован. Смени IP на хостинге (обычно стоит 1-3 евро) или смени протокол на AmneziaWG с уникальными параметрами обфускации. Проверь также что порт 51820 UDP доступен с клиентской стороны командой nc -u.
Как проверить что VPN работает правильно и нет утечек?
Три проверки по порядку. Первая: открой ifconfig.me — должен показать IP твоего VPS, а не домашний. Вторая: запусти dnsleaktest.com в расширенном режиме — DNS-серверы в результате должны быть чужие, не провайдера. Третья: проверь browserleaks.com/webrtc — реальный IP не должен светиться через WebRTC. Если все три теста прошли — всё в порядке. Повторяй проверку каждый раз после смены конфигурации.
Что делать если WireGuard заблокирован провайдером?
Переходи на AmneziaWG 2.0. Это форк WireGuard с рандомизацией заголовков — DPI не видит знакомой сигнатуры. Установи серверную часть через модуль ядра, сгенерируй уникальные H1-H4 параметры командой od -A n -t d4 -N 4 /dev/urandom, скопируй их одинаково в серверный и клиентский конфиги. Клиент для Android и iOS доступен на GitHub репозитории amnezia-vpn. Если и AmneziaWG блокируют на конкретном операторе — попробуй поменять порт на 443 UDP, или переходи на VLESS Reality.
Чем Tailscale отличается от WireGuard и что выбрать?
WireGuard — это протокол, Tailscale — продукт поверх WireGuard. Tailscale добавляет автоматическое управление ключами, NAT traversal и mesh-сеть, но требует доверия к серверам Tailscale Inc. — они видят метаданные о твоих устройствах. WireGuard требует ручной настройки, зато ты полностью контролируешь инфраструктуру и никаких внешних зависимостей. Если нужен домашний NAS доступный с телефона — Tailscale быстрее настроить. Если строишь site-to-site VPN или нужен полный контроль над данными — WireGuard. Headscale даёт удобство Tailscale без зависимости от их серверов.
Безопасно ли использовать бесплатные VPN-сервисы?
По данным исследований 2025 года, более 40% бесплатных VPN-сервисов не перенаправляют DNS через туннель — это означает что провайдер видит все твои DNS-запросы. Часть сервисов логирует трафик и продаёт данные рекламодателям. Несколько крупных бесплатных VPN были пойманы на встроенной рекламе, перехвате HTTP и продаже пользовательского трафика. Если нужна реальная защита — или платный сервис с публичным независимым аудитом, или self-hosted решение на своём VPS: $5 в месяц на Hetzner закрывают задачу полностью.
Почему VPN замедляет интернет и что с этим делать?
Четыре причины замедления: шифрование (накладные расходы на процессор, обычно незначительны), MTU mismatch (пакеты фрагментируются — потеря скорости до 30%), расстояние до VPN-сервера (лишние 50+ мс пинга), и throttling со стороны провайдера (специально замедляет VPN-трафик не блокируя полностью). Решения: MTU в конфиге установить в 1380, выбирать VPS физически близко, при throttling пробовать другой порт или обфусцированный протокол.
Итог: что реально работает в 2026
VPN не умер. Он повзрослел. Та эпоха когда любой OpenVPN с любым IP гарантированно решал все проблемы — закончилась примерно в 2022-2023 годах. Сейчас это гонка технологий между DPI-системами и разработчиками протоколов обфускации, и пока что разработчики держатся.
Что изменилось за последние два года: блокировки стали умнее, но и инструменты обхода тоже. AmneziaWG 2.0 — это не патч поверх старого протокола, это переосмысление транспортного слоя с нуля. VLESS Reality закрывает проблему active probing которую не решает обфускация на уровне заголовков. Hysteria2 использует QUIC который провайдеры не могут заблокировать без того чтобы сломать половину современного веба.
Работающий стек на 2026 год: AmneziaWG 2.0 с уникальными параметрами обфускации для выхода в интернет, Tailscale или Headscale для mesh-сетки между своими устройствами, unbound или DNS-over-HTTPS для защиты DNS-трафика. Проверка через dnsleaktest.com после каждой смены конфигурации — обязательно. Это не паранойя, это базовая гигиена.
Ещё одна вещь которую стоит принять: нет решения которое работает вечно без обслуживания. Любой протокол потребует обновления через 6-12 месяцев когда DPI обучится на новых паттернах. Следи за релизами AmneziaWG на GitHub, подпишись на Хабр по теме — и будешь узнавать о изменениях раньше чем они тебя коснутся.
Не заработало?
Настроил по гайду, но что-то пошло не так — пиши в комментарии. Опиши: провайдер, ОС клиента, какой протокол, что показывает awg show на сервере и что за ошибка на клиенте. Разберёмся.