wg-quick — руководство
ИМЯ
wg-quick — простая настройка интерфейса WireGuard
СИНТАКСИС
wg-quick [ up | down | save | strip ] [ CONFIG_FILE | INTERFACE ]
ОПИСАНИЕ
Это чрезвычайно простой скрипт для быстрого поднятия интерфейса WireGuard, подходящий для нескольких распространённых сценариев использования.
Используйте up для добавления и настройки интерфейса, и down для его отключения и удаления. Команда up добавляет интерфейс WireGuard, поднимает его с указанными IP-адресами, настраивает MTU и маршруты, и при необходимости выполняет предварительные/последующие скрипты. Команда down при необходимости сохраняет текущую конфигурацию, удаляет интерфейс WireGuard и при необходимости выполняет предварительные/последующие скрипты. Команда save сохраняет конфигурацию существующего интерфейса без его отключения. Используйте strip для вывода конфигурационного файла без специфичных для wg-quick опций, подходящего для использования с wg(8).
CONFIG_FILE — это конфигурационный файл, имя которого соответствует имени интерфейса с расширением .conf. В противном случае INTERFACE — это имя интерфейса, конфигурация для которого ищется сначала в /etc/wireguard/INTERFACE.conf, а затем в путях поиска, специфичных для дистрибутива.
Вообще говоря, эта утилита представляет собой простой скрипт-обёртку для вызовов wg(8) и ip(8) для настройки интерфейса WireGuard. Она предназначена для пользователей с простыми потребностями. Пользователям с более сложными требованиями настоятельно рекомендуется использовать более специализированные инструменты, более полноценные сетевые менеджеры или просто использовать wg(8) и ip(8) как обычно.
КОНФИГУРАЦИЯ
Конфигурационный файл добавляет несколько дополнительных параметров к формату, используемому wg(8), для настройки дополнительных атрибутов интерфейса. Он обрабатывает значения, которые понимает, а остальные передаёт напрямую wg(8) для дальнейшей обработки.
Инструмент определяет все маршруты из списка разрешённых IP-адресов пиров и автоматически добавляет их в системную таблицу маршрутизации. Если один из этих маршрутов является маршрутом по умолчанию (0.0.0.0/0 или ::/0), он использует ip-rule(8) для обработки переопределения шлюза по умолчанию.
Конфигурационный файл будет передан напрямую подкоманде setconf wg(8), за исключением следующих дополнений в секции [Interface], которые обрабатываются этим инструментом:
Параметры секции Interface
Address — разделённый запятыми список IP-адресов (v4 или v6) (опционально с масками CIDR), которые будут назначены интерфейсу. Может быть указан несколько раз.
DNS — разделённый запятыми список IP-адресов (v4 или v6), которые будут установлены как DNS-серверы интерфейса, или не-IP-имя хоста для установки в качестве доменов поиска DNS. Может быть указан несколько раз. При поднятии интерфейса выполняется
resolvconf -a tun.INTERFACE -m 0 -x, а при отключении —resolvconf -d tun.INTERFACE. Если эти вызовыresolvconf(8)нежелательны, вместо них можно использовать ключиPostUpиPostDownниже.MTU — если не указано, MTU автоматически определяется из адресов конечных точек или системного маршрута по умолчанию, что обычно является разумным выбором. Однако для ручного указания MTU это значение может быть задано явно.
Table — управляет таблицей маршрутизации, в которую добавляются маршруты. Есть два специальных значения:
offполностью отключает создание маршрутов, аauto(по умолчанию) добавляет маршруты в таблицу по умолчанию и включает специальную обработку маршрутов по умолчанию.PreUp, PostUp, PreDown, PostDown — фрагменты скриптов, которые будут выполнены
bash(1)до/после настройки/отключения интерфейса, чаще всего используются для настройки пользовательских DNS-опций или правил файервола. Специальная строка%iзаменяется на имя интерфейса. Каждый из них может быть указан несколько раз, в этом случае команды выполняются по порядку.SaveConfig — если установлено в
true, конфигурация сохраняется из текущего состояния интерфейса при его отключении. Любые изменения, внесённые в конфигурационный файл до удаления интерфейса, будут перезаписаны.
Имена интерфейсов
Рекомендуемые имена интерфейсов включают wg0, wgvpn0 или даже wgmgmtlan0. Однако число в конце необязательно, и действительно любое имя в формате [a-zA-Z0-9_=+.-]{1,15} будет работать. Так что даже имена интерфейсов, соответствующие географическим местоположениям, например cincinnati, nyc или paris, подойдут, если это по какой-то причине желательно.
ПРИМЕРЫ
Эти примеры используют тот же синтаксис, что и для wg(8), более полное описание можно найти там. Жирные строки ниже обозначают опции, расширяющие wg(8).
Пример 1: Клиент для VPN-шлюза
Следующий пример может использоваться для подключения в качестве клиента к VPN-шлюзу для туннелирования всего трафика:
[Interface]
Address = 10.200.100.8/24
DNS = 10.200.100.1
PrivateKey = oK56DE9Ue9zK76rAc8pBl6opph+1v36lm7cXXsQKrQM=
[Peer]
PublicKey = GtL7fZc/bLnqZldpVofMCD6hDjrK28SsdLxevJ+qtKU=
PresharedKey = /UwcSPg38hW/D9Y3tcS1FOV0K1wuURMbS0sesJEP5ak=
AllowedIPs = 0.0.0.0/0
Endpoint = demo.wireguard.com:51820
Поле Address добавлено для настройки адреса интерфейса. Поле DNS указывает, что DNS-сервер для интерфейса должен быть настроен через resolvconf(8). Запись разрешённых IP-адресов пира подразумевает, что этот интерфейс должен быть настроен как шлюз по умолчанию, что этот скрипт и делает.
Пример 2: “Выключатель” (kill-switch)
Развивая предыдущий пример, можно реализовать так называемый “выключатель” для предотвращения потока незашифрованных пакетов через интерфейсы, отличные от WireGuard, добавив следующие строки PostUp и PreDown в секцию [Interface]:
PostUp = iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PreDown = iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
Поля PostUp и PreDown добавлены для указания команды iptables(8), которая при использовании с интерфейсами, имеющими пир с 0.0.0.0/0 в AllowedIPs, работает вместе с использованием fwmark в wg-quick для отбрасывания всех пакетов, которые либо не выходят из туннеля зашифрованными, либо не проходят через сам туннель. (Обратите внимание, что это продолжает пропускать большую часть DHCP-трафика, поскольку большинство DHCP-клиентов используют сокеты PF_PACKET, которые обходят Netfilter.) При использовании IPv6 могут быть добавлены дополнительные аналогичные строки с использованием ip6tables(8).
Пример 3: Хранение ключей в зашифрованном виде
Или, возможно, желательно хранить приватные ключи в зашифрованном виде, например, с использованием pass(1):
PreUp = wg set %i private-key <(pass WireGuard/private-keys/%i)
Пример 4: Сервер с несколькими пирами
Для использования на сервере следующий более сложный пример включает несколько пиров:
[Interface]
Address = 10.192.122.1/24
Address = 10.10.0.1/16
SaveConfig = true
PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
ListenPort = 51820
[Peer]
PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
AllowedIPs = 10.192.122.3/32, 10.192.124.1/24
[Peer]
PublicKey = TrMvSoP4jYQlY6RIzBgbssQqY3vxI2Pi+y71lOWWXX0=
AllowedIPs = 10.192.122.4/32, 192.168.0.0/16
[Peer]
PublicKey = gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA=
AllowedIPs = 10.10.10.230/32
Обратите внимание на две строки Address вверху и что SaveConfig установлен в true, указывая, что конфигурационный файл должен быть сохранён при отключении, используя текущее состояние интерфейса.
Пример 5: Политика маршрутизации
Комбинация полей Table, PostUp и PreDown может использоваться для политики маршрутизации. Например, следующее может использоваться для отправки SSH-трафика (TCP-порт 22) через туннель:
[Interface]
Address = 10.192.122.1/24
PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
ListenPort = 51820
Table = 1234
PostUp = ip rule add ipproto tcp dport 22 table 1234
PreDown = ip rule delete ipproto tcp dport 22 table 1234
[Peer]
PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
AllowedIPs = 0.0.0.0/0
ИСПОЛЬЗОВАНИЕ
Эти конфигурационные файлы могут быть размещены в любой директории, указав желаемое имя интерфейса в имени файла:
# wg-quick up /path/to/wgnet0.conf
Для удобства, если указано только имя интерфейса, автоматически выбирается путь в /etc/wireguard/:
# wg-quick up wgnet0
Это загрузит конфигурационный файл /etc/wireguard/wgnet0.conf.
Команда strip полезна для перезагрузки конфигурационных файлов без прерывания активных сессий:
# wg syncconf wgnet0 <(wg-quick strip wgnet0)
СМОТРИТЕ ТАКЖЕ
- wg(8) — настройка интерфейсов WireGuard
- ip(8) — утилита управления сетевыми устройствами
- ip-link(8) — управление сетевыми интерфейсами
- ip-address(8) — управление IP-адресами
- ip-route(8) — управление таблицами маршрутизации
- ip-rule(8) — управление правилами политической маршрутизации
- resolvconf(8) — управление настройками DNS
АВТОР
wg-quick был написан Джейсоном А. Доненфельдом (Jason A. Donenfeld). Для обновлений и дополнительной информации доступна проектная страница во Всемирной паутине.
КРАТКИЙ СПРАВОЧНИК
Основные команды
| Команда | Описание |
|---|---|
wg-quick up INTERFACE | Поднять интерфейс |
wg-quick down INTERFACE | Остановить интерфейс |
wg-quick save INTERFACE | Сохранить конфигурацию |
wg-quick strip INTERFACE | Вывести конфигурацию без wg-quick опций |
Параметры конфигурации
| Параметр | Описание | Пример |
|---|---|---|
Address | IP-адреса интерфейса | 10.0.0.1/24 |
DNS | DNS-серверы | 8.8.8.8 |
MTU | Максимальный размер пакета | 1420 |
Table | Таблица маршрутизации | auto, off, 1234 |
PreUp | Команда перед поднятием | iptables ... |
PostUp | Команда после поднятия | iptables ... |
PreDown | Команда перед остановкой | iptables ... |
PostDown | Команда после остановки | iptables ... |
SaveConfig | Сохранять конфигурацию | true / false |
PreUp, PostUp, PreDown и PostDown выполняются через bash(1), поэтому вы можете использовать все возможности оболочки, включая подстановку команд и переменные.SaveConfig = true. Любые изменения, внесённые в конфигурационный файл вручную, могут быть перезаписаны при остановке интерфейса.