Проблема
При настройке сети, в том же proxmox может возникнуть ситуация, когда теряется доступность сервера и это может быть большой головной болью, если у вас нет возможности подойти физически к серверу и исправить.
Идея
Обойтись небольшим скриптом, который бы проверял через какое-то время изменения в конфигурации интерфейсов сети и в случае изменения пробовал проверить доступность сети. В случае если сеть после изменений оставалась работоспособной, то создавал бэкап конфига, в случае если сеть падала, ресторил бы из последнего удачного конфига.
Решенение
Создадим файл и сделаем исполняемым
cd $HOME && touch ./check_network.sh && chmod +x ./check_network.sh
И добавим следующий код, в котором нам необходимо изменить SERVER_IP на свой публичный внешний адрес, по нему будет проверяться работоспособность сети и OLDTIME который отвечает сколько секунд после изменения файла конфига мы ничего не проверяем. Так как мы будем это вешать на планировщик, на каждую минуту, то есть смысла выставлять значения только наверное больше 2 минут — то-есть значения 120
#/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 строке и РЕСТОРИМ конфиг
На этом все, теперь можно протестировать и закинуть в крон с повторениями на каждую минуту