Почему `ip` и `ifconfig` ведут себя по-разному, когда интерфейс не работает?

Почему `ip` и `ifconfig` ведут себя по-разному, когда интерфейс не работает?

Сначала я выключил интерфейсы

# Shutdown the interfaces
ip link set enp2s0f0 down
ip link set enp2s0f1 down

С использованием ifconfig:

# Set subnets to interfaces
ifconfig enp2s0f0 10.0.0.1/24
ifconfig enp2s0f1 10.0.1.1/24

# Add two routes
ip route add 10.11.1.1 dev enp2s0f0
ip route add 10.11.0.1 dev enp2s0f1

# Result => NO PROBLEM, my routes are here even tho the interfaces are down
$ip route
10.0.0.0/24 dev enp2s0f0 proto kernel scope link src 10.0.0.1 
10.0.1.0/24 dev enp2s0f1 proto kernel scope link src 10.0.1.1 
10.11.0.1 dev enp2s0f1 scope link 
10.11.1.1 dev enp2s0f0 scope link 

С использованием ip:

# Set subnets to interfaces
ip addr add 10.0.0.1/24 dev enp2s0f0
ip addr add 10.0.1.1/24 dev enp2s0f1

$ip route
#NOTHING => Where are the routes?!

# Add two routes
ip route add 10.11.1.1 dev enp2s0f0
ip route add 10.11.0.1 dev enp2s0f1

$ip route
#NOTHING => Where are my routes?!

ip link set enp2s0f0 up
ip link set enp2s0f1 up

# Result => WOW only two routes appeared miraculously
$ip route
10.0.0.0/24 dev enp2s0f0 proto kernel scope link src 10.0.0.1 
10.0.1.0/24 dev enp2s0f1 proto kernel scope link src 10.0.1.1 
# => Where are my 10.11.*.* routes?
  1. Почему не отображаются ip routeмои маршруты?
  2. Куда чудесным образом добавляются мои маршруты после того, как я поднимаю свои интерфейсы? Почему я не могу видеть их раньше?
  3. Почему мои маршруты не отображаются после включения интерфейсов?

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

Я думал ifconfigи ipбыл совместим, переход с ifconfig на ip не будет таким уж простым.

решение1

Все три ваших вопроса проистекают из одного недопонимания:

ifconfigс интерфейсом и адресом подразумевается upвозможность, поэтому в вашем ifconfigпримере интерфейс появляется в тот же момент, когда вы указываете для него адрес.

Это означает

ifconfig enp2s0f0 10.0.0.1/24
ifconfig enp2s0f1 10.0.1.1/24

на самом деле это сокращение от

ifconfig enp2s0f0 10.0.0.1/24 up
ifconfig enp2s0f1 10.0.1.1/24 up

ipотiproute2более четко организует действия:

  • приносяинтерфейсвверх и вниз ( ip link),
  • назначение IPадреск сетевому устройству ( ip address), и
  • настройка ядрамаршрутизациятаблицы ( ip route).

ifconfigсмешивает эти разрозненные концепции, что, возможно, еще больше запутывает или делает менее интуитивным.


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

Вот некоторые инструменты, входящие в состав распространенных дистрибутивов Linux:

  • Дебиан –есливверхвниз( /etc/network/interfaces, /etc/network/interfaces.d/)
  • Убунту –netplan.io( /etc/netplan/)
  • Red Hat Enterprise Linux/CentOS –ifcfg( /etc/sysconfig/network-scripts/)
  • обычно дистрибутивы с окружением рабочего стола –Сетевой менеджер( /etc/NetworkManager/)

Для полноты картины приведем ответы на ваши вопросы:

  1. Почему не отображаются ip routeмои маршруты?

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

  1. Куда чудесным образом добавляются мои маршруты после того, как я поднимаю свои интерфейсы? Почему я не могу видеть их раньше?

Маршруты устройства не регистрируются в таблице маршрутизации, если интерфейс неисправен.

  1. Почему мои маршруты не отображаются после включения интерфейсов?

Маршруты не были добавлены, поскольку соответствующие интерфейсы должны были быть сначала включены. Вы должны были увидеть сообщение об ошибке типа RTNETLINK answers: Network is downили Error: Device for nexthop is not up., если попытка добавления маршрута была предпринята на выключенном интерфейсе. Код возврата ( $?) также должен был быть ненулевым.

Я хочу настроить все маршруты, прежде чем подниму интерфейсы.

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

Интересно, какие сюрпризы нас ждут дальше.

Надеюсь, что нет. ipРазделение интересов имеет большой смысл, если выузнай это.

Я думал ifconfigи ipбыл совместим

Эти две команды частично совпадают, но не являются взаимозаменяемыми.

Связанный контент