wg — руководство

Руководство по wg — утилита для настройки и получения конфигурации интерфейсов WireGuard

ИМЯ

wg — установка и получение конфигурации интерфейсов WireGuard

СИНТАКСИС

wg [ КОМАНДА ] [ ОПЦИИ ]... [ АРГУМЕНТЫ ]...

ОПИСАНИЕ

wg — это утилита конфигурации для получения и установки параметров туннельных интерфейсов WireGuard. Сами интерфейсы могут быть добавлены и удалены с помощью ip-link(8), а их IP-адреса и таблицы маршрутизации могут быть настроены с помощью ip-address(8) и ip-route(8). Утилита wg предоставляет серию подкоманд для изменения специфичных для WireGuard аспектов интерфейсов.

Если КОМАНДА не указана, по умолчанию используется show. Подкоманды, принимающие ИНТЕРФЕЙС, должны получать интерфейс WireGuard.

КОМАНДЫ

show

wg show { <interface> | all | interfaces } [public-key | private-key | listen-port | fwmark | peers | preshared-keys | endpoints | allowed-ips | latest-handshakes | persistent-keepalive | transfer | dump]

Показывает текущую конфигурацию WireGuard и информацию о состоянии указанного интерфейса. Если интерфейс не указан, по умолчанию используется all. Если указано interfaces, выводит список всех интерфейсов WireGuard, по одному на строку, и завершает работу. Если после указания интерфейса не указаны опции, выводит список всех атрибутов в удобном для терминала формате. В противном случае выводит указанную информацию, сгруппированную переносами строк и табуляцией, предназначенную для использования в скриптах. При таком выводе, если указано all, первым полем для всех категорий информации является имя интерфейса. Если указано dump, выводится несколько строк; первая содержит в порядке, разделённом табуляцией: private-key, public-key, listen-port, fwmark. Последующие строки выводятся для каждого пира и содержат в порядке, разделённом табуляцией: public-key, preshared-key, endpoint, allowed-ips, latest-handshake, transfer-rx, transfer-tx, persistent-keepalive.

Примеры:

# Показать всю информацию об интерфейсе wg0
wg show wg0

# Показать только публичный ключ
wg show wg0 public-key

# Показать все интерфейсы в формате для скриптов
wg show all dump

# Список всех интерфейсов
wg show interfaces

showconf

wg showconf <interface>

Показывает текущую конфигурацию интерфейса в формате, описанном ниже в разделе ФОРМАТ КОНФИГУРАЦИОННОГО ФАЙЛА.

Пример:

wg showconf wg0

set

wg set <interface> [listen-port <port>] [fwmark <fwmark>] [private-key <file-path>] [peer <base64-public-key> [remove] [preshared-key <file-path>] [endpoint <ip>:<port>] [persistent-keepalive <interval seconds>] [allowed-ips [+|-]<ip1>/<cidr1>[,[+|-]<ip2>/<cidr2>]...] ]...

Устанавливает значения конфигурации для указанного интерфейса. Может быть указано несколько пиров, и если для пира указан аргумент remove, этот пир удаляется, а не настраивается.

Если listen-port не указан или установлен в 0, порт будет выбран случайно при поднятии интерфейса. И private-key, и preshared-key должны быть файлами, поскольку аргументы командной строки не считаются приватными в большинстве систем, но если вы используете bash(1), вы можете безопасно передать строку, указав в качестве private-key или preshared-key выражение: < (echo PRIVATEKEYSTRING). Если указан /dev/null или другой пустой файл в качестве имени файла для private-key или preshared-key, ключ удаляется из устройства.

Использование preshared-key необязательно и может быть опущено; оно добавляет дополнительный уровень симметричной криптографии к уже существующей криптографии с открытым ключом для устойчивости к квантовым атакам.

Если allowed-ips указан, но значение является пустой строкой, все разрешённые IP-адреса удаляются у пира. По умолчанию allowed-ips заменяет разрешённые IP-адреса пира. Если перед любым из IP-адресов указан + или -, обновление является инкрементальным; IP-адреса с префиксом + или без префикса добавляются к разрешённым IP-адресам пира, если их нет, а IP-адреса с префиксом - удаляются, если присутствуют.

Использование persistent-keepalive необязательно и по умолчанию отключено; установка в 0 или “off” отключает его. В противном случае он представляет собой интервал в секундах от 1 до 65535 включительно, как часто отправлять аутентифицированный пустой пакет пиру для поддержания актуальности stateful-файервола или NAT-маппинга. Например, если интерфейс очень редко отправляет трафик, но может в любое время получать трафик от пира и находится за NAT, интерфейс может выиграть от постоянного интервала keepalive в 25 секунд; однако большинству пользователей это не понадобится.

Использование fwmark необязательно и по умолчанию отключено; установка в 0 или “off” отключает его. В противном случае это 32-битная fwmark для исходящих пакетов, которая может быть указана в шестнадцатеричном формате с префиксом “0x”.

Примеры:

# Установить порт и приватный ключ
wg set wg0 listen-port 51820 private-key /etc/wireguard/private.key

# Добавить пира
wg set wg0 peer xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg= \
    endpoint 192.95.5.67:1234 \
    allowed-ips 10.192.122.3/32

# Удалить пира
wg set wg0 peer xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg= remove

# Инкрементальное добавление IP-адресов
wg set wg0 peer xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg= \
    allowed-ips +192.168.1.0/24

setconf

wg setconf <interface> <configuration-filename>

Устанавливает текущую конфигурацию интерфейса в содержимое configuration-filename, которое должно быть в формате, описанном в разделе ФОРМАТ КОНФИГУРАЦИОННОГО ФАЙЛА.

Пример:

wg setconf wg0 /etc/wireguard/wg0.conf

addconf

wg addconf <interface> <configuration-filename>

Добавляет содержимое configuration-filename, которое должно быть в формате, описанном в разделе ФОРМАТ КОНФИГУРАЦИОННОГО ФАЙЛА, к текущей конфигурации интерфейса.

Пример:

wg addconf wg0 /etc/wireguard/peer.conf

syncconf

wg syncconf <interface> <configuration-filename>

Как setconf, но сначала считывает существующую конфигурацию и вносит только те изменения, которые явно отличаются между конфигурационным файлом и интерфейсом. Это гораздо менее эффективно, чем setconf, но имеет преимущество, не нарушая текущие сессии пиров. Содержимое configuration-filename должно быть в формате, описанном в разделе ФОРМАТ КОНФИГУРАЦИОННОГО ФАЙЛА.

Пример:

wg syncconf wg0 /etc/wireguard/wg0.conf

genkey

wg genkey

Генерирует случайный приватный ключ в формате base64 и выводит его в стандартный вывод.

Пример:

wg genkey > private.key

genpsk

wg genpsk

Генерирует случайный предварительный общий ключ в формате base64 и выводит его в стандартный вывод.

Пример:

wg genpsk > preshared.key

pubkey

wg pubkey

Вычисляет публичный ключ и выводит его в формате base64 в стандартный вывод из соответствующего приватного ключа (сгенерированного с помощью genkey), переданного в формате base64 в стандартный ввод.

Пример:

wg pubkey < private.key > public.key

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

umask 077
wg genkey | tee private.key | wg pubkey > public.key

help

wg help

Показывает сообщение об использовании.

ФОРМАТ КОНФИГУРАЦИОННОГО ФАЙЛА

Формат конфигурационного файла основан на INI. Есть два раздела верхнего уровня — Interface и Peer. Может быть указано несколько разделов Peer, но только один раздел Interface.

Секция Interface

Секция Interface может содержать следующие поля:

ПолеОписаниеОбязательность
PrivateKeyПриватный ключ в формате base64, сгенерированный wg genkeyОбязательно
ListenPort16-битный порт для прослушивания. Необязательно; если не указан, выбирается случайноОпционально
FwMark32-битная fwmark для исходящих пакетов. Если установлено в 0 или “off”, опция отключена. Может быть указана в шестнадцатеричном формате с префиксом “0x”Опционально

Секция Peer

Секции Peer могут содержать следующие поля:

ПолеОписаниеОбязательность
PublicKeyПубличный ключ в формате base64, вычисленный wg pubkey из приватного ключа и обычно передаваемый вне полосы автору конфигурационного файлаОбязательно
PresharedKeyПредварительный общий ключ в формате base64, сгенерированный wg genpsk. Необязательно, может быть опущено. Добавляет дополнительный уровень симметричной криптографии для устойчивости к квантовым атакамОпционально
AllowedIPsРазделённый запятыми список IP-адресов (v4 или v6) с масками CIDR, с которых разрешён входящий трафик для этого пира и на который направляется исходящий трафик. Может быть указан несколько разОбязательно
EndpointКонечная точка — IP-адрес или имя хоста, за которым следует двоеточие и номер порта. Эта конечная точка будет автоматически обновляться до последнего IP-адреса и порта источника правильно аутентифицированных пакетов от пираОпционально
PersistentKeepaliveИнтервал в секундах от 1 до 65535 включительно, как часто отправлять аутентифицированный пустой пакет пиру для поддержания stateful-файервола или NAT-маппинга. Если установлено в 0 или “off”, опция отключенаОпционально

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

Этот пример может использоваться как модель для написания конфигурационных файлов, следуя INI-подобному синтаксису. Символы после и включая # считаются комментариями и игнорируются.

# Комментарий
[Interface]
PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
ListenPort = 51820
FwMark = 0x1234

[Peer]
PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
Endpoint = 192.95.5.67:1234
AllowedIPs = 10.192.122.3/32, 10.192.124.1/24
PersistentKeepalive = 25

[Peer]
PublicKey = TrMvSoP4jYQlY6RIzBgbssQqY3vxI2Pi+y71lOWWXX0=
Endpoint = [2607:5300:60:6b0::c05f:543]:2468
AllowedIPs = 10.192.122.4/32, 192.168.0.0/16

[Peer]
PublicKey = gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA=
Endpoint = test.wireguard.com:18981
AllowedIPs = 10.10.10.230/32

ОТЛАДОЧНАЯ ИНФОРМАЦИЯ

Иногда полезно иметь информацию о текущем состоянии туннеля.

Linux (модуль ядра)

При использовании модуля ядра Linux на ядре, поддерживающем динамическую отладку, отладочная информация может быть записана в dmesg(1) запуском от root:

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

OpenBSD и FreeBSD

На OpenBSD и FreeBSD отладочная информация может быть записана в dmesg(1) для конкретного интерфейса с помощью ifconfig(1):

# ifconfig wg0 debug

Пользовательские реализации

В пользовательских реализациях принято устанавливать переменную окружения LOG_LEVEL в verbose:

export LOG_LEVEL=verbose

ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ

WG_COLOR_MODE

Управляет цветным выводом:

  • always — всегда выводить ANSI-цвета
  • never — никогда не выводить ANSI-цвета
  • auto (или не установлено) — выводить цвета только при записи в TTY

Пример:

export WG_COLOR_MODE=never

WG_HIDE_KEYS

Управляет отображением ключей:

  • never — показывать приватные и предварительные общие ключи
  • always (или не установлено) — показывать ключи как “(hidden)”

Пример:

export WG_HIDE_KEYS=never

WG_ENDPOINT_RESOLUTION_RETRIES

Управляет повторными попытками разрешения DNS:

  • Если установлено целое число или infinity, разрешение DNS для конечной точки каждого пира будет повторяться указанное количество раз для непостоянных ошибок с увеличивающейся задержкой между попытками
  • По умолчанию: 15 попыток

Пример:

export WG_ENDPOINT_RESOLUTION_RETRIES=5

КРАТКИЙ СПРАВОЧНИК

Основные команды

КомандаОписание
wg show [interface]Показать конфигурацию
wg showconf interfaceПоказать конфигурацию в формате файла
wg set interface ...Установить параметры интерфейса
wg setconf interface fileУстановить конфигурацию из файла
wg addconf interface fileДобавить конфигурацию из файла
wg syncconf interface fileСинхронизировать конфигурацию
wg genkeyСгенерировать приватный ключ
wg genpskСгенерировать предварительный общий ключ
wg pubkeyВычислить публичный ключ

Параметры секции Interface

ПараметрОписаниеПример
PrivateKeyПриватный ключ (base64)yAnz5TF+lXX...
ListenPortПорт для прослушивания51820
FwMarkМетка для исходящих пакетов0x1234

Параметры секции Peer

ПараметрОписаниеПример
PublicKeyПубличный ключ пира (base64)xTIBA5rboUvn...
PresharedKeyПредварительный общий ключ (base64)/UwcSPg38hW...
AllowedIPsРазрешённые IP-адреса10.0.0.0/24, 192.168.1.0/24
EndpointКонечная точка192.95.5.67:1234
PersistentKeepaliveИнтервал keepalive (сек)25

СМОТРИТЕ ТАКЖЕ

  • wg-quick(8) — простая настройка интерфейсов WireGuard
  • ip(8) — утилита управления сетевыми устройствами
  • ip-link(8) — управление сетевыми интерфейсами
  • ip-address(8) — управление IP-адресами
  • ip-route(8) — управление таблицами маршрутизации

АВТОР

wg был написан Джейсоном А. Доненфельдом (Jason A. Donenfeld). Для обновлений и дополнительной информации доступна проектная страница во Всемирной паутине.