Я понимаю, что Linux выбирает наиболее конкретный маршрут к месту назначения, когда это произойдет выбор маршрута. Но как насчет метрики маршрута? Имеет ли он более высокий приоритет, чем специфика маршрута?
Также приветствуется ссылка на подробности алгоритма выбора маршрутизации, используемого Linux.
Метрика маршрутов предназначена для установки предпочтения среди маршрутов с одинаковой специфичностью. Это верно для маршрутизации в целом (например, Cisco, Windows и т. Д.). Итак, модель работает так:
Обратите внимание, что есть и другие вещи, которые могут происходить в таком маршрутизация на основе политик это позволяет вам выполнять такие действия, как маршрутизация на основе исходного IP-адреса. Но специфика маршрута, административное расстояние и метрика - вот что я считаю главными тремя вещами.
* Это называется совпадением по самому длинному префиксу, потому что подсеть в двоичном формате (например, / 24) выглядит как 11111111.11111111.11111111.00000000
. Таким образом, маршрутизатор может просто сканировать префикс на предмет двоичных единиц и останавливаться, как только он достигает нуля, а затем он соответствует префиксу.
Linux предоставляет ряд инструментов для гибкого выбора маршрутизации.
В простейшем случае есть только одна таблица маршрутизации ядра и нет маршрутов с атрибутом SRC. Эта таблица содержит количество маршрутов, которые были размещены туда вручную (ip route add
), с помощью демона DHCP или демонов маршрутизации. В этом случае ядро выбирает:
Обратите внимание, что метрика ядра (отображается ip route show
) выбирается демоном маршрутизации и не обязательно связана с метрикой какого-либо конкретного протокола маршрутизации. Например, Quagga использует одну и ту же метрику для всех маршрутов, устанавливаемых в ядре, независимо от метрики протокола.
Linux также поддерживает маршруты с атрибутом SRC, который сопоставляет пакеты только с заданным адресом источника. SRC работает только для IPv6 и до недавнего времени был ошибочным (3.11, если не изменяет память); Я не рекомендую использовать его, если вы не знаете, что делаете.
Если вам нужна большая гибкость, чем предусмотрено выше, вам нужно будет поиграть с несколькими таблицами маршрутизации и написать правила, чтобы выбрать одну конкретную таблицу маршрутизации для каждого пакета. Распространенным методом является отправка по адресу источника, чтобы имитировать маршруты, зависящие от источника. Другой метод - запускать каждый демон маршрутизации в своей собственной таблице маршрутизации и моделировать «административное расстояние» Cisco. Все это подробно описано в Глава 4 LARTC.