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

Материал из ALT Linux Wiki
Нет описания правки
(не показано 27 промежуточных версий этого же участника)
Строка 1: Строка 1:
'''Запускать ваергарда в связке с systemd-networkd под Альтом проще, чем во многих других дистрибутивах.'''
'''Запускать ваергарда в связке с systemd-networkd под Альтом проще, чем во многих других дистрибутивах.'''
=Настройка=
=Сервер=
Всего пара файлов:
Всего пара файлов:
#<code>/etc/systemd/network/wg.netdev</code>
#<code>/etc/systemd/network/wg.netdev</code>
Строка 13: Строка 13:
PrivateKey  = <хэш той же длины, что и у публичного ключа>
PrivateKey  = <хэш той же длины, что и у публичного ключа>


# Клиент, которых может быть ощутимо больше одного
# Клиент, которых можно наплодить ощутимо больше одного
[WireGuardPeer]
[WireGuardPeer]
PublicKey  = FFly+CQaj1E2uVvGe4KIAOKn9238rxS/IOVQ2+JYDzs=
PublicKey  = FFly+CQaj1E2uVvGe4KIAOKn9238rxS/IOVQ2+JYDzs=
AllowedIPs  = 192.168.123.78/32,192.168.2.0/24
AllowedIPs  = 192.168.123.253/32,192.168.1.0/24
# Первый адрес — сам клиент, второй — его внутренняя сеть.
# Первый адрес — сам клиент, второй — его внутренняя сеть.
</source>
</source>
Строка 24: Строка 24:
Name        = wg
Name        = wg


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


# Пример маршрутизации к одному из таких клиентов
# Пример маршрутизации в сеть клиента из предыдущего конфига
[Route]
[Route]
Destination = 192.168.1.0/24
Destination = 192.168.1.0/24
Gateway    = 192.168.123.102
Gateway    = 192.168.123.254
</source>
</source>
=Клиенты=
Чтоб не мучиться с созданием конфига каждому сотруднику, нуждающемуся в доступе к локалке извне, накостылил скрипт <code>cfgen-wg</code> (лежит в подкаталоге у сетевых интерфейсов, отсюда такие пути):
<source lang="bash">
#!/bin/bash
[ "$#" -gt 1 ] || {
    echo "Type 1) new key name without spaces and oversymbols and 2) device (mobile, windows or linux)!"
    exit
}
Who=$1            # имя доменной учётки клиента
What=$2            # дивайсина [windows|linux|mobile]
Conf=$Who-$What
Priv=`wg genkey`
Publ=`echo "$Priv" | wg pubkey`
Net=192.168.123    # туннельная сеть
IP=$[`cat ./# `-1] # "./#" — файл обратного отсчёта IP-адреса по последнему октету в каталоге со скриптом
echo $IP >"./#"
Content="[Peer]
PublicKey = EfhB+eUjbQToU4Uqk8HoTckRJvAQavrSXqSYuKKivBY=
Endpoint = <IP или имя нашего сервера>:<порт>
PersistentKeepalive = 25
AllowedIPs = <н.а.ш.а>/<локалка>
[Interface]
PrivateKey = $Priv
Address = $Net.$IP/24
DNS = с.пи.со.к, н.а.ш.их, д.н.с.ов"
case "$What" 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 >$Conf.qr
        cat $Conf.qr
    ;;
    *) # конфиги для компов рассылаются сотрудникам почтой, пока вручную
        echo "$Content" >$Conf.ini
esac
NewDev="
[WireGuardPeer]
# $Who, $What
AllowedIPs  = $Net.$IP/32
PublicKey  = $Publ
"
echo "$NewDev" >>../wg.netdev && {
    echo "$Net.$IP  $Who.wg" >>/etc/hosts
    systemctl daemon-reload
    systemctl reload dnsmasq
    systemctl restart systemd-networkd
}
</source>
Помимо занесения вновь сгенерированного клиента в конфиг ваергарда, он также добавляется в локальный ДНС-кэш (<code>dnsmasq</code>), с которого основные внутренние ДНСы запрашивают зону <code>.wg</code>.
Таким образом, адреса клиентов туннеля становятся видны клиентам локалки по имени.
=Мониторинг=
=Мониторинг=
Для журналирования активности модуля достаточно создать [на «железе» / в виртуалке] либо [на хост-системе / на всех узлах кластера контейнеризации] с ваергардом юнит <code>/lib/systemd/system/wg-log.service</code> следующего содержания:
Для журналирования активности ядрёного модуля достаточно создать [на «железе» / в виртуалке] либо на [хост-системе / всех узлах кластера контейнеризации] с ваергардом юнит <code>/lib/systemd/system/wg-log.service</code>:
<source lang=ini>
<source lang=ini>
[Unit]
[Unit]
Строка 52: Строка 113:
И запустить его навсегда командой <code># systemctl enable --now wg-log</code>
И запустить его навсегда командой <code># systemctl enable --now wg-log</code>


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

Версия от 01:15, 20 ноября 2022

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

Сервер

Всего пара файлов:

  1. /etc/systemd/network/wg.netdev
    [NetDev]
    Name        = wg
    Kind        = wireguard
    
    # Сервер
    [WireGuard]
    ListenPort  = 51820
    PrivateKey  = <хэш той же длины, что и у публичного ключа>
    
    # Клиент, которых можно наплодить ощутимо больше одного
    [WireGuardPeer]
    PublicKey   = FFly+CQaj1E2uVvGe4KIAOKn9238rxS/IOVQ2+JYDzs=
    AllowedIPs  = 192.168.123.253/32,192.168.1.0/24
    # Первый адрес — сам клиент, второй — его внутренняя сеть.
    
  2. /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
    

Клиенты

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

#!/bin/bash

[ "$#" -gt 1 ] || {
    echo "Type 1) new key name without spaces and oversymbols and 2) device (mobile, windows or linux)!"
    exit
}
Who=$1             # имя доменной учётки клиента
What=$2            # дивайсина [windows|linux|mobile]
Conf=$Who-$What
Priv=`wg genkey`
Publ=`echo "$Priv" | wg pubkey`
Net=192.168.123    # туннельная сеть
IP=$[`cat ./# `-1] # "./#" — файл обратного отсчёта IP-адреса по последнему октету в каталоге со скриптом
echo $IP >"./#"

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

[Interface]
PrivateKey = $Priv
Address = $Net.$IP/24
DNS = с.пи.со.к, н.а.ш.их, д.н.с.ов"

case "$What" 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 >$Conf.qr
        cat $Conf.qr
    ;;
    *) # конфиги для компов рассылаются сотрудникам почтой, пока вручную
        echo "$Content" >$Conf.ini
esac

NewDev="
[WireGuardPeer]
# $Who, $What
AllowedIPs  = $Net.$IP/32
PublicKey   = $Publ
"
echo "$NewDev" >>../wg.netdev && {
    echo "$Net.$IP  $Who.wg" >>/etc/hosts
    systemctl daemon-reload
    systemctl reload dnsmasq
    systemctl restart systemd-networkd
}

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

Таким образом, адреса клиентов туннеля становятся видны клиентам локалки по имени.

Мониторинг

Для журналирования активности ядрёного модуля достаточно создать [на «железе» / в виртуалке] либо на [хост-системе / всех узлах кластера контейнеризации] с ваергардом юнит /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 | grep wg.

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