Переименовать сетевой интерфейс при загрузке в зависимости от того, что трафик, который он видит

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

Я также использую выразительные имена интерфейсов; вместо ethX у меня есть имена вроде intra или mgmt или someprovider , в зависимости от назначения интерфейса. Эти имена упоминаются в правилах межсетевого экрана и т. Д.

Я написал сценарий, который запускается при загрузке и определяет, какой интерфейс к чему подключен, а затем переименовывает их соответствующим образом. Я не доволен этим решением, потому что оно включает в себя множество настраиваемых сценариев; Если возможно, я бы хотел что-то более распространенное.

В настоящее время сценарий определяет сети следующими способами:

  • Он может временно настроить интерфейс с адресом и посмотреть, может ли он проверить связь или арпинг определенного пункта назначения (это работает для восходящих каналов - я пингую восходящий маршрутизатор).
  • Он может прослушивать интерфейс, используя tcpdump , чтобы увидеть, есть ли трафик с любого из ряда конкретных MAC-адресов, по крайней мере один из которых будет скорее всего, отправит что-нибудь в течение нескольких секунд. Я знаю, что это не надежно, но для меня этого достаточно. (Я использую что-то вроде timeout ... tcpdump -c 1 -i interfacename "(ether host foo) or (ether host bar) or ..." .) Это хорошо работает для внутренних сетей, где я не использую у меня нет ничего особенного для ping, но я могу ожидать почти постоянного трафика.
  • Он может настроить временный IP-адрес на интерфейсе и запустить nmap -sn -oG для диапазона IP-адресов, чтобы узнать, сколько хостов присутствуют и доступны из этого диапазона.Это полезная эвристика для некоторых внутренних сетей, в которых будет много хостов, но я не знаю наверняка, какие из них.

Я ищу способ предпочтительно интегрировать это с ifupdown . Я просмотрел сопоставления, но мне кажется, что с помощью сценария карты я могу выбрать только логическую конфигурацию для применения к физическому интерфейсу, но не переименовывать интерфейс. interfaces (5) говорит, что Строки, начинающиеся с «переименовать», используются для переименования интерфейсов. Он принимает один или несколько аргументов в форме «CUR = NEW», где CUR - это имя существующего интерфейса, а NEW - новое имя. Это становится очень эффективным в сочетании с сопоставлением с образцом для интерфейса CUR. ; однако сопоставление с образцом мне тоже не помогает.

Если бы можно было каким-то образом использовать результат сопоставления в операторе rename , это могло бы сработать.

Я также посмотрел на пакет whereami , но он не выглядел многообещающим.

Больше всего мне хотелось бы, чтобы ifupdown переименовали сетевой интерфейс на основе чего-то if -pre-up скрипт или вывод скрипта сопоставления.

1
задан 31 July 2019 в 22:59
1 ответ

Подумав об этом, я пришел к выводу, что могу сделать это с помощью pre-up скриптов, например:

iface intra inet static
    pre-up find-interface intra
    address ...

Сценарий find-interface затем творит чудеса, обнаруживая, какой интерфейс ethX (или enX или любой другой) должен быть intra , переименовывает его, и ifupdown берет его оттуда.

Я опубликовал свой find-interface скрипт на https://gist.github.com/akorn/7b96e78c7d1b3ca70e35261f9b1a2f2b на случай, если кто-то еще сочтет это полезным.

0
ответ дан 4 December 2019 в 02:48

Теги

Похожие вопросы