Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Сделать генерацию конфигов Wireguard для участников #589

Open
2 of 3 tasks
jekhor opened this issue Dec 18, 2022 · 13 comments
Open
2 of 3 tasks

Comments

@jekhor
Copy link
Member

jekhor commented Dec 18, 2022

Есть идея перевести VPN для доступа в сеть ХС с OpenVPN на WireGuard.
Для этого нужно решение по генерации конфигов, поскольку WG рассчитано на уникальность ключей и IP-адресов для каждого клиента. У каждого участника может быть несколько устройств, с которых он захочет иметь доступ в ХС, в том числе одновременно.

Возможный вариант:
В профиле пользователя есть список имеющихся конфигураций, пустой по дефолту. Рядом ссылка на инструкцию по настройке клиента под Windows/Linux/Mac.
Кнопка "Создать конфигурацию WG", по нажатию на неё:

  1. Генерируется пара закрытый-открытый ключ клиента.
  2. Выделяется IP адрес из пула и помечается в базе как выделенный (либо храним базу адресов, либо просто инкрементируемое поле с последним использованным адресом).
  3. Эти данные сохраняются в базу, пользователю показывается, что в список конфигураций добавилась новая.
  4. Закрытый ключ клиента и настройки IP-адреса сохраняются в базе для дальнейшего использования на VPN-сервере.
  5. VPN-сервер уведомляется об изменении конфигурации и экспортирует конфиг себе (либо делает это по крону раз в 10 минут).
  6. По нажатию на ссылку "скачать конфигурацию" генерируется клиентский конфиг, содержащий: открытый ключ сервера, закрытый ключ клиента, адрес сервера, настройки IP маршрутизации, keepalive.
  7. Пользователь скачивает конфиг, устанавливает его и запускает VPN.

VPN-сервер:
По крону обновляет конфигурацию клиентов с сайта. При этом сайт отдаёт конфиги только активных юзеров. Сервер синхронизирует локальную базу с базой сайта, добавляя-удаляя-редактируя записи у себя.

Открытые вопросы для обсуждения:

  • разрешать ли default route (доступ в интернет через ХС) или только доступ в сеть ХС? Если да, то опционально (галочка в свойствах конфигурации) или по дефолту?

  • можно ли с WG сделать, чтобы работал mDNS/Bonjour (доступ по именам устройств вида freddy.local)?
    Ответ: Можно, но нужно ставить mdns рефлектор на VPN сервере. В теории возможна маршрутизация multicast пакетов, но на практике сложна в настройке (нужна корректировка TTL и всё такое).

  • можно ли WG интерфейс сервера объединить в мост с ETH-интерфейсом, смотрящим в сеть ХС, и раздать клиентам IP из той же подсети, что и внутри ХС? И надо ли? Тогда не надо настраивать ничего на маршрутизаторе, зато усложняет настройку VPN-сервера. Сейчас OpenVPN сервер как раз работает в режиме ethernet-моста, клиент получает IP-адрес от основного DHCP-сервера ХС.
    Ответ: Можно использовать методику proxy arp, но на практике не нужно, проще раздать маршруты через DHCP и редиректить пакеты, всё равно пришедшие на default gateway, но адресованные узлам-клиентам WG, на собственно маршрутизаторе.

@abitrolly
Copy link
Member

WG рассчитано на уникальность ключей и IP-адресов для каждого клиента

Ты хочешь сказать, что никакого DHCP и каждый входящий клиент прибит гвоздями к внутренней сети?

@abitrolly
Copy link
Member

А нельзя при добавлении SSH ключа VPN ключ генерить и ложить туда же в репу?

https://www.bjornjohansen.com/encrypt-file-using-ssh-key

@abitrolly
Copy link
Member

можно ли с WG сделать, чтобы работал mDNS/Bonjour (доступ по именам устройств вида freddy.local)?

А почему нельзя? Я думал будет обратная проблема, что при подключении VPN устройства в моей локалке станут недоступны, как и доступ к инету. Я не уверен как маршрутизация работает в этом случае.

@abitrolly
Copy link
Member

можно ли WG интерфейс сервера объединить в мост с ETH-интерфейсом, смотрящим в сеть ХС, и раздать клиентам IP из той же подсети, что и внутри ХС?

А разве VPN не предполагает раздачу IP из подсети, в которую клиент коннектится?

@abitrolly
Copy link
Member

В МалиноХС проблема с WG была в том, что роутер надо было перепрошивать, все боялись это делать (и пугали меня). :D

@jekhor
Copy link
Member Author

jekhor commented Dec 18, 2022

Ты хочешь сказать, что никакого DHCP и каждый входящий клиент прибит гвоздями к внутренней сети?

Именно так, это WG, детка.

@jekhor
Copy link
Member Author

jekhor commented Dec 18, 2022

А нельзя при добавлении SSH ключа VPN ключ генерить и ложить туда же в репу?

А если у человека 2-3 устройства? Два компа и телефон?

@jekhor
Copy link
Member Author

jekhor commented Dec 18, 2022

В МалиноХС проблема с WG была в том, что роутер надо было перепрошивать, все боялись это делать (и пугали меня). :D

Я в ЗХС сто раз так делал :)

@jekhor
Copy link
Member Author

jekhor commented Dec 18, 2022

А разве VPN не предполагает раздачу IP из подсети, в которую клиент коннектится?

Предполагает, но подсеть по дефолту локальная для VPN-сервера, как ты там дальше разруливаешь — другой вопрос.

@jekhor
Copy link
Member Author

jekhor commented Dec 18, 2022

А почему нельзя? Я думал будет обратная проблема, что при подключении VPN устройства в моей локалке станут недоступны, как и доступ к инету. Я не уверен как маршрутизация работает в этом случае.

Потому что мультикаст по дефолту проходить не будет. Но это решаемо, судя по гуглу.

@jekhor
Copy link
Member Author

jekhor commented Dec 18, 2022

Бридж wg<->eth можно организовать с использованием parprouted, который будет пересылать ARP запросы-ответы, править таблицы роутинга (добавляя роуты на хост, для которого появилась запись в ARP-таблице): https://wiki.debian.org/BridgeNetworkConnectionsProxyArp . Обычный бридж не поднимешь, потому что WG работает на уровне IP-протокола, а не на MAC-уровне.

Но учитывая то, что адреса в WG всё равно должны быть выданы статически, это практически не даёт преимущества по сравнению с маршрутизацией отдельной подсети, зато усложняет конфигурацию и отладку VPN-сервера.

@abitrolly
Copy link
Member

А нельзя при добавлении SSH ключа VPN ключ генерить и ложить туда же в репу?

А если у человека 2-3 устройства? Два компа и телефон?

В блокчейне.. :D есть возможность несколько ключей доступа генерить из одного мастер ключа. Не уверен, правда, что они одним приватником открываются. Надо спрашать.

Но да, добавлять SSH доступ на GitHub для какого-нибудь RPi я бы не стал. Для таких случаев нужен пул айпишников. По линуксовому - префикс с числом ключей к имени ключа добавлять. :D

jekhor added a commit that referenced this issue Dec 26, 2022
Add generation and storing of per-user sets of WireGuard configs. User
can generate needed number of configurations for every device.

Task: #589
@jekhor
Copy link
Member Author

jekhor commented Dec 26, 2022

Генерация конфигов сделана, остался экспорт для сервера.

jekhor added a commit that referenced this issue Dec 26, 2022
Add generation and storing of per-user sets of WireGuard configs. User
can generate needed number of configurations for every device.

To generate keys, 'wg' binary should be installed and accessible by PATH
at the webserver.

Task: #589
jekhor added a commit that referenced this issue Dec 27, 2022
Add generation and storing of per-user sets of WireGuard configs. User
can generate needed number of configurations for every device.

To generate keys, 'wg' binary should be installed and accessible by PATH
at the webserver.

Task: #589
jekhor added a commit that referenced this issue Dec 27, 2022
Add generation and storing of per-user sets of WireGuard configs. User
can generate needed number of configurations for every device.

To generate keys, 'wg' binary should be installed and accessible by PATH
at the webserver.

Task: #589
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants