WireGuard: различия между версиями
Дым (обсуждение | вклад) (→Сервер) |
|||
(не показано 110 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
=Запуск через systemd-networkd= | |||
= | Запускать ваергарда в связке с systemd-networkd под Альтом проще, чем в убунтоподобных дистрибутивах с их нетпланом. | ||
==Сервер== | |||
#<code>/etc/systemd/network/wg.netdev | Дальнейшее можно делать на любом лине (будь то железный комп, виртуалка или контейнер) вне зависимости от роли — сервер это, рабочая лошадка или гей-приставка. | ||
Чтобы всё это управлялось не доп.утилитами, а непосредственно сервисом <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 | |||
|- | |||
|<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 | |||
|- | |||
|<source lang="ini"> | |||
[NetDev] | [NetDev] | ||
Name | Name = wg | ||
Kind | Kind = wireguard | ||
# Сервер | # Сервер | ||
[WireGuard] | [WireGuard] | ||
ListenPort | ListenPort = 51820 | ||
PrivateKey | PrivateKey = <хэш нашего приватного ключа из файла /tmp/wgkeys> | ||
# Клиент, которых можно наплодить ощутимо больше одного | # Клиент, которых можно наплодить ощутимо больше одного | ||
[WireGuardPeer] | [WireGuardPeer] | ||
PublicKey | PublicKey = <публичный ключ нашего партнёра (пира)> | ||
AllowedIPs | AllowedIPs = 192.168.123.253/32,192.168.1.0/24 | ||
# Первый адрес — сам клиент, второй — его внутренняя сеть. | # Первый адрес — сам клиент, второй — его внутренняя сеть. | ||
</source> | </source> | ||
|} | |||
{|class="mw-collapsible mw-collapsed wikitable" | |||
!/etc/systemd/network/wg.network | |||
|- | |||
|<source lang="ini"> | |||
[Match] | [Match] | ||
Name = wg | Name = wg | ||
Строка 33: | Строка 61: | ||
Gateway = 192.168.123.254 | Gateway = 192.168.123.254 | ||
</source> | </source> | ||
|} | |||
{{Совет|простая аналогия для новичков — частный ключ ключом и является, и его следует беречь пуще зеницы ока. | |||
=Клиенты= | А вот публичный больше похож на замóк, которым можно раскидываться направо-налево: расхватывайте, мол, люди добрые, цепляйте на свои двери — я в них войду!}} | ||
Чтоб не мучиться с созданием конфига каждому сотруднику, нуждающемуся в доступе к локалке извне, накостылил скрипт | |||
<source lang="bash"> | ==Клиенты== | ||
Чтоб не мучиться с созданием конфига каждому сотруднику, нуждающемуся в доступе к локалке извне, накостылил скрипт: | |||
{|class="mw-collapsible mw-collapsed wikitable" | |||
!/usr/local/bin/wgadd | |||
|- | |||
|<source lang="bash"> | |||
#!/bin/bash | #!/bin/bash | ||
[ "$#" -gt | [ "$#" -gt 0 ] || { | ||
echo "Type | echo "Type new key name without spaces/oversymbols, and optionally - device type (mobile, mac, windows or linux)" | ||
exit | 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` | Priv=`wg genkey` | ||
Publ=`echo "$Priv" | wg pubkey` | Publ=`echo "$Priv" | wg pubkey` | ||
# Вычисление последнего октета для нового адреса: | |||
IP=$[` | IP=$[`dir -1 *.conf | sort -V | sed 's|\..*||' | head -1`-1] | ||
Content="[Peer] | Content="[Peer] | ||
PublicKey = | PublicKey = <наш публичный ключ> | ||
Endpoint = <IP или имя нашего сервера>:<порт> | Endpoint = <IP или имя нашего сервера>:<порт> | ||
AllowedIPs = <н.а.ш.а>/<локалка> | AllowedIPs = <н.а.ш.а>/<локалка> | ||
Строка 61: | Строка 101: | ||
PrivateKey = $Priv | PrivateKey = $Priv | ||
Address = $Net.$IP/24 | Address = $Net.$IP/24 | ||
DNS = | DNS = н.а.ш.и, д.н.с.ы, наш.домен.зона" | ||
case "$ | [ "$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 >$ | echo "$Content" | qrencode -t ansiutf8 >$IP.$USR.qr | ||
cat $ | cat $USR.qr | ||
;; | ;; | ||
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] | ||
# $ | # $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 $ | 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> — таким образом, адреса клиентов туннеля становятся видны клиентам локалки по имени. | |||
Готовый конфиг отправляется в соответствующую тему админского телеграм-чата. | |||
==Список последних подключённых== | |||
Тоже скрипт: | |||
{|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` | |||
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> | </source> | ||
|} | |||
{|class="mw-collapsible mw-collapsed wikitable" | |||
!Пример вывода | |||
|- | |||
|<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 | |||
|- | |||
|<source lang=ini> | |||
[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 | |||
</source> | </source> | ||
|} | |||
И запустить его навсегда командой {{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 | |||
<source> | # apt-get install wireguard-tools-wg-quick | ||
Заведём в каталоге {{path|/etc/wireguard}} (при отсутствии такового — создать) конфигурационный файл, одноимённый поднимаемому интерфейсу (в данном случае — wg0): | |||
{|class="mw-collapsible mw-collapsed wikitable" | |||
!/etc/wireguard/wg0.conf | |||
|- | |||
|<source lang=ini> | |||
[Interface] | [Interface] | ||
PrivateKey = частный ключ клиента | PrivateKey = частный ключ клиента | ||
#IP-адрес клиента | # IP-адрес клиента (маска всегда /32) | ||
Address = 172.16.1.2/32 | Address = 172.16.1.2/32 | ||
# Для клиента пиром является сервер | # Для клиента пиром является сервер (что логично и взаимно) | ||
[Peer] | [Peer] | ||
PublicKey = публичный ключ сервера | PublicKey = <публичный ключ сервера> | ||
# | # Подсети с другими доступными узлами, для которых клиент является маршрутизатором: | ||
AllowedIPs = 172.16.1.0/24, 172.16.2.0/24, 192.168.1.0/24 | AllowedIPs = 172.16.1.0/24, 172.16.2.0/24, 192.168.1.0/24 | ||
# | # Реальный IP-адрес сервера с номером порта: | ||
Endpoint = IP-адрес:51820 | Endpoint = IP-адрес:51820 | ||
</source> | </source> | ||
|} | |||
В конфиге сервера все клиенты должны быть указаны аналогичным образом — в качестве пиров. Да, серверу тоже нужны публичные ключи клиентов. | |||
Запуск, останов и мониторинг соединения возможны только от рута: | |||
< | <pre> | ||
# systemctl start|stop|restart wg-quick@wg0 | |||
# wg show | # wg show | ||
</ | </pre> | ||
= | =Запуск через NetworkManager из KDE= | ||
Принцип создания соединения аналогичен варианту для консоли: требуются те же данные, что и для конфиг-файла, но вводить их нужно в нескольких окнах. | |||
Запускаем приложение "Параметры системы KDE5": | |||
*Alt+F2, | |||
*во всплывшем окне начинаем набирать systemsettings5, | |||
*Enter на появившемся пункте. | |||
Выбираем в окне вкладку "Соединения" (группа "Сеть и связь"), "+" для создания нового. | |||
Во всплывшем окне: | |||
*прокручиваем до группы "VPN-соединения", | |||
*выбираем "WireGuard", | |||
*нажимаем "Создать". | |||
В окне "Новое соединение" вводим имя соединения (например, wg0 | В окне "Новое соединение" вводим имя соединения (например, wg0, соответственно названию интерфейса). | ||
Окно открывается на вкладке "Интерфейс WireGuard" | Окно открывается на вкладке "Интерфейс 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": | |||
*метод "Отключено" (если, конечно, не используете этот протокол). | |||
Вкладка "Основные параметры": | |||
*снять галку "Все пользователи могут подключаться к данной сети" (так как мы всё равно выбрали хранить пароль только для этого пользователя), | |||
*остальное оставить как есть. | |||
Жмем "Сохранить". Теперь соединение можно подключать и отключать из иконки сетевых соединений в системном лотке. | |||
Чтобы увидеть результат настроек в едином конфиг-файле, можно использовать команду (замените wg0 на имя вашего соединения): | |||
<pre># wg showconf wg0</pre> | |||
Соединение должно быть активно. | |||
=Обратная связь= | =Обратная связь= | ||
*[https://t.me/gbIMoBou @gbIMoBou] | *[https://t.me/gbIMoBou @gbIMoBou] |
Текущая версия от 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
Соединение должно быть активно.