Запуск скрипта при активации сетевого интерфейса в Centos 7.5


Сразу определяемся, что мы рассматриваем вариант настройки сетевой подсистемы для сервера, без использования Network Manager. В серверных конфигурациях сетевых интерфейсов параметр NM_CONTROLLED установлен в NO. Например файл /etc/sysconfig/network-scripts/ifcfg-eth0 отвечающий за настройку сетевого интерфейса eth0, в моем случае выглядит следующим образом:

DEVICE=eth0
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Ethernet
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
NAME="System eth0"
BOOTPROTO=none
IPADDR=80.211.64.250
NETMASK=255.255.255.0
GATEWAY=80.211.64.1
DNS1=62.149.128.4
DNS2=62.149.132.4

В Centos все скрипты обслуживания сетевой подсистемы находятся в каталоге /etc/sysconfig/network-scripts/ и если вы посмотрите содержимое файла ifup-post, то увидите в нем следующую конструкцию:

if [ -x /sbin/ifup-local ]; then
    /sbin/ifup-local ${DEVICE}
fi

Что интересно, файла /sbin/ifup-local в системе по умолчанию нет и нам потребуется его создать:

# touch /sbin/ifup-local
# chmod +x /sbin/ifup-local

Как вы видите, скрипту передается один параметр, имя сетевого интерфейса и я первым делом в качестве эксперимента проверю работоспособность создать фэйковый ifup-local:

#!/bin/sh

echo $1 >> /tmp/startup.log

exit 0

После перезапуска сервера файл /tmp/startup.log содержит записи:

lo
eth0

Я думаю, что теперь вам понятно как действовать дальше. Мы добавим в этот скрипт обработчик который будет проверять с каким параметром его вызвали и определив, что прошла настройка интерфейса eth0 запустит наш скрипт Firewall.

Например, вот так:

#!/bin/sh

if [[ "$1" == "eth0" ]]
    then
        exec /etc/firewall/firewall.sh
    fi

exit 0

Как видите, все довольно просто, но по сравнению с Ubuntu Server есть один меленький нюанс на который необходимо обратить внимание:

Вы не можете из этого скрипта управлять другими сервисами SystemD

Если вы попытаетесь перезапустить Fail2Ban из вашего скрипта Firewall, то сервер зависнет на этапе загрузки.