WireGuard: различия между версиями
Дым (обсуждение | вклад) |
Дым (обсуждение | вклад) |
||
Строка 200: | Строка 200: | ||
</pre> | </pre> | ||
=Настройка | =Настройка для пользователя KDE= | ||
<b>Для NetworkManager.</b> | <b>Для NetworkManager.</b> | ||
Версия от 06:41, 6 июля 2023
'
Настройка через systemd-networkd
Запускать ваергарда в связке с systemd-networkd под Альтом проще, чем во многих других дистрибутивах.
Сервер
Дальнейшее можно делать на любом лине (будь то железный комп, виртуалка или контейнер) вне зависимости от роли — сервер это, рабочая лошадка или гей-приставка.
Чтобы всё это управлялось не доп.утилитами, а непосредственно сервисом systemd-networkd
, данный сервис следует установить и запустить (см. статью), а пакеты etcnet
(касается только альта) — отодвинуть (см. ту же статью) либо снести:
# apt-get remove -y `rpm -qa --qf "%{NAME}\n" etcnet*`
Для начала...
- сгенерим ключик для сервера:
# wg genkey IA/6UzzmOWh2XceaQO3GfIsCOiuchlK4xTRhUo0ktFc=
- извлечём из него публичную часть и отправим админу сервера либо нашим клиентам, если сервер — мы:
# echo "IA/6UzzmOWh2XceaQO3GfIsCOiuchlK4xTRhUo0ktFc=" | wg pubkey s08w+USNyEP7h2rF9RCGxn4YoekLKGgIX9g2AV955FQ=
Теперь состряпаем пару файлов, где этими хэшами и воспользуемся:
/etc/systemd/network/wg.netdev |
---|
[NetDev]
Name = wg
Kind = wireguard
# Сервер
[WireGuard]
ListenPort = 51820
PrivateKey = IA/6UzzmOWh2XceaQO3GfIsCOiuchlK4xTRhUo0ktFc=
# Клиент, которых можно наплодить ощутимо больше одного
[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
|
Клиенты
Чтоб не мучиться с созданием конфига каждому сотруднику, нуждающемуся в доступе к локалке извне, накостылил скрипт (лежит в подкаталоге у сетевых интерфейсов, отсюда такие пути):
/etc/systemd/network/cfgen-wg |
---|
#!/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"
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=$(echo "`dir -1 *.conf | sort -V | sed 's|\..*||' | head -1`-1" | bc)
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/sendDocument \
-F "document=@$WD/$IP.$USR.conf" \
-F "reply_to_message_id=$Theme" \
-F "chat_id=$ChatID" 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
— таким образом, адреса клиентов туннеля становятся видны клиентам локалки по имени.
Готовый конфиг отправляется в соответствующую тему админского телеграм-чата.
Мониторинг
Для журналирования активности ядрёного модуля достаточно [на «железе» / в виртуалке] либо на [хост-системе / всех узлах кластера контейнеризации] с ваергардом создать юнит:
/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
.
Ниже — не моё.
Настройка для запуска через 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
Настройка для пользователя KDE
Для NetworkManager.
Принцип создания соединения аналогичен варианту для консоли: требуются те же данные, что и для конфиг-файла, но вводить их нужно в нескольких окнах.
Запускаем приложение "Параметры системы 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
Соединение должно быть активно.