Быстрый старт

Быстрый старт с WireGuard — настройка интерфейса, генерация ключей и базовое использование

Быстрый старт

Прежде всего, убедитесь, что вы хорошо понимаете концептуальный обзор, а затем установите WireGuard. После этого читайте дальше.

Видео параллельной настройки

Прежде чем подробно объяснять команды, будет чрезвычайно полезно посмотреть видео, где два пира настраиваются одновременно:

Или по отдельности, настройка одного узла выглядит так:

Пример настройки wg(8)

Интерфейс командной строки

Новый интерфейс можно добавить с помощью ip-link(8), который должен автоматически загрузить модуль:

# ip link add dev wg0 type wireguard

IP-адрес и пир можно назначить с помощью ifconfig(8) или ip-address(8):

# ip address add dev wg0 192.168.2.1/24

Или, если всего два пира, можно использовать такой синтаксис:

# ip address add dev wg0 192.168.2.1 peer 192.168.2.2

Интерфейс можно настроить с ключами и конечными точками пиров с помощью утилиты wg(8):

# wg setconf wg0 myconfig.conf

или

# wg set wg0 listen-port 51820 private-key /path/to/private-key peer ABCDEF... allowed-ips 192.168.88.0/24 endpoint 209.202.254.14:8172

Наконец, интерфейс можно активировать с помощью ifconfig(8) или ip-link(8):

# ip link set up dev wg0

Также доступны команды wg show и wg showconf для просмотра текущей конфигурации. Вызов wg без аргументов показывает все WireGuard-интерфейсы.

Утилита wg(8)

Подробнее в man-странице wg(8).

Большую часть рутинных операций по поднятию и опусканию интерфейса можно автоматизировать с помощью инструмента wg-quick(8):

Утилита wg-quick(8)

Пример конфигурационного файла

Для использования wg-quick создайте файл конфигурации /etc/wireguard/wg0.conf:

[Interface]
PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
Address = 10.0.0.1/24
ListenPort = 51820

[Peer]
PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
AllowedIPs = 10.0.0.2/32
Endpoint = 192.95.5.69:51820

Затем поднимите интерфейс:

# wg-quick up wg0

И остановите его:

# wg-quick down wg0

Генерация ключей

WireGuard использует ключи в формате base64. Их можно сгенерировать с помощью утилиты wg(8):

$ umask 077
$ wg genkey > privatekey

Это создаст файл privatekey с новым приватным ключом.

Затем вы можете получить публичный ключ из приватного:

$ wg pubkey < privatekey > publickey

Это прочитает privatekey из stdin и запишет соответствующий публичный ключ в publickey.

Конечно, вы можете сделать всё за один раз:

$ wg genkey | tee privatekey | wg pubkey > publickey

Постоянство при обходе NAT и файерволов

По умолчанию WireGuard старается быть максимально тихим, когда не используется; это не болтливый протокол. В основном он передаёт данные только тогда, когда пир хочет отправить пакеты. Когда его не просят отправлять пакеты, он перестаёт отправлять их до следующего запроса. В большинстве конфигураций это работает хорошо.

Однако, когда пир находится за NAT или файерволом, он может захотеть получать входящие пакеты, даже если не отправляет их. Поскольку NAT и stateful-файерволы отслеживают “соединения”, если пир за NAT или файерволом хочет получать входящие пакеты, он должен поддерживать актуальность NAT/файервола, периодически отправляя keepalive-пакеты. Это называется постоянные keepalive.

Когда эта опция включена, keepalive-пакет отправляется на конечную точку сервера каждые interval секунд. Разумный интервал, который работает с большим количеством файерволов — 25 секунд. Установка значения 0 отключает функцию (это значение по умолчанию, так как большинству пользователей она не нужна и делает WireGuard немного более болтливым).

Эта функция может быть задана добавлением поля PersistentKeepalive = в конфигурации пира или установкой persistent-keepalive в командной строке:

[Peer]
PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
AllowedIPs = 10.0.0.2/32
Endpoint = 192.95.5.69:51820
PersistentKeepalive = 25

Демо-сервер

После установки WireGuard, если вы хотите попробовать отправить несколько пакетов через WireGuard, вы можете использовать для тестирования скрипт из contrib/ncat-client-server/client.sh:

$ sudo contrib/examples/ncat-client-server/client.sh
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# Copyright (C) 2015-2026 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.

set -e
[[ $UID == 0 ]] || { echo "You must be root to run this."; exit 1; }
exec 3<>/dev/tcp/demo.wireguard.com/42912
privatekey="$(wg genkey)"
wg pubkey <<<"$privatekey" >&3
IFS=: read -r status server_pubkey server_port internal_ip <&3
[[ $status == OK ]]
ip link del dev wg0 2>/dev/null || true
ip link add dev wg0 type wireguard
wg set wg0 private-key <(echo "$privatekey") peer "$server_pubkey" allowed-ips 0.0.0.0/0 endpoint "demo.wireguard.com:$server_port" persistent-keepalive 25
ip address add "$internal_ip"/24 dev wg0
ip link set up dev wg0
if [ "$1" == "default-route" ]; then
	host="$(wg show wg0 endpoints | sed -n 's/.*\t\(.*\):.*/\1/p')"
	ip route add $(ip route get $host | sed '/ via [0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/{s/^\(.* via [0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/}' | head -n 1) 2>/dev/null || true
	ip route add 0/1 dev wg0
	ip route add 128/1 dev wg0
fi

Это автоматически настроит интерфейс wg0 через очень небезопасный транспорт, который подходит только для демонстрационных целей. Затем вы можете попробовать загрузить скрытый сайт или отправить пинги:

$ chromium http://192.168.4.1
$ ping 192.168.4.1

Если вы хотите перенаправить ваш интернет-трафик, вы можете запустить его так:

$ sudo contrib/examples/ncat-client-server/client.sh default-route
$ curl zx2c4.com/ip
163.172.161.0
demo.wireguard.com
curl/7.49.1

Отладочная информация

Если вы используете модуль ядра Linux и ваше ядро поддерживает динамическую отладку, вы можете получить полезный вывод во время выполнения, включив динамическую отладку для модуля:

# modprobe wireguard && echo module wireguard +p > /sys/kernel/debug/dynamic_debug/control

Если вы используете пользовательскую реализацию, установите переменную окружения:

export LOG_LEVEL=verbose

Пример полной настройки клиент-сервер

Серверная конфигурация (/etc/wireguard/wg0.conf)

[Interface]
PrivateKey = SERVER_PRIVATE_KEY
Address = 10.0.0.1/24
ListenPort = 51820
SaveConfig = true

[Peer]
PublicKey = CLIENT1_PUBLIC_KEY
AllowedIPs = 10.0.0.2/32

[Peer]
PublicKey = CLIENT2_PUBLIC_KEY
AllowedIPs = 10.0.0.3/32

Клиентская конфигурация (/etc/wireguard/wg0.conf)

[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.0.0.2/24
DNS = 8.8.8.8

[Peer]
PublicKey = SERVER_PUBLIC_KEY
AllowedIPs = 0.0.0.0/0
Endpoint = server.example.com:51820
PersistentKeepalive = 25

Запуск

На сервере:

# wg-quick up wg0
# systemctl enable wg-quick@wg0

На клиенте:

# wg-quick up wg0
# systemctl enable wg-quick@wg0

Проверка статуса

Проверьте статус соединения:

# wg show

Вы должны увидеть информацию о рукопожатии и передаче данных:

interface: wg0
  public key: SERVER_PUBLIC_KEY
  private key: (hidden)
  listening port: 51820

peer: CLIENT1_PUBLIC_KEY
  endpoint: 192.168.1.100:51820
  allowed ips: 10.0.0.2/32
  latest handshake: 1 minute, 23 seconds ago
  transfer: 1.23 MiB received, 4.56 MiB sent

Дальнейшие шаги

Теперь, когда у вас есть работающий WireGuard, вы можете:

  • Настроить маршрутизацию для пропуска всего трафика через VPN
  • Настроить несколько пиров для создания полной mesh-сети
  • Изучить продвинутые темы
  • Настроить автоматическое переподключение и мониторинг

Если у вас возникли проблемы, обратитесь к разделу известных ограничений или посетите IRC-канал #wireguard на Libera.Chat для получения помощи.