Что такое WireGuard и почему он лучше OpenVPN
WireGuard — это современный VPN-протокол, работающий на уровне ядра Linux. Его кодовая база составляет всего около 4000 строк, что в десятки раз меньше, чем у OpenVPN или IPsec. Такой минимализм упрощает аудит безопасности и снижает вероятность ошибок. Протокол использует только современные криптографические примитивы: Curve25519 для обмена ключами, ChaCha20 для шифрования, Poly1305 для аутентификации и BLAKE2s для хеширования. Отсутствие выбора шифров исключает атаки понижения версии.
WireGuard работает как сетевой интерфейс уровня 3 (например, wg0) и не требует сложных сертификатов или фаз согласования, как IPsec. Конфигурация обычно занимает менее 15 строк. Благодаря работе в ядре, WireGuard обеспечивает более высокую пропускную способность и низкую задержку по сравнению с пользовательскими реализациями OpenVPN. Это делает его идеальным выбором для маршрутизации всего трафика (full tunnel) или организации защищённых соединений между сетями.
Предварительные требования для развёртывания
Перед началом убедитесь, что у вас есть:
- Сервер с Ubuntu 24.04, доступный по SSH с правами sudo.
- Публичный IPv4-адрес на сервере (или корректный NAT, если сервер за файрволом).
- Открытый UDP-порт 51820 на всех уровнях файрвола (включая облачные security groups).
- Клиентское устройство: Linux, macOS, Windows, Android или iOS.
- Выбранная VPN-подсеть, не пересекающаяся с существующими сетями (например, 10.90.90.0/24).
- DNS-резолвер для клиентов (например, 1.1.1.1 или 8.8.8.8).
Важно проверить, что имя публичного интерфейса (eth0, ens3, enp1s0) определено корректно, так как оно используется в правилах NAT. Для этого выполните ip -4 route show default и найдите интерфейс в выводе.
Установка WireGuard на Ubuntu 24.04
WireGuard доступен в стандартных репозиториях Ubuntu 24.04. Установите пакеты wireguard и wireguard-tools (последний входит в состав первого, но для надёжности можно указать явно):
sudo apt update
sudo apt install -y wireguard wireguard-toolsПроверьте установку:
wg --version
wg-quick --help | headЯдро Ubuntu 24.04 (версии 5.6 и новее) уже включает модуль WireGuard, поэтому дополнительная установка DKMS не требуется. Для диагностики можно загрузить модуль вручную:
sudo modprobe wireguard
lsmod | grep '^wireguard'Если модуль не загружается, убедитесь, что ядро обновлено.
Генерация ключей сервера и клиентов
WireGuard использует асимметричные ключи, аналогично SSH. Сгенерируйте ключи сервера:
sudo install -d -m 700 /etc/wireguard
sudo sh -c 'umask 077; wg genkey > /etc/wireguard/wg0.key'
sudo sh -c 'wg pubkey < /etc/wireguard/wg0.key > /etc/wireguard/wg0.pub'Установите правильные права: приватный ключ должен быть доступен только root (chmod 600), публичный — можно оставить 644. Никогда не передавайте приватный ключ по сети и не храните его в репозиториях.
Для клиентов рекомендуется генерировать ключи на самом клиентском устройстве, чтобы приватный ключ не покидал его. Однако для централизованного управления можно сгенерировать на сервере. Пример генерации ключей клиента:
wg genkey | tee client1_private.key | wg pubkey > client1_public.keyКаждому клиенту нужен уникальный ключ и уникальный IP-адрес в VPN-подсети.
Настройка сервера WireGuard
Создайте файл конфигурации /etc/wireguard/wg0.conf. Пример для full-tunnel (весь трафик клиента через VPN):
[Interface]
Address = 10.90.90.1/24
ListenPort = 51820
SaveConfig = false
PrivateKey = <приватный_ключ_сервера>
PostUp = iptables -I FORWARD 1 -i %i -o eth0 -s 10.90.90.0/24 -j ACCEPT
PostUp = iptables -I FORWARD 1 -i eth0 -o %i -d 10.90.90.0/24 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -s 10.90.90.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -o eth0 -s 10.90.90.0/24 -j ACCEPT
PostDown = iptables -D FORWARD -i eth0 -o %i -d 10.90.90.0/24 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -s 10.90.90.0/24 -o eth0 -j MASQUERADEЗамените eth0 на фактическое имя публичного интерфейса. Директива PostUp добавляет правила iptables при запуске интерфейса, PostDown — удаляет их при остановке. Правила ограничены подсетью 10.90.90.0/24, чтобы не маскировать другой трафик сервера.
Установите права 600 на файл конфигурации. Если вы используете UFW, добавьте правило ufw route allow in on wg0 out on eth0 в PostUp и соответствующее удаление в PreDown (как показано в одном из источников).
Включение IP-форвардинга и настройка NAT
Для маршрутизации трафика между VPN-клиентами и интернетом необходимо включить IP-форвардинг. Создайте файл /etc/sysctl.d/70-wireguard-routing.conf:
net.ipv4.ip_forward = 1Примените настройку:
sudo sysctl -p /etc/sysctl.d/70-wireguard-routing.confПроверьте значение: sysctl net.ipv4.ip_forward должно вернуть 1. Без этого пакеты с интерфейса wg0 будут отбрасываться.
NAT (MASQUERADE) в PostUp позволяет клиентам выходить в интернет через публичный IP сервера. Важно, чтобы правило NAT было ограничено VPN-подсетью, иначе оно может затронуть другие сервисы.
Настройка файрвола (UFW и другие)
Если на сервере активен UFW, необходимо разрешить UDP-порт 51820:
sudo ufw allow 51820/udp comment 'WireGuard'Также нужно разрешить форвардинг. Отредактируйте /etc/default/ufw и измените DEFAULT_FORWARD_POLICY на ACCEPT. После этого перезагрузите UFW:
sudo ufw reloadВажно: не включайте UFW вслепую, если он неактивен, особенно при удалённом SSH-доступе. Убедитесь, что SSH-порт разрешён, и держите запасную сессию или консоль.
Для RHEL-подобных систем (Rocky Linux, AlmaLinux) используйте firewalld:
sudo firewall-cmd --add-port=51820/udp --permanent
sudo firewall-cmd --add-masquerade --permanent
sudo firewall-cmd --reloadНастройка клиентов и подключение
Создайте конфигурацию клиента, например /etc/wireguard/wg0.conf на Linux-клиенте:
[Interface]
Address = 10.90.90.2/32
PrivateKey = <приватный_ключ_клиента>
DNS = 1.1.1.1, 9.9.9.9
[Peer]
PublicKey = <публичный_ключ_сервера>
Endpoint = <публичный_IP_сервера>:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25AllowedIPs = 0.0.0.0/0 означает full-tunnel — весь трафик идёт через VPN. Для split-tunnel укажите только нужные подсети, например 10.90.90.0/24. PersistentKeepalive необходим для клиентов за NAT, чтобы поддерживать соединение.
Добавьте клиента на сервер в /etc/wireguard/wg0.conf:
[Peer]
PublicKey = <публичный_ключ_клиента>
AllowedIPs = 10.90.90.2/32Запустите интерфейс на сервере и клиенте:
sudo wg-quick up wg0Для автозапуска при загрузке:
sudo systemctl enable wg-quick@wg0На мобильных устройствах можно импортировать конфигурацию через QR-код, сгенерированный с помощью qrencode.
Проверка работы и устранение неполадок
После подключения проверьте статус интерфейса на сервере:
sudo wg showВы должны увидеть пира с недавним handshake и ненулевыми счётчиками трафика. Если handshake отсутствует, проверьте, что UDP-порт 51820 доступен и клиент правильно настроен.
С клиента проверьте публичный IP:
curl -s https://ifconfig.meОн должен совпадать с IP сервера. Также проверьте DNS: dig @1.1.1.1 example.com.
Типичные проблемы:
- Нет handshake: проверьте файрвол, Endpoint, ключи.
- Интернет не работает: проверьте IP-форвардинг и правила NAT.
- DNS не резолвится: убедитесь, что DNS указан в конфигурации клиента и не перехватывается локальным резолвером.
- Медленная загрузка сайтов: возможно, MTU проблемы — попробуйте уменьшить MTU на интерфейсе.
- IPv6 утечка: если клиент имеет IPv6, настройте отдельный туннель или отключите IPv6.
Дополнительные сценарии: site-to-site и управление пирами
WireGuard поддерживает не только клиент-сервер, но и site-to-site соединения. Для этого обе стороны настраиваются как пиры, и каждая рекламирует свою локальную подсеть через AllowedIPs. Например, офисная сеть 192.168.1.0/24 может быть связана с облачной VPC 172.16.0.0/24.
Для добавления или удаления клиентов без перезапуска интерфейса используйте команду wg set:
sudo wg set wg0 peer <публичный_ключ_клиента> allowed-ips 10.90.90.3/32Чтобы сохранить изменения в конфигурационном файле, выполните sudo wg-quick save wg0 (если SaveConfig = true).
При отзыве клиента удалите его пир из конфигурации и выполните wg set wg0 peer <ключ> remove.
Вопросы и ответы
Какой порт использует WireGuard по умолчанию?
По умолчанию WireGuard слушает UDP-порт 51820. Этот порт должен быть открыт на сервере и в файрволе. Вы можете изменить порт, указав другое значение в ListenPort в конфигурации сервера, но тогда его нужно будет изменить и в конфигурациях клиентов (в Endpoint).
Что такое AllowedIPs и как он влияет на маршрутизацию?
AllowedIPs определяет, какие IP-адреса и подсети разрешено отправлять через туннель. Для full-tunnel (весь трафик через VPN) используется 0.0.0.0/0, ::/0. Для split-tunnel указываются только нужные подсети, например 10.90.90.0/24. На сервере AllowedIPs для пира задаёт его VPN-адрес, что также используется для крипто-маршрутизации.
Нужно ли включать IP-форвардинг на сервере?
Да, обязательно. Без net.ipv4.ip_forward = 1 сервер не сможет пересылать пакеты между интерфейсом wg0 и публичным интерфейсом. Это настраивается в /etc/sysctl.d/ и применяется командой sysctl -p.
Как добавить нового клиента без перезапуска сервера?
Используйте команду sudo wg set wg0 peer <публичный_ключ_клиента> allowed-ips /32. Это добавит пира в текущую конфигурацию интерфейса. Чтобы изменения сохранились после перезагрузки, добавьте пира в файл /etc/wireguard/wg0.conf или выполните sudo wg-quick save wg0 (если SaveConfig = true).
Почему клиент не может получить доступ к интернету через VPN?
Проверьте несколько моментов: 1) IP-форвардинг включён (sysctl net.ipv4.ip_forward = 1); 2) правило MASQUERADE в PostUp присутствует и использует правильный интерфейс; 3) UFW или другой файрвол разрешает форвардинг (в UFW измените DEFAULT_FORWARD_POLICY на ACCEPT); 4) DNS настроен в конфигурации клиента. Также убедитесь, что AllowedIPs на клиенте включает 0.0.0.0/0.
Как защитить приватный ключ WireGuard?
Приватный ключ должен храниться в файле с правами 600 (только root). Используйте chmod 600 /etc/wireguard/wg0.key. Никогда не передавайте приватный ключ по незащищённым каналам, не вставляйте его в чаты и не коммитьте в Git. Для клиентов рекомендуется генерировать ключи на самом устройстве, чтобы приватный ключ не покидал его.
Можно ли использовать WireGuard для site-to-site VPN?
Да, WireGuard отлично подходит для соединения двух сетей. В этом случае обе стороны настраиваются как пиры, и каждая указывает локальную подсеть в AllowedIPs. Например, офисный шлюз с сетью 192.168.1.0/24 и облачный сервер с VPC 172.16.0.0/24. Не забудьте включить IP-форвардинг и настроить NAT, если требуется доступ в интернет.