wg — руководство
ИМЯ
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 | Обязательно |
| ListenPort | 16-битный порт для прослушивания. Необязательно; если не указан, выбирается случайно | Опционально |
| FwMark | 32-битная 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
Endpoint используется квадратные скобки: [2607:5300:60:6b0::c05f:543]:2468ОТЛАДОЧНАЯ ИНФОРМАЦИЯ
Иногда полезно иметь информацию о текущем состоянии туннеля.
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). Для обновлений и дополнительной информации доступна проектная страница во Всемирной паутине.