LINUXTALKS.CO

Конфигуратор сетей Wireguard

 , ,

L


0

1

Искал – не нашёл. Не нашёл простого скрипта, который бы давал готовые конфиги для Wireguard. Что-то похожее на просторах интернета есть, но всё не то.

И так, у меня задача следующего плана.

Есть одна VDS, которая смотрит в интернеты, а ещё есть куча сервисов, пользователей, виртуальных машин и железа за глубоким NAT’ом, и чтобы всю эту мишуру объединить в одну локалку, надо использовать Wireguard.

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

Но мне почему-то этого показалось мало. Я хочу иметь несколько разных сетевых интерфейсов Wireguard, чтобы у каждой была своя подсетка под конкретные задачи, чтобы пользователи могли видеть (или не видеть) друг друга. Одна для реальных пользователей, другая для виртуальных машин, третья для сетевых сервисов и прочих тестов. В общем, чтобы было где разгуляться.

И вот такого вот конфигуратора, который запилит мне несколько интерфейсов wg, с разными подсетями, я не нашёл. Поэтому сделал такой сам.

>>> https://github.com/spfng/wg-mass

Простой скрипт, на входе принимает два ключевых параметра:

  • Список подсетей через пробел: 10.10.0 10.20.0 10.30.0
  • Список IP-адресов через пробел: 1 2 3 4 5

На выходе выплёвывает конфиги для всех трёх подсеток, которые будут висеть на разных сетевых интерфейсах (wg1 wg2 wg3) и клиенты у всех трёх будут IP-адреса заканчивающиеся на 1, 2, 3, 4 и 5.

Всё просто.

Вот с какими параметрами можно запустить скрипт:

# env \
      WG_DIRECTORY="/etc/wireguard"
      WG_NETWORK="10.10.0 10.20.0 10.30.0" \
      WG_ADDRESS="$(seq 1 50)" \
      WG_SERVER_HOST="$(curl ifconfig.me/ip)" \
      ./wg-mass.sh

WG_DIRECTORY – рабочая директория, по-умолчанию mktemp -d, можно вручную задать сразу /etc/wireguard.

WG_NETWORK – список подсетей через пробел для создания конфигураций.

WG_ADDRESS – список IP-адресов через пробел, все эти клиенты будут созданы на всех указанных подсетях.

WG_SERVER_HOST – установить имя хоста сервера, можно сразу IP-адрес сервера или задать что-то своё. По-умолчанию выполняется hostname -f из расчёта на то, что у вас порядок в системе.

WG_SERVER_PORT – задаёт номер порта, на котором будет работать Wireguard. Когда подсетей, а значит и сетевых интерфейсов создаётся несколько, то выполняется инкремент +1 к номеру порта.

В результате выполнения команды выше, будет создана конфигурация для трёх сетевых интерфейсов:

  • wg1 (10.10.0.1/24) с клиентами, чьи IP-адреса имеют пространство от 2 до 50.

  • wg2 (10.20.0.1/24) с клиентами, чьи IP-адреса имеют пространство от 2 до 50.

  • wg3 (10.30.0.1/24) с клиентами, чьи IP-адреса имеют пространство от 2 до 50.

Итого 150 клиентов на трёх разных подсетях на трёх разных интерфейсах!

Первый IP-адрес всегда становится сервером, но это не обязательно именно 10.0.0.1/24, т.е. если в начале списка IP-адресов указать 254, то сервер будет иметь адрес 10.0.0.254/24, а всё что дальше по списку– это уже будут клиенты.

Ещё один момент, что я хочу создать сперва 3 подсетки по 50 клиентов, а потом хочу создать ещё 3 подсетки на 10 клиентов, т.е. чтобы конфигурация не перезаписывалась, а инкремент продолжался, сделана опция WG_CONFIG_COUNT_FROM. То есть, в данном случае у нас уже сделано 3 подсетки, теперь добавим ещё три.

# env \
      WG_DIRECTORY="/etc/wireguard"
      WG_NETWORK="10.40.0 10.50.0 10.60.0" \
      WG_ADDRESS="1 2 3 4 5 6 7 8 9 10" \
      WG_SERVER_HOST="$(curl ifconfig.me/ip)" \
      WG_CONFIG_COUNT_FROM="3" \
      ./wg-mass.sh

И теперь будут добавлены ещё три подсети, но дополнительные, далее по списку:

  • wg4 (10.40.0.1/24) с клиентами, чьи IP-адреса имеют пространство от 2 до 10.

  • wg5 (10.50.0.1/24) с клиентами, чьи IP-адреса имеют пространство от 2 до 10.

  • wg6 (10.60.0.1/24) с клиентами, чьи IP-адреса имеют пространство от 2 до 10.

Может вам это вообще нафиг всё не нужно и вам нужен просто тупо конфиг по-быстрому развернуть для мобилы и ноутбука. Да не вопрос.

# env \
      WG_DIRECTORY="/etc/wireguard" \
      WG_NETWORK="192.168.1" \
      WG_ADDRESS="1 2 3" \
      WG_SERVER_HOST="$(curl ifconfig.me/ip)" \
     ./wg-mass.sh

# systemctl enable --now wg-quick@wg1

# qrencode -t ansiutf8 < /etc/wireguard/client-192-168-1-3.conf

192.168.1.1/24 это будет сервер (/etc/wireguard/wg1.conf)

192.168.1.2/24 это будет ноутбук (/etc/wireguard/client-192-168-1-2.conf)

192.168.1.3/24 это будет мобильник (/etc/wireguard/client-192-168-1-3.conf)

Всего одной командой создали конфигурацию, активировали и командой qrencode получили QR-код для приложения на смартфоне.

Вот так вот.

★★★★★★

Проверено: Zadoff386 ()

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

Но всё равно молодец, зачёт

Kaschenko    
★★★★★
Android / Yandex
Ответ на: комментарий от Kaschenko

спасибо за положительный отзыв

тот, кто об этом заморачиваться будет, в любом случае сам разберётся

ну вот я и заморочился, вот я и поделился решением.

мне твой комментарий напомнил такую ситуацию, когда ты ищешь решение своей проблемы через гугл, находишь форум образца нулевых, где как раз была создана тема по твоей проблеме, открываешь её, начинаешь читать, а там вторым сообщением же ответ: загугли)))

то есть, вы должны понимать, что условные «мы» как раз и занимаемся наполнением форумов контентом, а не «тот кому надо сам разобрался». вот.

по поводу сабжа.

он выполняет свою задачу, но не идеален, на выходных запилю новую версию, назову её как-нибудь по-другому.

во-первых формат, генерировать конфиги сразу это неудобно. потому что потом с ними неудобно работать, если понадобится. планирую генерировать comma-separated value (.csv) файлики. построчные блоки разделённые запятыми легко парсятся башем.

во-вторых, нужно добавить IPv6, но сперва нужно разобраться как он устроен. я уже загуглил что fdXX:: это полностью свободная подсеть для личного использования, как 10.0.0.0/8 например. генерировать адреса нужно на её основе. и по феншую генерировать адреса нужно не тяп-ляп рандомом, а специально их просчитывать. я займусь изучением вопроса.

в третьих, мне не нравится код, ну лютый треш, надо короче по красоте сделать ежжи.

ждите вторую версию. переименованную. идея для названия приветствуется.

Spoofing    
★★★★★★
Windows / Firefox

Нескромный вопрос: а зачем ты так с env делаешь? А не простыми аргументами?

И вообще, лучше бы из конфига это всё читалось(как вариант)

Многострочный запуск неудобен(например, при копипасте)

serg002    
★★
Последнее исправление: serg002 (всего исправлений: 1)

Linux / Firefox
Ответ на: комментарий от serg002

скрипт сам по себе небольшой, я помню как писал парсерсы аргументов, это отдельная история, хоть шелл и даёт нативный getopt, но внутренний перфекционист не хочет ограничиваться только им.

моей целью было написать скрипт по-быстренькому, а когда вставал вопрос что надо передать какой-то аргумент, писать парсер аргументов я просто не хотел и использовал то, что доступно под рукой из коробки – глобальные переменные прилетающие из «вне».

Spoofing    
★★★★★★
Windows / Firefox
Ответ на: комментарий от Spoofing

Так нельзя писать даже маленькие скрипты

serg002    
★★
Linux / Firefox

Есть одна VDS, которая смотрит в интернеты, а ещё есть куча сервисов, пользователей, виртуальных машин и железа за глубоким NAT’ом, и чтобы всю эту мишуру объединить в одну локалку, надо использовать Wireguard.

Не надо. Но если заняться нечем, то флаг в руки. WG годится максимум для персонального туннеля либо VPN на 5-10 устройств.

Meyer    
★★★★★★
Последнее исправление: Meyer (всего исправлений: 1)

Ubuntu / Firefox (RU)
Ограничение на отправку комментариев: только для зарегистрированных пользователей, score>=90