Linux🐧
June 10, 2022

БЕЗОПАСНО НАСТРАИВАЕМ /ETC/NETWORK/INTERFACES

ПРОБЛЕМА

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

ИДЕЯ

Обойтись небольшим скриптом, который бы проверял через какое-то время изменения в конфигурации интерфейсов сети и в случае изменения пробовал проверить доступность сети. В случае если сеть после изменений оставалась работоспособной, то создавал бэкап конфига, в случае если сеть падала, ресторил бы из последнего удачного конфига.

РЕШЕНЕНИЕ

Создадим файл и сделаем исполняемым

cd $HOME && touch ./check_network.sh && chmod +x ./check_network.sh

И добавим следующий код, в котором нам необходимо изменить SERVER_IP на свой публичный внешний адрес, по нему будет проверяться работоспособность сети и OLDTIME который отвечает сколько секунд после изменения файла конфига мы ничего не проверяем. Так как мы будем это вешать на планировщик, на каждую минуту, то есть смысла выставлять значения только наверное больше 2 минут — то-есть значения 120

check_network.sh#/bin/bash

SERVER_IP=127.0.0.1
FILE=/etc/network/interfaces
BACKUP_FILE=$HOME/interfaces.backup
LAST_GOOD_UPDATE=0
OLDTIME=10

CURTIME=$(date +%s)
FILETIME=$(stat $FILE -c %Y)
TIMEDIFF=$(expr $CURTIME - $FILETIME)

if [ $FILETIME -gt $LAST_GOOD_UPDATE ]; then
    if [ $TIMEDIFF -gt $OLDTIME ]; then
        ping $SERVER_IP -c 5 2>&1 > /dev/null && RESULT=1 || RESULT=0
        if [ $RESULT -eq 1 ]; then
            echo -e '\033[1;32m'
            echo "The interface has been changed and after a while it works. We backup it"
            echo -e '\033[0m'
            sed -i "6s/LAST_GOOD_UPDATE=.*/LAST_GOOD_UPDATE=${FILETIME}/" ./check_network.sh
            cp $FILE $BACKUP_FILE
        else
            echo -e '\033[1;31m'
            echo "The interface has been changed and after a while it NOT works. We restore it"
            echo -e '\033[0m'
            cp $BACKUP_FILE $FILE
            FILETIME=$(stat $FILE -c %Y)
            sed -i "6s/LAST_GOOD_UPDATE=.*/LAST_GOOD_UPDATE=${FILETIME}/" ./check_network.sh
            systemctl restart networking.service
        fi
    fi
fi

Разберем по порядку:
:4 — путь до нашего конфига
:5 — путь до бэкапа конфига
:6 — таймштамп изменения конфига
:13 — проверяем есть ли изменения
:14 — выдержали ли мы паузу (задается в секундах строка :7)
:15 — пингуем сами себя через внешний публичный ip
:20-21 — сеть есть, обновляем время изменения конфига в 6 строке и БЭКАПИМ сам конфиг
:26-28 — сети нет, обновляем время изменения файла в 6 строке и РЕСТОРИМ конфиг

На этом все, теперь можно протестировать и закинуть в крон с повторениями на каждую минуту