Почему WireGuard, а не OpenVPN
WireGuard появился в 2018 году и быстро стал стандартом. Вот почему он лучше:
| Параметр | WireGuard | OpenVPN |
|---|---|---|
| Строк кода | ~4 000 | ~70 000 |
| Скорость | До 10 Гбит/с | до 1 Гбит/с |
| Криптография | ChaCha20, Curve25519 | Устаревшие алгоритмы |
| Протокол | UDP только | UDP / TCP |
| Смена сети (WiFi→LTE) | Без разрыва | Переподключение |
| Сложность настройки | Простая | Средняя |
| Встроен в ядро Linux | С 5.6 (2020) | Нет (userspace) |
Меньше кода = меньше уязвимостей. Работа в ядре Linux = максимальная скорость без userspace-накладных расходов.
Шаг 1: Установка WireGuard на сервер
Подключитесь к серверу по SSH и выполните:
apt update && apt upgrade -y
apt install -y wireguardНа Ubuntu 22.04 WireGuard уже есть в стандартных репозиториях. На CentOS/AlmaLinux установка чуть сложнее:
dnf install -y epel-release
dnf install -y wireguard-toolsШаг 2: Генерация ключей
WireGuard использует пары ключей (приватный + публичный). Генерируем для сервера:
cd /etc/wireguard
wg genkey | tee server.key | wg pubkey > server.pub
chmod 600 server.keyТеперь ключи для первого клиента (выполняем здесь же, на сервере — удобнее):
wg genkey | tee client1.key | wg pubkey > client1.pubСохраните значения ключей — они понадобятся в конфигах:
cat server.key # приватный ключ сервера — только в server.conf
cat server.pub # публичный ключ сервера — в конфиг клиента
cat client1.key # приватный ключ клиента — только в конфиг клиента
cat client1.pub # публичный ключ клиента — в server.confserver.key, client1.key) нельзя передавать никому. Публичные ключи (*.pub) — безопасны для передачи.Шаг 3: Конфигурация сервера
Создаём файл конфигурации /etc/wireguard/wg0.conf:
ip -o -4 route show to default | awk '{print $5}'
# Запомните название интерфейса (eth0, ens3, ens18 и т.д.)Создаём конфиг (замените ПРИВАТНЫЙ_КЛЮЧ_СЕРВЕРА и ПУБЛИЧНЫЙ_КЛЮЧ_КЛИЕНТА на реальные значения,eth0 на имя вашего интерфейса):
[Interface]
PrivateKey = ПРИВАТНЫЙ_КЛЮЧ_СЕРВЕРА
Address = 10.0.0.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
# Клиент 1
PublicKey = ПУБЛИЧНЫЙ_КЛЮЧ_КЛИЕНТА
AllowedIPs = 10.0.0.2/32- •
Address = 10.0.0.1/24— IP сервера в VPN-сети - •
ListenPort = 51820— UDP-порт WireGuard (можно изменить) - •
PostUp/PostDown— правила NAT для маршрутизации трафика клиентов - •
AllowedIPs = 10.0.0.2/32— IP клиента в VPN-сети
chmod 600 /etc/wireguard/wg0.confШаг 4: IP-форвардинг и NAT
Без IP-форвардинга сервер не будет перенаправлять трафик клиентов в интернет. Это самая частая причина «VPN подключён, но интернета нет».
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
sysctl -pПроверяем, что применилось:
sysctl net.ipv4.ip_forward
# Должно вернуть: net.ipv4.ip_forward = 1Правила iptables (PostUp/PostDown) уже прописаны в конфиге wg0.conf — они применятся автоматически при запуске и остановке интерфейса.
Шаг 5: Запуск и автозапуск
systemctl enable --now wg-quick@wg0Проверяем статус:
systemctl status wg-quick@wg0
# Должно быть: active (exited) — это нормально для WireGuard
wg show
# Покажет: интерфейс, публичный ключ, порт, список пировОткрываем порт в файрволле:
ufw allow 51820/udp
ufw statusiptables -A INPUT -p udp --dport 51820 -j ACCEPTШаг 6: Настройка клиента
Создаём конфиг для клиента. Его можно сохранить в файл или превратить в QR-код для мобильных устройств.
Конфиг клиента (wg-client1.conf)
[Interface]
PrivateKey = ПРИВАТНЫЙ_КЛЮЧ_КЛИЕНТА
Address = 10.0.0.2/24
DNS = 1.1.1.1
[Peer]
PublicKey = ПУБЛИЧНЫЙ_КЛЮЧ_СЕРВЕРА
Endpoint = ВАШ_IP_СЕРВЕРА:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25- •
AllowedIPs = 0.0.0.0/0— весь трафик идёт через VPN - •
PersistentKeepalive = 25— поддерживает соединение за NAT - •
DNS = 1.1.1.1— используем Cloudflare DNS через VPN
Windows и macOS
Скачайте официальное приложение WireGuard с wireguard.com/install. Нажмите «Add Tunnel» → «Import from file» и выберите файл конфига. Включите тоннель кнопкой Activate.
Android и iOS
Установите WireGuard из App Store / Google Play. Для быстрого импорта сгенерируйте QR-код прямо на сервере:
apt install -y qrencode
qrencode -t ansiutf8 < /etc/wireguard/wg-client1.confВ приложении нажмите «+» → «Scan QR code» и наведите на терминал.
Linux (клиент)
apt install -y wireguard
cp wg-client1.conf /etc/wireguard/wg0.conf
wg-quick up wg0 # включить
wg-quick down wg0 # выключить
systemctl enable wg-quick@wg0 # автозапускШаг 7: Проверка подключения
После подключения клиента проверьте на сервере:
wg show
# В разделе peer должно появиться: latest handshake, transfer: N KiB received, N KiB sentНа стороне клиента убедитесь, что IP сменился:
curl https://ifconfig.me
# Должен вернуть IP вашего VPS, а не домашний IPПроверьте доступность внутреннего адреса сервера:
ping 10.0.0.1
# Ответы подтверждают, что туннель работаетДобавление новых клиентов
Каждый новый пользователь — новая пара ключей и новый IP в VPN-сети:
cd /etc/wireguard
wg genkey | tee client2.key | wg pubkey > client2.pubДобавляем нового пира в конфиг сервера:
[Peer]
# Клиент 2
PublicKey = ПУБЛИЧНЫЙ_КЛЮЧ_КЛИЕНТА_2
AllowedIPs = 10.0.0.3/32Применяем без перезапуска сервиса (активные клиенты не отключатся):
wg addconf wg0 <(wg-quick strip wg0)
# Или полный перезапуск:
systemctl restart wg-quick@wg0Конфиг для клиента 2 аналогичен первому — только приватный ключ клиента 2 и адрес 10.0.0.3/24.
Типичные проблемы и решения
✗VPN подключён, но интернета нет
Решение: Проверьте IP-форвардинг: sysctl net.ipv4.ip_forward (должно быть = 1). Проверьте PostUp правила в конфиге: выполните iptables -t nat -L и убедитесь, что MASQUERADE есть.
✗Клиент не может подключиться (таймаут)
Решение: Проверьте, открыт ли UDP-порт: nc -zvu YOUR_IP 51820. Убедитесь, что wg-quick@wg0 запущен (systemctl status). Проверьте файрволл провайдера — некоторые VPS требуют открывать порты в панели управления.
✗DNS не работает через VPN
Решение: Добавьте в [Interface] клиента: DNS = 1.1.1.1. Убедитесь, что AllowedIPs включает ::/0 для IPv6. На некоторых системах нужно: PostUp = resolvectl dns wg0 1.1.1.1.
✗WireGuard не запускается: «Cannot find device wg0»
Решение: Ядро слишком старое или модуль не загружен. Проверьте: uname -r (нужно 5.6+). На старых ядрах установите: apt install -y wireguard-dkms.