Почему WireGuard, а не OpenVPN
WireGuard был представлен в 2016 году и с версии ядра Linux 5.6 (март 2020) встроен прямо в ядро. Вот почему он лучше:
| Параметр | WireGuard | OpenVPN |
|---|---|---|
| Строк кода | ~4 000 | ~70 000 |
| Скорость | Близко к скорости канала | 200–500 Мбит/с типично |
| Криптография | ChaCha20-Poly1305, Curve25519, BLAKE2s | AES-256-GCM, RSA, гибко |
| Протокол | UDP только | UDP / TCP |
| Смена сети (WiFi→LTE) | Без разрыва | Переподключение |
| Сложность настройки | Простая | Средняя |
| Встроен в ядро Linux | С 5.6 (2020) | Нет (userspace) |
Меньше кода = меньше уязвимостей. Работа в ядре Linux = максимальная скорость без userspace-накладных расходов.
Шаг 1: Установка WireGuard на сервер
Подключитесь к серверу по SSH и выполните:
apt update && apt upgrade -y
apt install -y wireguard curlНа Ubuntu 22.04 WireGuard уже есть в стандартных репозиториях. На CentOS/AlmaLinux 9 команда другая:
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
chmod 600 client1.keyСохраните значения ключей — они понадобятся в конфигах:
cat server.key # приватный ключ сервера — только в wg0.conf на сервере
cat server.pub # публичный ключ сервера — в конфиг клиента
cat client1.key # приватный ключ клиента — только в конфиг клиента
cat client1.pub # публичный ключ клиента — в [Peer] секции wg0.confserver.key, client1.key) нельзя передавать никому. Публичные ключи (*.pub) — безопасны для передачи.Шаг 3: Конфигурация сервера
Создаём файл /etc/wireguard/wg0.conf. Команда ниже подставит ключи и имя интерфейса автоматически — никаких ручных правок:
SERVER_PRIVATE=$(cat /etc/wireguard/server.key)
CLIENT1_PUBLIC=$(cat /etc/wireguard/client1.pub)
IFACE=$(ip -o -4 route show to default | awk '{print $5}')
cat > /etc/wireguard/wg0.conf << EOF
[Interface]
PrivateKey = $SERVER_PRIVATE
Address = 10.0.0.1/24
ListenPort = 51820
PostUp = iptables -I FORWARD -i wg0 -j ACCEPT; iptables -I FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o $IFACE -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o $IFACE -j MASQUERADE
[Peer]
# Клиент 1
PublicKey = $CLIENT1_PUBLIC
AllowedIPs = 10.0.0.2/32
EOF
chmod 600 /etc/wireguard/wg0.conf- •
Address = 10.0.0.1/24— IP сервера в VPN-сети (подсеть 10.0.0.0/24) - •
ListenPort = 51820— UDP-порт WireGuard (можно изменить) - •
PostUp: -I FORWARD— вставляем правила в начало цепочки, чтобы они работали даже с активным UFW - •
POSTROUTING MASQUERADE— NAT: клиенты выходят в интернет через IP сервера - •
AllowedIPs = 10.0.0.2/32— IP первого клиента в VPN-сети
Проверьте, что конфиг создан корректно:
cat /etc/wireguard/wg0.confШаг 4: IP-форвардинг и NAT
Без IP-форвардинга сервер не будет перенаправлять трафик клиентов в интернет. Это самая частая причина «VPN подключён, но интернета нет».
cat > /etc/sysctl.d/99-wireguard.conf << EOF
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
EOF
sysctl --systemПроверяем, что применилось:
sysctl net.ipv4.ip_forward
# Должно вернуть: net.ipv4.ip_forward = 1Правила iptables (PostUp/PostDown) прописаны в wg0.conf и применятся автоматически при старте и остановке интерфейса — дополнительных команд iptables вводить не нужно.
Шаг 5: Запуск и автозапуск
Сначала открываем порт в файрволле, затем запускаем WireGuard. Проверьте, активен ли UFW:
ufw status
# Если "inactive" — UFW выключен, переходите к следующему шагу
# Если "active" — открываем порт:
ufw allow 51820/udpiptables -A INPUT -p udp --dport 51820 -j ACCEPTsystemctl enable --now wg-quick@wg0Проверяем статус:
systemctl status wg-quick@wg0
# Должно быть: active (exited) — это нормально для WireGuard
# wg-quick запускает интерфейс и завершается; сам интерфейс живёт в ядре
wg show
# Покажет: интерфейс wg0, публичный ключ сервера, порт 51820, список пировШаг 6: Настройка клиента
Генерируем конфиг клиента прямо на сервере — ключи и IP подставляются автоматически:
CLIENT1_PRIVATE=$(cat /etc/wireguard/client1.key)
SERVER_PUBLIC=$(cat /etc/wireguard/server.pub)
SERVER_IP=$(curl -s -4 https://ifconfig.me)
cat > /etc/wireguard/wg-client1.conf << EOF
[Interface]
PrivateKey = $CLIENT1_PRIVATE
Address = 10.0.0.2/32
DNS = 1.1.1.1
[Peer]
PublicKey = $SERVER_PUBLIC
Endpoint = $SERVER_IP:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
EOF
chmod 600 /etc/wireguard/wg-client1.conf- •
Address = 10.0.0.2/32— IP клиента в VPN (только его адрес, /32) - •
AllowedIPs = 0.0.0.0/0, ::/0— весь трафик (IPv4 и IPv6) идёт через VPN - •
PersistentKeepalive = 25— keepalive каждые 25 сек, поддерживает соединение за NAT - •
DNS = 1.1.1.1— DNS-запросы через VPN на сервер Cloudflare
Android и iOS
Установите WireGuard из App Store / Google Play. Генерируем QR-код прямо в терминале сервера:
apt install -y qrencode
qrencode -t ansiutf8 < /etc/wireguard/wg-client1.confВ приложении нажмите «+» → «Scan QR code» и наведите камеру на терминал.
Windows и macOS
Скачайте файл конфига с сервера на локальный компьютер:
scp root@ВАШ_IP_СЕРВЕРА:/etc/wireguard/wg-client1.conf ./wg-client1.confСкачайте официальное приложение WireGuard с wireguard.com/install. Нажмите «Add Tunnel» → «Import from file» — выберите скачанный wg-client1.conf. Включите туннель кнопкой Activate.
Linux (клиент)
# 1. Устанавливаем WireGuard — это создаст папку /etc/wireguard
apt install -y wireguard
# 2. Скачиваем конфиг с сервера
scp root@ВАШ_IP_СЕРВЕРА:/etc/wireguard/wg-client1.conf /etc/wireguard/wg0.conf
chmod 600 /etc/wireguard/wg0.conf
# 3. Запускаем туннель
wg-quick up wg0 # включить
wg-quick down wg0 # выключить
systemctl enable wg-quick@wg0 # автозапуск при загрузкеШаг 7: Проверка подключения
После подключения клиента проверьте на сервере:
wg show
# Сразу после запуска: интерфейс wg0, список peer-ов без handshake
# После первого подключения клиента появится:
# latest handshake: X seconds ago
# transfer: N KiB received, N KiB sentНа стороне клиента убедитесь, что IP сменился:
curl -s 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
chmod 600 client2.key
# Добавляем нового пира в конфиг сервера
CLIENT2_PUBLIC=$(cat client2.pub)
echo "
[Peer]
# Клиент 2
PublicKey = $CLIENT2_PUBLIC
AllowedIPs = 10.0.0.3/32" >> /etc/wireguard/wg0.confПрименяем без перезапуска сервиса (активные клиенты не отключатся):
wg syncconf wg0 <(wg-quick strip wg0)
# Или полный перезапуск (если нужно обновить PostUp/PostDown):
# systemctl restart wg-quick@wg0Генерируем конфиг для клиента 2 (аналогично первому, только другой IP и ключ):
CLIENT2_PRIVATE=$(cat /etc/wireguard/client2.key)
SERVER_PUBLIC=$(cat /etc/wireguard/server.pub)
SERVER_IP=$(curl -s -4 https://ifconfig.me)
cat > /etc/wireguard/wg-client2.conf << EOF
[Interface]
PrivateKey = $CLIENT2_PRIVATE
Address = 10.0.0.3/32
DNS = 1.1.1.1
[Peer]
PublicKey = $SERVER_PUBLIC
Endpoint = $SERVER_IP:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
EOF
chmod 600 /etc/wireguard/wg-client2.confТипичные проблемы и решения
✗VPN подключён, но интернета нет
Решение: Три вещи: (1) sysctl net.ipv4.ip_forward — должно быть 1; (2) iptables -t nat -L POSTROUTING -n -v — должно быть правило MASQUERADE; (3) iptables -L FORWARD -n -v — должны быть правила ACCEPT для wg0. Если правил нет — перезапустите: systemctl restart wg-quick@wg0.
✗Клиент не может подключиться (таймаут)
Решение: На сервере: systemctl status wg-quick@wg0 — сервис должен быть active. Затем: ss -ulnp | grep 51820 — порт должен слушаться. С другого хоста: sudo nmap -sU -p 51820 ВАШ_IP — порт должен быть open. Также проверьте файрволл в панели управления VPS-провайдера — он может блокировать UDP независимо от UFW.
✗DNS не работает через VPN
Решение: Убедитесь, что DNS = 1.1.1.1 есть в [Interface] клиентского конфига. На Linux-клиентах с systemd-resolved может помочь: PostUp = resolvectl dns %i 1.1.1.1; resolvectl domain %i ~., PostDown = resolvectl revert %i (где %i = имя интерфейса wg0).
✗WireGuard не запускается: «Cannot find device wg0»
Решение: Ядро слишком старое — WireGuard встроен начиная с Linux 5.6. Проверьте: uname -r. Ubuntu 22.04 использует ядро 5.15 — проблем быть не должно. Если у вас ядро старше 5.6 — обновите ОС до Ubuntu 22.04 или новее.