WireGuard: различия между версиями

Материал из ALT Linux Wiki
 
(не показано 120 промежуточных версий 2 участников)
Строка 1: Строка 1:
'''Запускать ваергарда в связке с systemd-networkd под Альтом проще, чем во многих других дистрибутивах.'''
=Запуск через systemd-networkd=
=Сервер=
Запускать ваергарда в связке с systemd-networkd под Альтом проще, чем в убунтоподобных дистрибутивах с их нетпланом.
Всего пара файлов:
==Сервер==
#<code>/etc/systemd/network/wg.netdev</code>
Дальнейшее можно делать на любом лине (будь то железный комп, виртуалка или контейнер) вне зависимости от роли — сервер это, рабочая лошадка или гей-приставка.
#:<source lang="ini">
 
Чтобы всё это управлялось не доп.утилитами, а непосредственно сервисом <code>systemd-networkd</code>, данный сервис следует установить и запустить ''(см. [[Systemd-networkd|статью]])'', а пакеты <code>etcnet</code> (касается только альта) — отодвинуть (см. ту же статью) либо снести:
 
{{cmd|# apt-get remove -y `rpm -qa --qf "%{NAME}\n" etcnet*`}}
 
Для начала сгенерим в файл пару ключей: приватный (для себя) и публичный (для тех, с кем предстоит туннелироваться). Себе для этого создал простецкий скрипт:
{|class="mw-collapsible mw-collapsed wikitable"
!wgenkeys &nbsp;
|-
|<source lang=bash>
#!/bin/sh
# wg genkey - генерирует закрытый ключ,
# tee      - сохраняет его в заданный файл и передаёт следующей команде:
# wg pubkey - извлекает из закрытого ключа открытый с сохранением в заданный файл.
# printf    - предваряет значения ключей именами для конечных конфиг-файлов.
 
OUT=/tmp/wgkeys
printf "PrivateKey = " >$OUT
wg genkey | tee -a $OUT | printf "PublicKey  = %s\n" `wg pubkey` >>$OUT
</source>
|}
<code>PublicKey  = <хэш нашего публичного ключа></code> из файла {{path|/tmp/wgkeys}} рассылаем нашим партнёрам по суровому бизнесу, а <code>PrivateKey = <хэш нашего приватного ключа></code> задействуем в первом из двух следующих конфигов:
{|class="mw-collapsible mw-collapsed wikitable"
!/etc/systemd/network/wg.netdev &nbsp;
|-
|<source lang="ini">
[NetDev]
[NetDev]
Name       = wg
Name       = wg
Kind       = wireguard
Kind       = wireguard


# Сервер
# Сервер
[WireGuard]
[WireGuard]
ListenPort = 51820
ListenPort = 51820
PrivateKey = <хэш той же длины, что и у публичного ключа>
PrivateKey = <хэш нашего приватного ключа из файла /tmp/wgkeys>


# Клиент, которых можно наплодить ощутимо больше одного
# Клиент, которых можно наплодить ощутимо больше одного
[WireGuardPeer]
[WireGuardPeer]
PublicKey   = FFly+CQaj1E2uVvGe4KIAOKn9238rxS/IOVQ2+JYDzs=
PublicKey = <публичный ключ нашего партнёра (пира)>
AllowedIPs = 192.168.123.253/32,192.168.1.0/24
AllowedIPs = 192.168.123.253/32,192.168.1.0/24
# Первый адрес — сам клиент, второй — его внутренняя сеть.
# Первый адрес — сам клиент, второй — его внутренняя сеть.
</source>
</source>
#<code>/etc/systemd/network/wg.network</code>
|}
#:<source lang="ini">
{|class="mw-collapsible mw-collapsed wikitable"
!/etc/systemd/network/wg.network &nbsp;
|-
|<source lang="ini">
[Match]
[Match]
Name        = wg
Name        = wg
Строка 33: Строка 61:
Gateway    = 192.168.123.254
Gateway    = 192.168.123.254
</source>
</source>
|}
{{Совет|простая аналогия для новичков — частный ключ ключом и является, и его следует беречь пуще зеницы ока.
А вот публичный больше похож на замóк, которым можно раскидываться направо-налево: расхватывайте, мол, люди добрые, цепляйте на свои двери — я в них войду!}}


=Клиенты=
==Клиенты==
Чтоб не мучиться с созданием конфига каждому сотруднику, нуждающемуся в доступе к локалке извне, накостылил скрипт <code>cfgen-wg</code>:
Чтоб не мучиться с созданием конфига каждому сотруднику, нуждающемуся в доступе к локалке извне, накостылил скрипт:
<source lang="bash">
{|class="mw-collapsible mw-collapsed wikitable"
!/usr/local/bin/wgadd &nbsp;
|-
|<source lang="bash">
#!/bin/bash
#!/bin/bash


[ "$#" -gt 1 ] || {
[ "$#" -gt 0 ] || {
     echo "Type 1) new key name without spaces and oversymbols and 2) device (mobile, windows or linux)!"
     echo "Type new key name without spaces/oversymbols, and optionally - device type (mobile, mac, windows or linux)"
     exit
     exit
}
}
Who=$1             # имя доменной учётки клиента
 
What=$2           # дивайсина [windows|linux|mobile]
ChatID="-1001хххххххх"  # ИД чатика
Conf=$Who-$What
Theme=1253              # Тема в чатике
Token="ид бота:его жетон"
URL="https://api.telegram.org/bot$Token/sendDocument"
WD=/etc/systemd/network/clients.wg
cd $WD
USR=$1                 # имя доменной учётки клиента
Dev=$2                 # дивайсина [windows|linux|mac|mobile]
Net=192.168.123        # туннельная сеть
Priv=`wg genkey`
Priv=`wg genkey`
Publ=`echo "$Priv" | wg pubkey`
Publ=`echo "$Priv" | wg pubkey`
Net=192.168.123    # туннельная сеть
# Вычисление последнего октета для нового адреса:
IP=$[`cat ./# `-1] # "./#" — файл обратного отсчёта IP-адреса по последнему октету в каталоге со скриптом
IP=$[`dir -1 *.conf | sort -V | sed 's|\..*||' | head -1`-1]
echo $IP >"./#"


Content="[Peer]
Content="[Peer]
PublicKey = EfhB+eUjbQToU4Uqk8HoTckRJvAQavrSXqSYuKKivBY=
PublicKey = <наш публичный ключ>
Endpoint = <IP или имя нашего сервера>:<порт>
Endpoint = <IP или имя нашего сервера>:<порт>
PersistentKeepalive = 25
AllowedIPs = <н.а.ш.а>/<локалка>
AllowedIPs = <н.а.ш.а>/<локалка>


Строка 61: Строка 101:
PrivateKey = $Priv
PrivateKey = $Priv
Address = $Net.$IP/24
Address = $Net.$IP/24
DNS = с.пи.со.к, н.а.ш.их, д.н.с.ов"
DNS = н.а.ш.и, д.н.с.ы, наш.домен.зона"


case "$What" in
[ "$Dev" ] && case "$Dev" in
     linux) # можно добавить правила фаервола — и не обязательно именно iptables
     linux) # можно добавить правила фаервола — и не обязательно именно iptables
         Content+="
         Content+="
PostUp  = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#PostUp  = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE"
#PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE"
     ;;
     ;;
     mobile) # создание кукарекода из сгенерённого конфига для отправки его мобильному клиенту
     mobile) # создание кукарекода из сгенерённого конфига для отправки его мобильному клиенту
         echo "$Content" | qrencode -t ansiutf8 >$Conf.qr
         echo "$Content" | qrencode -t ansiutf8 >$IP.$USR.qr
         cat $Conf.qr
         cat $USR.qr
     ;;
     ;;
    *) # конфиги для компов рассылаются сотрудникам почтой, пока вручную
        echo "$Content" >$Conf.ini
esac
esac
echo "$Content" >$IP.$USR.conf # создание и отправка конфига в тему чатика админов
[ -s "$IP.$USR.conf" ] && curl -s $URL -F "document=@$WD/$IP.$USR.conf" \
    -F "chat_id=$ChatID" -F "reply_to_message_id=$Theme" 2>&1 >/dev/null


NewDev="
NewDev="
[WireGuardPeer]
[WireGuardPeer]
# $Who, $What
# $USR $Dev
AllowedIPs  = $Net.$IP/32
AllowedIPs  = $Net.$IP/32
PublicKey  = $Publ
PublicKey  = $Publ"
"
 
echo "$NewDev" >>../wg.netdev && {
echo "$NewDev" >>../wg.netdev && { # добавление нового клиента в ДНС
     echo "$Net.$IP  $Who.wg" >>/etc/hosts
     echo "$Net.$IP  $USR.wg" >>/etc/hosts
     systemctl daemon-reload
     systemctl daemon-reload
     systemctl reload dnsmasq
     systemctl reload dnsmasq
Строка 90: Строка 132:
}
}
</source>
</source>
Помимо занесения вновь сгенерированного клиента в конфиг ваергарда, он также добавляется в локальный ДНС-кэш (<code>dnsmasq</code>), с которого основные внутренние ДНСы запрашивают зону <code>.wg</code>.
|}
Помимо занесения вновь сгенерированного клиента в конфиг ваергарда, он также добавляется в локальный ДНС-кэш (<code>dnsmasq</code>), с которого основные внутренние ДНСы запрашивают зону <code>.wg</code> — таким образом, адреса клиентов туннеля становятся видны клиентам локалки по имени.


Таким образом, адреса клиентов туннеля становятся видны клиентам локалки по имени.
Готовый конфиг отправляется в соответствующую тему админского телеграм-чата.


=Мониторинг=
==Список последних подключённых==
Для журналирования активности ядрёного модуля достаточно создать [на «железе» / в виртуалке] либо [на хост-системе / всех узлах кластера контейнеризации] с ваергардом юнит <code>/lib/systemd/system/wg-log.service</code>:
Тоже скрипт:
<source lang=ini>
{|class="mw-collapsible mw-collapsed wikitable"
!/usr/local/bin/wgwho &nbsp;
|-
|<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`
    DY=`TIME day`
    printf "%-15s %-10s %01d,%02d:%02d:%02d\n" $IP $NAME $DY $HR $MN $SC
done < <(wg | grep -B1 handsh | sed 's|allowed.* ||;s|/32||' | tr -d '\n' | sed 's|--|\n|g')
</source>
|}
{|class="mw-collapsible mw-collapsed wikitable"
!Пример вывода &nbsp;
|-
|<pre>
[root@vpn ~]# wgwho
-------------------------------------
06/07 12:14:36  Host.wg    Last seen
-------------------------------------
192.168.123.105 smoke      0,00:00:01
192.168.123.78  tiens      0,00:00:27
192.168.123.90  outsrc    0,00:00:32
192.168.123.94  regkrsk    0,00:01:29
192.168.123.89  saharovao  0,00:01:46
192.168.123.111 den        0,00:39:02
192.168.123.95  regnorth  0,00:57:49
192.168.123.98  boss      0,03:36:14
192.168.123.93  ermilovaj  0,12:20:55
192.168.123.92  kuznecovas 1,18:08:12
192.168.123.104 lapotok    3,15:54:38
192.168.123.96  zaharovv  4,21:50:06
...
</pre>
|}
==Мониторинг==
Для журналирования активности ядрёного модуля достаточно на [хосте / всех контейнеризаторах кластера] либо в виртуалке с ваергардом создать юнит:
{|class="mw-collapsible mw-collapsed wikitable"
!/lib/systemd/system/wg-log.service &nbsp;
|-
|<source lang=ini>
[Unit]
[Unit]
Description = WireGuard events logging
Description = WireGuard events logging
Строка 111: Строка 210:
WantedBy = multi-user.target
WantedBy = multi-user.target
</source>
</source>
И запустить его навсегда командой <code># systemctl enable --now wg-log</code>
|}
И запустить его навсегда командой {{cmd|# systemctl enable --now wg-log}}
 
Отслеживать текучку по {{cmd|$ journalctl -kf | grep wg}}.
{{Памятка|Ниже — не моё.}}
=Запуск через wg-quick=
Если еще нет пары частный-публичный ключ, ее нужно создать:
<pre>
$ wg genkey > privatekey
$ wg pubkey < privatekey > publickey
</pre>
Теперь файл privatekey в текущей папке содержит частный ключ, а файл publickey — публичный.
 
Установить wg-quick
# apt-get install wireguard-tools-wg-quick
Заведём в каталоге {{path|/etc/wireguard}} (при отсутствии такового — создать) конфигурационный файл, одноимённый поднимаемому интерфейсу (в данном случае — wg0):
{|class="mw-collapsible mw-collapsed wikitable"
!/etc/wireguard/wg0.conf &nbsp;
|-
|<source lang=ini>
[Interface]
PrivateKey = частный ключ клиента
# IP-адрес клиента (маска всегда /32)
Address = 172.16.1.2/32
 
# Для клиента пиром является сервер (что логично и взаимно)
[Peer]
PublicKey = <публичный ключ сервера>
# Подсети с другими доступными узлами, для которых клиент является маршрутизатором:
AllowedIPs = 172.16.1.0/24, 172.16.2.0/24, 192.168.1.0/24
# Реальный IP-адрес сервера с номером порта:
Endpoint = IP-адрес:51820
</source>
|}
В конфиге сервера все клиенты должны быть указаны аналогичным образом — в качестве пиров. Да, серверу тоже нужны публичные ключи клиентов.
 
Запуск, останов и мониторинг соединения возможны только от рута:
<pre>
# systemctl start|stop|restart wg-quick@wg0
# wg show
</pre>
 
=Запуск через NetworkManager из KDE=
Принцип создания соединения аналогичен варианту для консоли: требуются те же данные, что и для конфиг-файла, но вводить их нужно в нескольких окнах.
 
Запускаем приложение "Параметры системы KDE5":
*Alt+F2,
*во всплывшем окне начинаем набирать systemsettings5,
*Enter на появившемся пункте.
Выбираем в окне вкладку "Соединения" (группа "Сеть и связь"), "+" для создания нового.
 
Во всплывшем окне:
*прокручиваем до группы "VPN-соединения",
*выбираем "WireGuard",
*нажимаем "Создать".
 
В окне "Новое соединение" вводим имя соединения (например, wg0, соответственно названию интерфейса).
Окно открывается на вкладке "Интерфейс WireGuard", на ней в поле "личный ключ" вводим PrivateKey <u>клиента</u> и выбираем "Сохранить пароль только для этого пользователя (зашифрованный)".
 
Остальные поля можно оставить пустыми.
 
Далее — кнопка "Участники обмена…", во вновь появившемся окне ввести данные для пира (сервера):
*в поле "Открытый ключ" — PublicKey <u>сервера</u>,
*в поле "Разрешенные адреса IP" — AllowedIPs,
*в поля "Адрес подключения" и "Порт подключения" — реальный (видимый из Интернета) IP-адрес сервера с номером порта;
*поле "Интервал отправки пакетов keepalive" соответствует опции PersistentKeepalive конфига, но не сохраняется — что и не нужно: интервал задаёт сервер.
 
Остальные поля не нужны. Просто жмем OK.
 
Вкладка "IPv4":
*метод "Вручную",
*кнопка "+ Добавить",
*вводим IP-адрес <u>клиента</u> и маску подсети (255.255.255.255 для одиночного адреса или 0.0.0.0 для шлюза),
*галка "Для этого соединения требуется IPv4".
Вкладка "IPv6":
*метод "Отключено" (если, конечно, не используете этот протокол).
Вкладка "Основные параметры":
*снять галку "Все пользователи могут подключаться к данной сети" (так как мы всё равно выбрали хранить пароль только для этого пользователя),
*остальное оставить как есть.
Жмем "Сохранить". Теперь соединение можно подключать и отключать из иконки сетевых соединений в системном лотке.


Отслеживать текучку по <code>journalctl -kf</code>.
Чтобы увидеть результат настроек в едином конфиг-файле, можно использовать команду (замените wg0 на имя вашего соединения):
<pre># wg showconf wg0</pre>
Соединение должно быть активно.
=Обратная связь=
*[https://t.me/gbIMoBou @gbIMoBou]
*[[Участник:Дым#Заметки|Другие статьи]]
{{Category navigation|title=Системному администратору|category=Admin|sortkey={{SUBPAGENAME}}}}
{{Category navigation|title=Системному администратору|category=Admin|sortkey={{SUBPAGENAME}}}}
[[Категория:Admin]]
[[Категория:Admin]]
[[Категория:VPN]]
[[Категория:VPN]]

Текущая версия от 03:42, 2 февраля 2024

Запуск через systemd-networkd

Запускать ваергарда в связке с systemd-networkd под Альтом проще, чем в убунтоподобных дистрибутивах с их нетпланом.

Сервер

Дальнейшее можно делать на любом лине (будь то железный комп, виртуалка или контейнер) вне зависимости от роли — сервер это, рабочая лошадка или гей-приставка.

Чтобы всё это управлялось не доп.утилитами, а непосредственно сервисом systemd-networkd, данный сервис следует установить и запустить (см. статью), а пакеты etcnet (касается только альта) — отодвинуть (см. ту же статью) либо снести:

# apt-get remove -y `rpm -qa --qf "%{NAME}\n" etcnet*`

Для начала сгенерим в файл пару ключей: приватный (для себя) и публичный (для тех, с кем предстоит туннелироваться). Себе для этого создал простецкий скрипт:

wgenkeys  
#!/bin/sh
# wg genkey - генерирует закрытый ключ,
# tee       - сохраняет его в заданный файл и передаёт следующей команде:
# wg pubkey - извлекает из закрытого ключа открытый с сохранением в заданный файл.
# printf    - предваряет значения ключей именами для конечных конфиг-файлов.

OUT=/tmp/wgkeys
printf "PrivateKey = " >$OUT
wg genkey | tee -a $OUT | printf "PublicKey  = %s\n" `wg pubkey` >>$OUT

PublicKey = <хэш нашего публичного ключа> из файла /tmp/wgkeys рассылаем нашим партнёрам по суровому бизнесу, а PrivateKey = <хэш нашего приватного ключа> задействуем в первом из двух следующих конфигов:

/etc/systemd/network/wg.netdev  
[NetDev]
Name       = wg
Kind       = wireguard

# Сервер
[WireGuard]
ListenPort = 51820
PrivateKey = <хэш нашего приватного ключа из файла /tmp/wgkeys>

# Клиент, которых можно наплодить ощутимо больше одного
[WireGuardPeer]
PublicKey  = <публичный ключ нашего партнёра (пира)>
AllowedIPs = 192.168.123.253/32,192.168.1.0/24
# Первый адрес — сам клиент, второй — его внутренняя сеть.
/etc/systemd/network/wg.network  
[Match]
Name        = wg

# Адрес сервера: как для взаимодействия с клиентами, так и им между собой
[Network]
Address     = 192.168.123.254/24

# Пример маршрутизации в сеть клиента из предыдущего конфига
[Route]
Destination = 192.168.1.0/24
Gateway     = 192.168.123.254
Совет: простая аналогия для новичков — частный ключ ключом и является, и его следует беречь пуще зеницы ока. А вот публичный больше похож на замóк, которым можно раскидываться направо-налево: расхватывайте, мол, люди добрые, цепляйте на свои двери — я в них войду!

Клиенты

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

/usr/local/bin/wgadd  
#!/bin/bash

[ "$#" -gt 0 ] || {
    echo "Type new key name without spaces/oversymbols, and optionally - device type (mobile, mac, windows or linux)"
    exit
}

ChatID="-1001хххххххх"  # ИД чатика
Theme=1253              # Тема в чатике
Token="ид бота:его жетон"
URL="https://api.telegram.org/bot$Token/sendDocument"
WD=/etc/systemd/network/clients.wg
cd $WD
USR=$1                  # имя доменной учётки клиента
Dev=$2                  # дивайсина [windows|linux|mac|mobile]
Net=192.168.123         # туннельная сеть
Priv=`wg genkey`
Publ=`echo "$Priv" | wg pubkey`
# Вычисление последнего октета для нового адреса:
IP=$[`dir -1 *.conf | sort -V | sed 's|\..*||' | head -1`-1]

Content="[Peer]
PublicKey = <наш публичный ключ>
Endpoint = <IP или имя нашего сервера>:<порт>
AllowedIPs = <н.а.ш.а>/<локалка>

[Interface]
PrivateKey = $Priv
Address = $Net.$IP/24
DNS = н.а.ш.и, д.н.с.ы, наш.домен.зона"

[ "$Dev" ] && case "$Dev" in
    linux) # можно добавить правила фаервола — и не обязательно именно iptables
        Content+="
#PostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE"
    ;;
    mobile) # создание кукарекода из сгенерённого конфига для отправки его мобильному клиенту
        echo "$Content" | qrencode -t ansiutf8 >$IP.$USR.qr
        cat $USR.qr
    ;;
esac

echo "$Content" >$IP.$USR.conf # создание и отправка конфига в тему чатика админов
[ -s "$IP.$USR.conf" ] && curl -s $URL -F "document=@$WD/$IP.$USR.conf" \
    -F "chat_id=$ChatID" -F "reply_to_message_id=$Theme" 2>&1 >/dev/null

NewDev="
[WireGuardPeer]
# $USR $Dev
AllowedIPs  = $Net.$IP/32
PublicKey   = $Publ"

echo "$NewDev" >>../wg.netdev && {  # добавление нового клиента в ДНС
    echo "$Net.$IP  $USR.wg" >>/etc/hosts
    systemctl daemon-reload
    systemctl reload dnsmasq
    systemctl restart systemd-networkd
}

Помимо занесения вновь сгенерированного клиента в конфиг ваергарда, он также добавляется в локальный ДНС-кэш (dnsmasq), с которого основные внутренние ДНСы запрашивают зону .wg — таким образом, адреса клиентов туннеля становятся видны клиентам локалки по имени.

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

Список последних подключённых

Тоже скрипт:

/usr/local/bin/wgwho  
#!/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`
    DY=`TIME day`
    printf "%-15s %-10s %01d,%02d:%02d:%02d\n" $IP $NAME $DY $HR $MN $SC
done < <(wg | grep -B1 handsh | sed 's|allowed.* ||;s|/32||' | tr -d '\n' | sed 's|--|\n|g')
Пример вывода  
[root@vpn ~]# wgwho 
-------------------------------------
06/07 12:14:36  Host.wg     Last seen
-------------------------------------
192.168.123.105 smoke      0,00:00:01
192.168.123.78  tiens      0,00:00:27
192.168.123.90  outsrc     0,00:00:32
192.168.123.94  regkrsk    0,00:01:29
192.168.123.89  saharovao  0,00:01:46
192.168.123.111 den        0,00:39:02
192.168.123.95  regnorth   0,00:57:49
192.168.123.98  boss       0,03:36:14
192.168.123.93  ermilovaj  0,12:20:55
192.168.123.92  kuznecovas 1,18:08:12
192.168.123.104 lapotok    3,15:54:38
192.168.123.96  zaharovv   4,21:50:06
...

Мониторинг

Для журналирования активности ядрёного модуля достаточно на [хосте / всех контейнеризаторах кластера] либо в виртуалке с ваергардом создать юнит:

/lib/systemd/system/wg-log.service  
[Unit]
Description = WireGuard events logging
ConditionPathExists = /sys/kernel/debug/dynamic_debug/control
ConditionPathIsDirectory = /sys/module/wireguard
After = network.target systemd-modules-load.service

[Service]
Type = oneshot
RemainAfterExit = yes
ExecStart = echo module wireguard +p >/sys/kernel/debug/dynamic_debug/control

[Install]
WantedBy = multi-user.target

И запустить его навсегда командой # systemctl enable --now wg-log

Отслеживать текучку по $ journalctl -kf .

Памятка: Ниже — не моё.

Запуск через 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  
[Interface]
PrivateKey = частный ключ клиента
# IP-адрес клиента (маска всегда /32)
Address = 172.16.1.2/32

# Для клиента пиром является сервер (что логично и взаимно)
[Peer]
PublicKey = <публичный ключ сервера>
# Подсети с другими доступными узлами, для которых клиент является маршрутизатором:
AllowedIPs = 172.16.1.0/24, 172.16.2.0/24, 192.168.1.0/24
# Реальный IP-адрес сервера с номером порта:
Endpoint = IP-адрес:51820

В конфиге сервера все клиенты должны быть указаны аналогичным образом — в качестве пиров. Да, серверу тоже нужны публичные ключи клиентов.

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

# 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

Соединение должно быть активно.

Обратная связь