WireGuard: настройка с нуля
Почему WireGuard
WireGuard — это современный VPN-протокол, созданный Джейсоном Доненфельдом. Он значительно проще в настройке и быстрее IPSec и OpenVPN. Кодовая база составляет всего около 4000 строк (включая ядерный модуль), что делает его легко auditsable. WireGuard использует современные криптографические примитивы: Curve25519, ChaCha20, Poly1305, BLAKE2s.
Установка
# Ubuntu/Debian
sudo apt install wireguard
# CentOS/RHEL 8+
sudo dnf install wireguard-tools
# Arch Linux
sudo pacman -S wireguard-tools
# Проверка ядерного модуля
sudo modprobe wireguard
lsmod | grep wireguard
Генерация ключей
Каждая сторона (сервер и клиент) нуждается в паре ключей: приватный и публичный.
# Генерация ключей сервера
wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key
# Генерация ключей клиента
wg genkey | tee /etc/wireguard/client_private.key | wg pubkey > /etc/wireguard/client_public.key
# Pre-shared ключ для дополнительной защиты (опционально)
wg genpsk > /etc/wireguard/preshared.key
# Установка прав доступа
chmod 600 /etc/wireguard/*_private.key
Настройка сервера
Создайте конфигурационный файл сервера:
# /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <СЕРВЕР_PRIVATE_KEY>
# Включаем форвардинг и NAT
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]
PublicKey = <КЛИЕНТ_PUBLIC_KEY>
PresharedKey = <PRESHARED_KEY>
AllowedIPs = 10.0.0.2/32
Включение IP-форвардинга
# Временно
sudo sysctl -w net.ipv4.ip_forward=1
# Постоянно
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Настройка клиента
# /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.2/24
PrivateKey = <КЛИЕНТ_PRIVATE_KEY>
DNS = 1.1.1.1, 8.8.8.8
[Peer]
PublicKey = <СЕРВЕР_PUBLIC_KEY>
PresharedKey = <PRESHARED_KEY>
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
Параметр AllowedIPs = 0.0.0.0/0 означает, что весь трафик будет маршрутизироваться через VPN (full tunnel). Если нужно только трафик до подсети сервера, используйте конкретные CIDR.
Запуск и управление
# Запуск интерфейса
sudo wg-quick up wg0
# Остановка
sudo wg-quick down wg0
# Автозапуск при загрузке
sudo systemctl enable wg-quick@wg0
# Просмотр текущего состояния
sudo wg show
# Добавление пира на лету
sudo wg set wg0 peer <PUBLIC_KEY> endpoint vpn.example.com:51820 allowed-ips 10.0.0.3/32
Маршрутизация для split tunnel
Если вы хотите, чтобы через VPN ходил только определённый трафик:
# Только трафик до корпоративной сети
AllowedIPs = 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16
# Или только один сервер
AllowedIPs = 10.0.0.1/32, 192.168.1.100/32
Мониторинг и отладка
# Проверка подключений
sudo wg show wg0
# Пример вывода:
# interface: wg0
# public key: ABC123...
# private key: (hidden)
# listening port: 51820
#
# peer: DEF456...
# endpoint: 203.0.113.1:51820
# allowed ips: 10.0.0.2/32
# latest handshake: 32 seconds ago
# transfer: 1.2 GiB received, 3.4 GiB sent
# Проверка маршрутов
ip route show table all | grep wg0
# Логи
sudo journalctl -u wg-quick@wg0
WireGuard не имеет встроенной системы аутентификации пользователей. Каждый пир идентифицируется по публичному ключу. Для управления множеством клиентов используйте tools вроде wg-easy или Headscale.
Безопасность
- Регулярно ротируйте ключи — WireGuard не имеет встроенного механизма ротации
- Используйте PresharedKey для защиты от атак квантовых компьютеров
- Ограничивайте
AllowedIPsминимально необходимыми подсетями - Настройте файрвол на порт 51820/UDP только для доверенных IP
Вывод
WireGuard — это минималистичный, быстрый и безопасный VPN-протокол. Его настройка занимает считанные минуты, а производительность не уступает IPSec. Для продакшен-среды рекомендуется дополнительная автоматизация ключей и мониторинг состояния туннелей.