WireGuard: различия между версиями
Дым (обсуждение | вклад) |
Дым (обсуждение | вклад) |
||
Строка 159: | Строка 159: | ||
Отслеживать текучку по <code>$ journalctl -kf | grep wg</code>. | Отслеживать текучку по <code>$ journalctl -kf | grep wg</code>. | ||
==Список активных клиентов== | |||
Тоже скрипт: | |||
{|class="mw-collapsible mw-collapsed wikitable" | |||
!/usr/local/bin/wgwho | |||
|- | |||
|<source lang=bash> | |||
#!/bin/sh | |||
TIME(){ | |||
NUM=`echo "$LAST" | awk '/'$1'/{print $1}'` | |||
[ "$NUM" ] || NUM=0 | |||
echo $NUM | |||
} | |||
echo "-----------------------------------" | |||
date +"%d/%m %T Host.wg Last seen" | |||
echo "-----------------------------------" | |||
while read LINE; do | |||
IP=`echo $LINE | awk '{print $1}'` | |||
NAME=`awk '/'$IP'/{sub(".wg","");print $2}' /etc/hosts` | |||
[ "$NAME" ] || NAME="--" | |||
LAST=`echo $LINE | awk -F: '{gsub(", ","\n");print $2}'` | |||
SC=`TIME second` | |||
MN=`TIME minute` | |||
HR=`TIME hour` | |||
printf "%-15s %-10s %02d:%02d:%02d\n" $IP $NAME $HR $MN $SC | |||
done <<<$(wg | grep -B1 handsh | sed 's|allowed.* ||;s|/32||' | tr -d '\n' | sed 's|--|\n|g') | |||
</source> | |||
|} | |||
Пример вывода: | |||
<pre> | |||
[root@vpn ~]# wgwho | |||
----------------------------------- | |||
03/07 13:56:41 Host.wg Last seen | |||
----------------------------------- | |||
192.168.123.98 boss 00:00:51 | |||
192.168.123.105 smoke 00:01:08 | |||
192.168.123.95 regnorth 00:01:30 | |||
192.168.123.90 outsrc 00:01:53 | |||
192.168.123.94 regkrsk 04:30:04 | |||
192.168.123.104 lapotok 17:36:43 | |||
... | |||
</pre> | |||
--------------- | --------------- | ||
Ниже — не моё. | Ниже — не моё. |
Версия от 07:04, 6 июля 2023
'
Настройка через systemd-networkd
Запускать ваергарда в связке с systemd-networkd под Альтом проще, чем во многих других дистрибутивах.
Сервер
Дальнейшее можно делать на любом лине (будь то железный комп, виртуалка или контейнер) вне зависимости от роли — сервер это, рабочая лошадка или гей-приставка.
Чтобы всё это управлялось не доп.утилитами, а непосредственно сервисом systemd-networkd
, данный сервис следует установить и запустить (см. статью), а пакеты etcnet
(касается только альта) — отодвинуть (см. ту же статью) либо снести:
# apt-get remove -y `rpm -qa --qf "%{NAME}\n" etcnet*`
Для начала...
- сгенерим ключик для сервера:
# wg genkey IA/6UzzmOWh2XceaQO3GfIsCOiuchlK4xTRhUo0ktFc=
- извлечём из него публичную часть и отправим админу сервера либо нашим клиентам, если сервер — мы:
# echo "IA/6UzzmOWh2XceaQO3GfIsCOiuchlK4xTRhUo0ktFc=" | wg pubkey s08w+USNyEP7h2rF9RCGxn4YoekLKGgIX9g2AV955FQ=
Теперь состряпаем пару файлов, где этими хэшами и воспользуемся:
развернуть/etc/systemd/network/wg.netdev |
---|
развернуть/etc/systemd/network/wg.network |
---|
Клиенты
Чтоб не мучиться с созданием конфига каждому сотруднику, нуждающемуся в доступе к локалке извне, накостылил скрипт:
развернуть/usr/local/bin/wgadd |
---|
Помимо занесения вновь сгенерированного клиента в конфиг ваергарда, он также добавляется в локальный ДНС-кэш (dnsmasq
), с которого основные внутренние ДНСы запрашивают зону .wg
— таким образом, адреса клиентов туннеля становятся видны клиентам локалки по имени.
Готовый конфиг отправляется в соответствующую тему админского телеграм-чата.
Мониторинг
Для журналирования активности ядрёного модуля достаточно [на «железе» / в виртуалке] либо на [хост-системе / всех узлах кластера контейнеризации] с ваергардом создать юнит:
развернуть/lib/systemd/system/wg-log.service |
---|
И запустить его навсегда командой # systemctl enable --now wg-log
Отслеживать текучку по $ journalctl -kf | grep wg
.
Список активных клиентов
Тоже скрипт:
развернуть/usr/local/bin/wgwho |
---|
Пример вывода:
[root@vpn ~]# wgwho ----------------------------------- 03/07 13:56:41 Host.wg Last seen ----------------------------------- 192.168.123.98 boss 00:00:51 192.168.123.105 smoke 00:01:08 192.168.123.95 regnorth 00:01:30 192.168.123.90 outsrc 00:01:53 192.168.123.94 regkrsk 04:30:04 192.168.123.104 lapotok 17:36:43 ...
Ниже — не моё.
Настройка для запуска через wg-quick
Если еще нет пары частный-публичный ключ, ее нужно создать:
$ wg genkey > privatekey $ wg pubkey < privatekey > publickey
Теперь файл privatekey в текущей папке содержит частный ключ, а файл publickey — публичный.
Установить wg-quick
# apt-get install wireguard-tools-wg-quick
Создать в каталоге /etc/wireguard (если отсутствует, создать и его) конфигурационный файл (имя файла = имя поднятого интерфейса, в данном случае — wg0):
развернуть/etc/wireguard/wg0.conf |
---|
В конфиге сервера все клиенты должны быть указаны аналогичным образом — в качестве пиров. Да, серверу тоже нужны публичные ключи клиентов.
Запуск, останов и мониторинг соединения возможны только от рута:
# systemctl start|stop|restart wg-quick@wg0 # wg show
Настройка NetworkManager для пользователя KDE
Принцип создания соединения аналогичен варианту для консоли: требуются те же данные, что и для конфиг-файла, но вводить их нужно в нескольких окнах.
Запускаем приложение "Параметры системы KDE5":
- Alt+F2,
- во всплывшем окне начинаем набирать systemsettings5,
- Enter на появившемся пункте.
Выбираем в окне вкладку "Соединения" (группа "Сеть и связь"), "+" для создания нового.
Во всплывшем окне:
- прокручиваем до группы "VPN-соединения",
- выбираем "WireGuard",
- нажимаем "Создать".
В окне "Новое соединение" вводим имя соединения (например, wg0, соответственно названию интерфейса). Окно открывается на вкладке "Интерфейс WireGuard", на ней в поле "личный ключ" вводим PrivateKey клиента и выбираем "Сохранить пароль только для этого пользователя (зашифрованный)".
Остальные поля можно оставить пустыми.
Далее — кнопка "Участники обмена...", во вновь появившемся окне ввести данные для пира (сервера):
- в поле "Открытый ключ" — PublicKey сервера,
- в поле "Разрешенные адреса IP" — AllowedIPs,
- в поля "Адрес подключения" и "Порт подключения" — реальный (видимый из Интернета) IP-адрес сервера с номером порта;
- поле "Интервал отправки пакетов keepalive" соответствует опции PersistentKeepalive конфига, но не сохраняется — что и не нужно: интервал задаёт сервер.
Остальные поля не нужны. Просто жмем OK.
Вкладка "IPv4":
- метод "Вручную",
- кнопка "+ Добавить",
- вводим IP-адрес клиента и маску подсети (255.255.255.255 для одиночного адреса или 0.0.0.0 для шлюза),
- галка "Для этого соединения требуется IPv4".
Вкладка "IPv6":
- метод "Отключено" (если, конечно, не используете этот протокол).
Вкладка "Основные параметры":
- снять галку "Все пользователи могут подключаться к данной сети" (так как мы всё равно выбрали хранить пароль только для этого пользователя),
- остальное оставить как есть.
Жмем "Сохранить". Теперь соединение можно подключать и отключать из иконки сетевых соединений в системном лотке.
Чтобы увидеть результат настроек в едином конфиг-файле, можно использовать команду (замените wg0 на имя вашего соединения):
# wg showconf wg0
Соединение должно быть активно.