WireGuard, выберите случайный конфигурационный файл

Вопрос или проблема

У меня есть около 20 конфигурационных файлов для WireGuard. Я бы хотел выбирать случайный файл конфигурации каждый раз, когда перезагружаю компьютер. (Перезапуск службы)

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

Таким образом, то, что я ищу:

Служба, которая выбирает случайную конфигурацию, но имя интерфейса всегда остается одинаковым, независимо от того, какая конфигурация используется.

Возможно, есть и другие способы, но самый простой, чтобы достичь того, что вам нужно, — это просто импортировать все файлы

for f in *.conf; do nmcli connection import type wireguard file "$f"; done

А затем ваше решение сводится к скрипту, который получает все имена соединений и выполняет nmcli connection up <conn_name> для случайного. Что-то вроде этого:

#!/bin/bash
output=$(nmcli connection show | grep wireguard)
nmcli connection up $(echo "$output" | shuf -n 1 | awk '{print $1}')

Теперь вы просто оборачиваете это в systemd service, что-то вроде

[Install]
WantedBy=default.target

[Service]
Type=oneshot
ExecStart=/path/to/script

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

Есть два способа, как это можно реализовать. Один — с помощью хуков NetworkManager. Например, у меня есть такой скрипт для подключения к офисной сети:

λ cat /etc/NetworkManager/dispatcher.d/10-baum-root-remount.sh
#!/bin/bash
if [[ "$CONNECTION_ID" =~ Baum ]]; then
  if [ $NM_DISPATCHER_ACTION = up ]; then
    mount -o remount,compress=zstd:10 /
  elif [ $NM_DISPATCHER_ACTION = down ]; then
    mount -o remount,compress=zstd:5 /
  fi
fi

Другой — вы можете сделать ваш скрипт службой с Type=simple, которая будет постоянно пинговать сеть и перезапускать ее, если соединение исчезло.

Ответ или решение

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

Шаг 1: Импорт конфигурационных файлов

Для начала необходимо импортировать все WireGuard конфигурационные файлы с помощью команды nmcli, чтобы они были доступны для подключения. Это можно сделать с помощью следующего скрипта:

#!/bin/bash
# Импорт всех конфигурационных файлов WireGuard
for f in /etc/wireguard/*.conf; do
    nmcli connection import type wireguard file "$f"
done

Не забудьте указать правильный путь до ваших конфигурационных файлов.

Шаг 2: Выбор случайного подключения

Следующий шаг — это создание скрипта, который будет выбирать случайное WireGuard подключение и активировать его:

#!/bin/bash
# Извлечение списка подключений WireGuard
output=$(nmcli connection show | grep wireguard)
# Выбор случайного подключения и его активация
nmcli connection up $(echo "$output" | shuf -n 1 | awk '{print $1}')

Шаг 3: Настройка Systemd службы

Создайте Systemd-скрипт для автоматического выполнения предыдущего скрипта при загрузке системы и перезапуске в случае потери соединения.

Файл /etc/systemd/system/wireguard-random.service должен содержать следующее:

[Unit]
Description=Случайное подключение WireGuard при старте

[Service]
Type=oneshot
ExecStart=/path/to/your/script.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target

Не забудьте заменить /path/to/your/script.sh на фактический путь к вашему скрипту.

Шаг 4: Обработка сбоя соединения

Чтобы повторно подключиться при потере соединения, можно использовать NetworkManager hooks или запустить службу ping-проверки:

Вариант 1: NetworkManager hooks

Создайте скрипт в /etc/NetworkManager/dispatcher.d/, который будет срабатывать при изменении состояния сети. Например:

#!/bin/bash
if [ "$NM_DISPATCHER_ACTION" == "down" ]; then
    systemctl restart wireguard-random.service
fi

Вариант 2: Пинг-проверка

Создайте службу типа simple, которая будет непрерывно проверять соединение и перезапускать его при обнаружении сбоя:

#!/bin/bash
while true; do
    ping -c 1 8.8.8.8 > /dev/null
    if [ $? -ne 0 ]; then
        systemctl restart wireguard-random.service
    fi
    sleep 60
done

Оптимизация для SEO и профессиональное оформление помогут вам наладить стабильный и безопасный процесс подключения WireGuard, обеспечивая надежность и устойчивость к сбоям соединений.

Оцените материал
Добавить комментарий

Капча загружается...