Bash script on startup to set the default network route

Потребность возникает, когда у Вас на сервере несколько сетевых интерфейсов (network interfaces). В моём случае, это виртуальная машина (virtual machine) VMWare, у которой есть сетевые интерфейсы (network interfaces) как локальной (local), так и глобальной (global) сетей (networks). Если ничего дополнительно не настраивать, то я подозреваю, что выбор маршрута по умолчанию (default route) происходит исходя из того, какой сетевой интерфейс (network interface) быстрее инициализировался. Например, у меня глобальный интерфейс (global interface): iface ens192 inet dhcp, а локальный интерфейс (local interface): iface ens224 inet static, и каждый раз при загрузке интерфейс (interface) со статическим (static) IP-адресом (IP address), очевидно, инициализируется быстрее.

Для того, чтобы не терять наш сервер (server) в глобальной сети (global network), мы напишем bash-скрипт (bash script) автозапуска (startup), чтобы вручную определить на каком сетевом интерфейсе (network interface) будет маршрут по умолчанию (default gateway).

На наше счастье, что в Linux, а в частности в Debian, уже давно всё продумано и реализовано — нам только необходимо подёргать за нужные ниточки. В данном случае, HOOK SCRIPTS для сетевых интерфейсов (network interfaces).

Итак, идём в папку /etc/network/if-up.d и создаём там файл ens192-default-interface — наш будущий bash-скрипт (bash script) автозапуска (startup) для сетевых интерфейсов (network interfaces). Делаем его сразу исполняемым, чтобы потом не забыть sudo chmod +x /etc/network/if-up.d/ens192-default-interface. Если у Вас нет команды sudo — это Ваши проблемы, можете просто её проигнорировать и не использовать. 😉

Открываем наш файл и пишем следующее:

#!/bin/sh

# Restart the global interface
ifdown ens192
ifup ens192
sleep 1

# Check the default route is exist
if ! ip route show default | grep -q ‘default via’; then

  # Add a new default route via global interface
  ip route add default via xxx.xxx.xxx.xxx

  exit 0

fi

# Get the current default route record
default_route=$(ip route show default | awk ‘{print $3}’)

# Check if the defualt route via the local interface
if ! [ «$default_route» = «xxx.xxx.xxx.xxx» ]; then

  # Remove the default route
  ip route delete default

  # Add a new default route on ens192, via the global interface
  ip route add default via xxx.xxx.xxx.xxx

fi

xxx.xxx.xxx.xxx — это внешний (external) IP-адрес (IP address) нашего глобального интерфейса (global interface).

Ну всё, перезагружаемся (restart) и проверяем, что маршрут по умолчанию (default gateway) навешен на глобальный интерфейс (global interface).

Обсуждение закрыто.