Искал – не нашёл. Не нашёл простого скрипта, который бы давал готовые конфиги для 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-код для приложения на смартфоне.

Вот так вот. <<<

  • serg002
    link
    fedilink
    arrow-up
    0
    ·
    edit-2
    3 years ago

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

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

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

    • SpoofingOP
      link
      fedilink
      arrow-up
      0
      ·
      3 years ago

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

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

      • serg002
        link
        fedilink
        arrow-up
        0
        ·
        3 years ago

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