Learning Platform
Глоссарий Troubleshooting
Урок 15.04 · 20 мин
Начальный
VPNIPsecWireGuardOpenVPNTunneling

VPN — IPsec vs WireGuard vs OpenVPN и split tunneling

VPN (Virtual Private Network) — это технология, которая создаёт зашифрованный туннель между двумя точками сети. Внутри туннеля передаются обычные IP-пакеты, но снаружи виден только зашифрованный поток между двумя endpoint-ами. С точки зрения операционной системы, после подключения к VPN появляется новый сетевой интерфейс, через который ходит трафик.

VPN используют в трёх сценариях:

  1. Remote access. Сотрудник в отъезде подключается к корпоративной сети, как если бы был в офисе.
  2. Site-to-site. Два дата-центра/филиала соединены постоянным VPN-туннелем — сеть выглядит единой.
  3. Privacy / circumvention. Пользователь подключается к VPN-провайдеру, чтобы скрыть свой реальный IP (от внешних сервисов или провайдера), обходить блокировки или защититься в публичном Wi-Fi.

В этом уроке разберём, как VPN устроен изнутри, чем отличаются три популярных протокола (IPsec, OpenVPN, WireGuard), что такое split tunneling и когда какое решение выбирать.


Как VPN работает на уровне пакетов

Без VPN ваш компьютер отправляет пакет напрямую в интернет. С VPN всё иначе: пакет упаковывается во внешний пакет, шифруется, и улетает к VPN-серверу. Тот распаковывает, дешифрует и отправляет в реальный интернет.

VPN как туннель
Your laptopСоздаёт пакет к example.com
VPN client encryptsПакет упаковывается в зашифрованный outer-пакет. Outer destination -- IP VPN-сервера
VPN serverВнешне выглядит как обычный server в datacenter. Принимает зашифрованный поток
ISP / InternetВидят только outer-пакет: 'Client A -> VPN server'. Не видят, что внутри (example.com или что-то ещё)
VPN serverРасшифровывает, извлекает оригинальный пакет
example.comПолучает пакет, как если бы он пришёл от VPN-сервера. Не знает про реального клиента

Что в outer-пакете:

  • Outer header. Client_IP -> VPN_server_IP. Это видно сети.
  • VPN-payload. Зашифрованный inner-пакет (Client_IP -> example.com:443 + HTTPS-данные).

ISP видит: вы общаетесь с VPN-сервером. Не видит, с какими реальными серверами. Не видит DNS-запросы (если VPN-клиент перенаправляет DNS через туннель).

example.com видит: запрос пришёл от VPN_server_IP. Не знает ваш реальный IP. Не знает страну/город.

Это и есть смысл VPN: смена точки выхода в интернет на VPN-сервер.


Что VPN защищает (и от чего не защищает)

VPN — мощный инструмент, но его часто переоценивают. Конкретно:

VPN защищает:

  • От ISP/Wi-Fi провайдера, который мог бы видеть, на какие сайты вы ходите (по plain DNS, по SNI, по IP).
  • От локальных MITM-атак в открытом Wi-Fi — весь ваш трафик идёт в зашифрованном туннеле к VPN-серверу.
  • От блокировок — если правительство/работодатель блокирует сайт по IP/DNS, VPN обходит эту блокировку (через сервер в другой юрисдикции).
  • От геоблокировок — сервис, доступный только в США, увидит VPN_server_IP в США и пустит вас.

VPN не защищает:

  • От самого VPN-провайдера. Он видит весь ваш трафик. Доверие к нему — ключевой вопрос. «Бесплатные» VPN часто продают ваши данные.
  • От tracking через cookies, fingerprinting, авторизацию. Если вы залогинены в Google, Google знает, что это вы, независимо от IP.
  • От взлома самой target машины. VPN — защита канала, не endpoint.
  • От браузерных уязвимостей.
WARNING

‘Бесплатные’ VPN — часто хуже, чем no VPN. Бизнес-модель бесплатных VPN — продажа данных пользователей и инжекция рекламы. Изучите политики VPN-провайдера, его jurisdiction, наличие audits. Признанные no-log провайдеры: Mullvad, IVPN, ProtonVPN. Но любой VPN — это перенос доверия с ISP на VPN-провайдера, не его устранение.


IPsec — стандарт корпоративных VPN

IPsec (Internet Protocol Security) — набор протоколов, ставший стандартом IETF в конце 1990-х. Работает на уровне IP-пакетов (L3), часто реализован в ядре операционной системы и сетевых железках (роутеры, firewalls). Используется в 99% site-to-site VPN корпораций и в правительственных сетях.

IPsec состоит из двух подсистем:

  1. IKE (Internet Key Exchange). Phase 1 — установление безопасного канала для обмена ключами. Phase 2 — согласование параметров для шифрования данных.
  2. ESP (Encapsulating Security Payload) или AH (Authentication Header). Сами зашифрованные данные.
IKE Phase 1: handshake между двумя VPN-endpoint
  - аутентификация (через PSK или сертификат)
  - генерация общего секрета (Diffie-Hellman)
  - выбор шифров (AES-256-GCM, ChaCha20)

IKE Phase 2: согласование SA (Security Association)
  - какие сети туннелировать
  - какие шифры использовать
  - lifetimes ключей

ESP-пакеты: основная работа
  - inner-пакет шифруется
  - outer-IP-header добавляется
  - HMAC для integrity

Плюсы IPsec:

  • Стандарт. Поддерживается всем сетевым оборудованием (Cisco, Juniper, MikroTik, FortiNet).
  • Производительность. Работает в ядре, часто с аппаратным ускорением. Скорости близкие к line-rate.
  • Site-to-site. Идеально для соединения двух офисов или dc.

Минусы:

  • Сложная конфигурация. Десятки параметров (algorithms, modes, key exchange types, NAT-T, perfect forward secrecy).
  • Проблемы с NAT. Изначально IPsec не дружил с NAT (NAT меняет IP, ломая integrity check). Решено через NAT-T (NAT Traversal), но требует поддержки.
  • Корпоративный feel. Сложно настроить новичку.

Конфиг strongSwan (Linux IPsec) — фрагмент:

# /etc/ipsec.conf
conn corporate-vpn
    left=%defaultroute
    right=vpn.company.com
    [email protected]
    rightsubnet=10.0.0.0/8
    ike=aes256-sha256-modp2048
    esp=aes256-sha256
    authby=secret
    auto=start

Используется в корпорациях, но для personal VPN сейчас выбирают что-то проще.


OpenVPN — userspace, гибкий и популярный

OpenVPN — open source VPN, созданный в 2001 году. Работает в userspace через TUN/TAP-интерфейс. Использует SSL/TLS-стек для шифрования, поэтому интероперабельный и хорошо документирован.

Особенности:

  • Userspace. Не требует kernel-модуля, работает на любой ОС.
  • TCP или UDP. Обычно UDP (быстрее), TCP — для обхода блокировок (выглядит как обычный HTTPS).
  • Гибкость. Огромное число опций конфигурации.
# OpenVPN client config
client
dev tun
proto udp
remote vpn.example.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
cipher AES-256-GCM
auth SHA256
remote-cert-tls server
verb 3

# Сертификаты
ca ca.crt
cert client.crt
key client.key

Плюсы OpenVPN:

  • Очень настраиваемый. Можно туннелировать через TCP-443 — маскируется под HTTPS.
  • Большое community. Куча документации, инструментов, провайдеров.
  • Аутентификация. TLS-сертификаты + опционально username/password.

Минусы:

  • Userspace — медленнее, чем kernel-VPN. Производительность 100-300 Mbps типично.
  • CPU-затратный. Шифрование в userspace.
  • Сложно настроить с нуля. Хотя есть скрипты (openvpn-install.sh).

OpenVPN был стандартом personal-VPN в 2010-х. Сейчас уступает место WireGuard.


WireGuard — современный VPN

WireGuard — VPN-протокол, созданный Jason A. Donenfeld в 2015. Цель: минимально простой, максимально быстрый, защищённый по дефолту. Включён в Linux kernel с 5.6 (март 2020). Стал стандартом de facto для personal-VPN.

Особенности:

  • Минимум кода. ~4000 строк (для сравнения, OpenVPN — ~100k, IPsec — ~400k). Меньше кода = меньше bugs.
  • Современная криптография. ChaCha20 для шифрования, Poly1305 для authentication, Curve25519 для key exchange, BLAKE2 для hashing. Никаких legacy-опций — алгоритмы выбраны и заморожены.
  • In-kernel в Linux. Скорость близкая к line-rate.
  • Stateless по дизайну. Простая конфигурация, основанная на ключевых парах.

Конфиг WireGuard (server-side):

# /etc/wireguard/wg0.conf
[Interface]
PrivateKey = <server-private-key>
Address = 10.0.0.1/24
ListenPort = 51820

# Включить IP forwarding
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = <client-public-key>
AllowedIPs = 10.0.0.2/32

Конфиг WireGuard (client-side):

[Interface]
PrivateKey = <client-private-key>
Address = 10.0.0.2/32
DNS = 1.1.1.1

[Peer]
PublicKey = <server-public-key>
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0  # весь трафик через VPN
PersistentKeepalive = 25

Сравните размер с IPsec/OpenVPN — 10-15 строк вместо сотен. Просто потому что нет легаси и нет десятков параметров.

# Запустить WireGuard:
sudo wg-quick up wg0

# Состояние:
sudo wg show

# Остановить:
sudo wg-quick down wg0

Плюсы WireGuard:

  • Очень быстрый. В Linux kernel mode — 1+ Gbps на скромном железе.
  • Простая конфигурация. Public keys + endpoints, всё.
  • Современная криптография. Заморожен лучший набор алгоритмов 2020-х.
  • Маленький codebase. Легко аудит, меньше CVE.

Минусы:

  • Stateless = нет user authentication. Аутентификация только по ключевой паре. Для multi-user сценариев нужно management overlay (Tailscale, Headscale, etc).
  • No reconnect on roaming. Хотя есть PersistentKeepalive, в неоптимальных условиях соединение может теряться.
  • Молодой. Хоть и стабильный с 2020, ещё нет десятилетий battle-tested.

Сравнение трёх протоколов

СвойствоIPsecOpenVPNWireGuard
УровеньL3 (IP)L3 (TUN/TAP)L3 (TUN)
РеализацияKernelUserspaceKernel (Linux), userspace (other)
СкоростьОчень высокаяСредняя (100-300 Mbps)Высокая (1+ Gbps)
Codebase~400k LoC~100k LoC~4k LoC
КриптографияКонфигурируется (AES, SHA, …)Конфигурируется (через OpenSSL)Заморожена (ChaCha20, BLAKE2, …)
Сложность настройкиВысокаяСредняяНизкая
TCP-режимНетДа (для обхода)Нет (только UDP)
NAT traversalNAT-T (опционально)ХорошоХорошо
Roaming (mobile)OKOKОтлично (новый IP — продолжается)
Best forSite-to-site, корпорацииСтарые setups, обход блокировокModern personal/team VPN

Split tunneling — не весь трафик через VPN

По умолчанию VPN-клиент часто настроен на «всё через туннель» (AllowedIPs = 0.0.0.0/0). Это значит, что весь интернет-трафик идёт через VPN-сервер. Иногда это не оптимально:

  • Нужно работать с корпоративной сетью, но интернет — быстрее напрямую.
  • VPN-сервер далеко — большая latency.
  • Не хочу, чтобы Netflix думал, что я в другой стране (геоблокировка ломается).

Split tunneling — режим, при котором только часть трафика идёт через VPN, остальное — напрямую.

# WireGuard split tunnel: только корпоративная подсеть через VPN
[Peer]
PublicKey = <server-pubkey>
Endpoint = vpn.company.com:51820
AllowedIPs = 10.0.0.0/8, 192.168.100.0/24
# Всё остальное (интернет) идёт напрямую

С таким конфигом:

  • curl http://10.0.0.5/internal-tool идёт через VPN.
  • curl https://google.com идёт через обычный интернет, минуя VPN.

Плюсы split tunneling:

  • Скорость. Интернет-трафик не делает крюк через VPN.
  • Latency. Меньше задержка для местных сервисов.
  • VPN-сервер не насыщается трафиком, который ему не нужен.

Минусы:

  • Security. Если вы в untrusted Wi-Fi, ваш not-VPN-трафик незащищён. Атакующий может MITM не-VPN-часть.
  • Bypass corporate security. Если корпоративная сеть требует, чтобы весь трафик шёл через её SOC — split tunnel ломает audit.

Применение: для personal VPN (Mullvad, ProtonVPN) люди обычно гонят всё через туннель — privacy paramount. Для corporate (remote access к офису) — split tunnel, чтобы интернет был быстрым.


Что VPN-провайдер видит — и не видит

Часто думают «VPN = анонимность». Реально VPN — это переадресация доверия. ISP больше не видит ваш трафик; VPN-провайдер видит. Что именно?

VPN-провайдер видит:

  • Все IP-адреса, к которым вы подключаетесь.
  • Все DNS-запросы (если используете DNS через туннель).
  • Объёмы и тайминги трафика.
  • SNI (домен в TLS Client Hello) — открытый текст.
  • IP-адрес, с которого вы подключились (для логирования сессий).

VPN-провайдер НЕ видит (при HTTPS):

  • Содержимое HTTPS-запросов (URL после /, body, response).
  • Сертификаты, передаваемые серверу.
  • Cookies, headers.

Что важно: выбор VPN-провайдера = выбор объекта доверия. Если провайдер ведёт логи или продаёт данные — ваше доверие зря. Поэтому критерии: jurisdiction (страна без mandatory logging laws), no-log policy с audits, open-source клиенты.


Попробуй сам

Поднимем WireGuard сервер на VPS (например, на DigitalOcean $4/мес инстансе) и подключимся к нему с локальной машины.

# 1. На сервере (Ubuntu 22.04):
sudo apt update && sudo apt install wireguard

# Сгенерировать ключи
wg genkey | tee server-private.key | wg pubkey > server-public.key
wg genkey | tee client-private.key | wg pubkey > client-public.key

# 2. Создать /etc/wireguard/wg0.conf на сервере:
sudo nano /etc/wireguard/wg0.conf
# (см. конфиг выше, подставить ключи)

# Включить ip forwarding:
sudo sysctl -w net.ipv4.ip_forward=1
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf

# Открыть порт 51820/UDP в firewall:
sudo ufw allow 51820/udp
sudo ufw allow OpenSSH
sudo ufw enable

# Запустить:
sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0  # автозапуск

# 3. На клиенте (Linux/macOS):
sudo apt install wireguard  # Linux
brew install wireguard-tools  # macOS

# Создать ~/wg-client.conf (см. конфиг выше)

# Запустить:
sudo wg-quick up /path/to/wg-client.conf

# Проверить, что трафик идёт через VPN:
curl https://api.ipify.org
# Должен показать IP вашего VPS, не вашего домашнего

# Состояние:
sudo wg show

# Остановить:
sudo wg-quick down /path/to/wg-client.conf

Для самой простой попытки — зарегистрируйтесь у Mullvad (~5 EUR/мес) или ProtonVPN (есть free план), скачайте WireGuard клиент, импортируйте config файл от провайдера. 30 секунд — и у вас работающий VPN.

Тестирование:

# До подключения VPN:
curl https://api.ipify.org
# Ваш домашний IP

# После подключения:
curl https://api.ipify.org
# IP VPN-сервера

# DNS leak test -- убедитесь, что DNS-запросы идут через VPN:
# Откройте https://www.dnsleaktest.com в браузере

SSH tunneling — простейший VPN без отдельного сервера Overlay-сети Docker: VPN-подобный туннель между хостами
Проверка знанийKnowledge check
Junior спрашивает: 'Я подключаюсь к работе через корпоративный VPN. Если я зайду на сайт работодателя через личный VPN-провайдер (Mullvad, ProtonVPN), будет ли двойной туннель и какие проблемы это создаёт?'
ОтветAnswer
Хороший вопрос, на стыке практики и теории. Технически это работает. Ваш трафик упаковывается дважды: сначала в корпоративный туннель (например, IPsec), потом этот туннель в свою очередь упаковывается в личный VPN (WireGuard). Outer-пакет: ваш IP -> Mullvad. Middle: Mullvad-server IP -> корпоративный VPN-gateway. Inner: корпоративный VPN-gateway -> ресурс работодателя. Каждый слой шифруется отдельно. Проблемы три, и они существенные. Первая -- производительность. Двойное шифрование = double CPU overhead. Каждый пакет шифруется два раза на отправке и два раза дешифруется. Латентность увеличивается на сумму задержек двух VPN. Throughput падает -- легко в 2-3 раза. Если работа требует video calls или больших файлов -- будет медленно. Вторая -- MTU. Каждый VPN-туннель добавляет overhead (40-100 байт) к каждому пакету. С двумя туннелями overhead удваивается. Если общий MTU превысит то, что поддерживает ваш ISP -- пакеты будут фрагментироваться, что ещё больше замедлит. Особенно болезненно с PPPoE-подключениями (которые сами уже снижают MTU). Третья -- безопасность и compliance. Корпоративный SOC может видеть ваше подключение к Mullvad-серверу из корпоративной сети (по logs на VPN-gateway). Это часто выглядит подозрительно -- может trigger security alert. Если в политике компании это запрещено (а часто запрещено явно), вы нарушаете правила. Лучшее решение в большинстве случаев: используйте корпоративный VPN для работы, личный VPN для личных задач, не комбинируйте на одном устройстве одновременно. Или используйте split tunneling: корпоративный туннель только для корпоративных подсетей, остальное -- через личный VPN.

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 6. Что VPN-провайдер видит, а что нет, при HTTPS-трафике через туннель?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 4