VPN — IPsec vs WireGuard vs OpenVPN и split tunneling
VPN (Virtual Private Network) — это технология, которая создаёт зашифрованный туннель между двумя точками сети. Внутри туннеля передаются обычные IP-пакеты, но снаружи виден только зашифрованный поток между двумя endpoint-ами. С точки зрения операционной системы, после подключения к VPN появляется новый сетевой интерфейс, через который ходит трафик.
VPN используют в трёх сценариях:
- Remote access. Сотрудник в отъезде подключается к корпоративной сети, как если бы был в офисе.
- Site-to-site. Два дата-центра/филиала соединены постоянным VPN-туннелем — сеть выглядит единой.
- Privacy / circumvention. Пользователь подключается к VPN-провайдеру, чтобы скрыть свой реальный IP (от внешних сервисов или провайдера), обходить блокировки или защититься в публичном Wi-Fi.
В этом уроке разберём, как VPN устроен изнутри, чем отличаются три популярных протокола (IPsec, OpenVPN, WireGuard), что такое split tunneling и когда какое решение выбирать.
Как VPN работает на уровне пакетов
Без VPN ваш компьютер отправляет пакет напрямую в интернет. С VPN всё иначе: пакет упаковывается во внешний пакет, шифруется, и улетает к 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.
- От браузерных уязвимостей.
‘Бесплатные’ 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 состоит из двух подсистем:
- IKE (Internet Key Exchange). Phase 1 — установление безопасного канала для обмена ключами. Phase 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.
Сравнение трёх протоколов
| Свойство | IPsec | OpenVPN | WireGuard |
|---|---|---|---|
| Уровень | L3 (IP) | L3 (TUN/TAP) | L3 (TUN) |
| Реализация | Kernel | Userspace | Kernel (Linux), userspace (other) |
| Скорость | Очень высокая | Средняя (100-300 Mbps) | Высокая (1+ Gbps) |
| Codebase | ~400k LoC | ~100k LoC | ~4k LoC |
| Криптография | Конфигурируется (AES, SHA, …) | Конфигурируется (через OpenSSL) | Заморожена (ChaCha20, BLAKE2, …) |
| Сложность настройки | Высокая | Средняя | Низкая |
| TCP-режим | Нет | Да (для обхода) | Нет (только UDP) |
| NAT traversal | NAT-T (опционально) | Хорошо | Хорошо |
| Roaming (mobile) | OK | OK | Отлично (новый IP — продолжается) |
| Best for | Site-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-подобный туннель между хостами