WireGuard: различия между версиями
Дым (обсуждение | вклад) |
|||
Строка 93: | Строка 93: | ||
Таким образом, адреса клиентов туннеля становятся видны клиентам локалки по имени. | Таким образом, адреса клиентов туннеля становятся видны клиентам локалки по имени. | ||
=== Настройка и запуск клиента из консоли (требуется root) === | |||
Если еще не создана пара частный-публичный ключ, ее нужно создать с помощью утилиты wg: | |||
<source lang="bash"> | |||
$ wg genkey > privatekey | |||
$ wg pubkey < privatekey > publickey | |||
</source> | |||
Теперь файл privatekey в текущей папке содержит частный ключ, а файл publickey -- публичный ключ. | |||
Требуется установить wg-quick, создать папку /etc/wireguard и конфигурационный файл /etc/wireguard/wg0.conf. Имя конфигурационного файла будет именем поднятого интерфейса. В данном случае -- wg0. | |||
<source lang="bash"> | |||
# apt-get install wireguard-tools-wg-quick | |||
# mkdir /etc/wireguard | |||
# nano /etc/wireguard/wg0.conf | |||
# chmod -R 600 /etc/wireguard | |||
</source> | |||
Конфигурационный файл должен иметь следующее содержание: | |||
<source> | |||
[Interface] | |||
PrivateKey = частный ключ клиента | |||
#IP-адрес клиента в формате ip-addr/netmask | |||
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 | |||
# Отсылать пакеты серверу каждые 30 секунд, чтобы постоянно поддерживать соединение | |||
PersistentKeepalive = 30 | |||
</source> | |||
В конфигурационном файле на сервере все клиенты должны быть указаны аналогичным образом (в качестве пиров). Для сервера требуется публичный ключ клиента. | |||
Запускать интерфейс нужно от рута: | |||
<source lang="bash"> | |||
# systemctl start wg-quick@wg0 | |||
</source> | |||
Останавливать, соответственно, командой: | |||
<source lang="bash"> | |||
# systemctl stop wg-quick@wg0 | |||
</source> | |||
Отслеживать работу можно командой: | |||
<source lang="bash"> | |||
# wg show | |||
</source> | |||
=Мониторинг= | =Мониторинг= |
Версия от 15:05, 5 января 2023
Запускать ваергарда в связке с systemd-networkd под Альтом проще, чем во многих других дистрибутивах.
Сервер
Всего пара файлов:
/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 # Первый адрес — сам клиент, второй — его внутренняя сеть.
/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
.
Таким образом, адреса клиентов туннеля становятся видны клиентам локалки по имени.
Настройка и запуск клиента из консоли (требуется root)
Если еще не создана пара частный-публичный ключ, ее нужно создать с помощью утилиты wg:
$ wg genkey > privatekey
$ wg pubkey < privatekey > publickey
Теперь файл privatekey в текущей папке содержит частный ключ, а файл publickey -- публичный ключ.
Требуется установить wg-quick, создать папку /etc/wireguard и конфигурационный файл /etc/wireguard/wg0.conf. Имя конфигурационного файла будет именем поднятого интерфейса. В данном случае -- wg0.
# apt-get install wireguard-tools-wg-quick
# mkdir /etc/wireguard
# nano /etc/wireguard/wg0.conf
# chmod -R 600 /etc/wireguard
Конфигурационный файл должен иметь следующее содержание:
[Interface]
PrivateKey = частный ключ клиента
#IP-адрес клиента в формате ip-addr/netmask
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
# Отсылать пакеты серверу каждые 30 секунд, чтобы постоянно поддерживать соединение
PersistentKeepalive = 30
В конфигурационном файле на сервере все клиенты должны быть указаны аналогичным образом (в качестве пиров). Для сервера требуется публичный ключ клиента.
Запускать интерфейс нужно от рута:
# systemctl start wg-quick@wg0
Останавливать, соответственно, командой:
# systemctl stop wg-quick@wg0
Отслеживать работу можно командой:
# wg show
Мониторинг
Для журналирования активности ядрёного модуля достаточно создать [на «железе» / в виртуалке] либо на [хост-системе / всех узлах кластера контейнеризации] с ваергардом юнит /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
.