В Linux какая метрика имеет маршрут без метрики?

11

Если у вас есть (в Linux) эти два маршрута:

default via 192.168.1.1 dev enp58s0f1
default via 192.168.16.1 dev wlp59s0  proto static  metric 600

Я ожидаю, что используется первый, но это не так: вместо него используется второй.

Если я изменю это на это:

default via 192.168.1.1 dev enp58s0f1  proto static  metric 100 
default via 192.168.16.1 dev wlp59s0  proto static  metric 600

Тогда это работает как ожидалось. Кажется, что «нет метрики» является худшей (более высокой) метрикой, чем любое число, вместо метрики 0.

Что это происходит? Это специфично для Linux или сетевого стандарта?

Заранее спасибо.

rsuarez
источник

Ответы:

6

Вы уверены в своем первом наблюдении? Что делает ip route showили route -nпоказывает тогда? Изменится ли результат, если вы добавите proto staticв первом случае?

Я нашел по крайней мере два ресурса, в которых явно указано, что 0это значение по умолчанию в Linux:

  • http://0pointer.de/lennart/projects/ifmetric/ : метрикой по умолчанию для маршрута в ядре Linux является 0, что означает наивысший приоритет.
  • http://www.man7.org/linux/man-pages/man8/route.8.html : если этот параметр не указан, для метрики семейства адресов inet6 (IPv6) по умолчанию используется значение «1», для inet (IPv4) по умолчанию он равен 0. (затем намекает, что по умолчанию может отличаться при использовании, iproute2но анализ этих источников не показывает, что это такое)

Хакер ядра Linux наверняка понадобится, чтобы разобраться с этим.

Кроме того, независимо от того, какое значение выбрано по умолчанию, явно зависит от ОС. В этой статье ( https://support.microsoft.com/en-us/help/299540/an-explanation-of-the-automatic-metric-feature-for-ipv4-routes ), например, показано, что Windows выбирает метрику по умолчанию на основе пропускной способности ссылки.

Патрик Мевзек
источник
Я отмечаю ваш ответ как правильный, потому что я больше не видел такого поведения на моем компьютере. Я обвиняю это в некоторых странных вещах, происходящих на настольных компьютерах с Ubuntu, по крайней мере с версией, которая была у меня на момент вопроса. Я не видел, чтобы это происходило в нескольких других коробках под управлением Ubuntu LTS. Итак, X-файл (эта ссылка слишком старая в настоящее время?). Спасибо за Ваш ответ!
rsuarez
6

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

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

Если ip routeметрика вообще не отображается, вы можете подтвердить, что это действительно 0, используя более старую route -nкоманду из пакета net-tools или cat /proc/net/route. Однако эти выходные данные не обязательно совпадают с тем, что демон маршрутизации будет использовать внутри, когда он встречает значение метрики 0.

Кроме того, как вы создаете маршрут тоже имеет значение. ip routeиспользует API-интерфейс netlink, а routeioctl. Код для создания метрик по умолчанию между двумя подходами приводит к различным значениям метрики. Например: создание маршрута IPv6 по умолчанию через ip routeприведет к значению метрики 1024 на RHEL 7, в то время как создание того же маршрута через routeприведет к метрике 1.

Из RedHat :

  • если ничего не передано команде route в качестве метрики маршрута, значение 1 используется самой командой.
  • Если в качестве метрики маршрута в команду ip ничего не передается, атрибут вообще не создается, и ядро ​​воспринимает его как 0, что позже переводится как 1024 по умолчанию.
noobish
источник