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

Материал из ALT Linux Wiki
Строка 34: Строка 34:
</source>
</source>
=Клиенты=
=Клиенты=
Чтоб не мучиться с созданием конфига каждому сотруднику, нуждающемуся в доступе к локалке извне, накропал скрипт:
Чтоб не мучиться с созданием конфига каждому сотруднику, нуждающемуся в доступе к локалке извне, накостылил скрипт:
<source lang="bash">
<source lang="bash">
#!/bin/bash
#!/bin/bash
Строка 42: Строка 42:
     exit
     exit
}
}
Who=$1 # имя доменной учётки клиента
Who=$1             # имя доменной учётки клиента
What=$2 # дивайсина [windows|linux|mobile]
What=$2           # дивайсина [windows|linux|mobile]
Conf=$Who-$What
Conf=$Who-$What
Net=192.168.123
Net=192.168.123   # туннельная сеть
Priv=`wg genkey`
Priv=`wg genkey`
Publ=`echo "$Priv" | wg pubkey`
Publ=`echo "$Priv" | wg pubkey`
Строка 53: Строка 53:
Content="[Peer]
Content="[Peer]
PublicKey = EfhB+eUjbQToU4Uqk8HoTckRJvAQavrSXqSYuKKivBY=
PublicKey = EfhB+eUjbQToU4Uqk8HoTckRJvAQavrSXqSYuKKivBY=
Endpoint = 188.168.20.182:47429
Endpoint = <IP или имя нашего сервера>:<порт>
PersistentKeepalive = 25
PersistentKeepalive = 25
AllowedIPs = 10.0.1.0/24
AllowedIPs = .а.ш.а>/<локалка>


[Interface]
[Interface]
Строка 76: Строка 76:
PublicKey  = $Publ
PublicKey  = $Publ
"
"
#printf "\n# $Who, $What\n[WireGuardPeer]\nAllowedIPs\t= $Net.$IP/32\nPublicKey\t= $Publ\n" >>../wg.netdev && {
echo "$NewDev" >>../wg.netdev && {
echo "$NewDev" >>../wg.netdev && {
     echo "$Net.$IP  $Who.wg" >>/etc/hosts
     echo "$Net.$IP  $Who.wg" >>/etc/hosts
Строка 84: Строка 83:
}
}
</source>
</source>
Помимо занесения вновь генерируемого клиента в конфиг ваергарда, он также добавляется в локальный днс-кэш (dnsmasq), с которого основные внутренние днсы запрашивают зону .wg
Помимо занесения вновь сгенерированного клиента в конфиг ваергарда, он также добавляется в локальный днс-кэш (dnsmasq), с которого основные внутренние днсы запрашивают зону .wg


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

Версия от 03:49, 17 марта 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.78/32,192.168.2.0/24
    # Первый адрес — сам клиент, второй — его внутренняя сеть.
    
  2. /etc/systemd/network/wg.network
    [Match]
    Name        = wg
    
    # Сеть как для взаимодействия с клиентами, так и им между собой
    [Network]
    Address     = 192.168.123.182/24
    
    # Пример маршрутизации к одному из таких клиентов
    [Route]
    Destination = 192.168.1.0/24
    Gateway     = 192.168.123.102
    

Клиенты

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

#!/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
Net=192.168.123    # туннельная сеть
Priv=`wg genkey`
Publ=`echo "$Priv" | wg pubkey`
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
    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.