Обычно в таблице есть маршрут для всех адресов сразу, и всё же ядро выбирает самый точный.
Маршрут по умолчанию подходит любому адресу: это префикс /0, в таблице он пишется словом default. Через него машина выходит во все сети, для которых нет своей строки.
Если адресу подходят несколько строк, ядро берёт ту, у которой префикс длиннее: /32 точнее /24, а /24 точнее /0. Поэтому default срабатывает, только когда другие строки не подошли.
Метрика — число metric N в конце строки. Она решает между маршрутами с одинаковым префиксом: меньшее число побеждает. Префикс длиннее выигрывает при любой метрике. Порядок строк в выводе ip route на выбор не влияет.
| Строка | Для 203.0.113.5 |
|---|---|
default via 192.0.2.254 metric 100 |
подходит, префикс /0 |
203.0.113.0/24 via 192.0.2.1 |
подходит, префикс /24 — выбрана |
Таблица клиента такая. Через какой шлюз уйдёт пакет для 198.51.100.20?
default via 192.0.2.254 dev lab0 metric 10
198.51.100.20 via 192.0.2.1 dev lab0 metric 500
-
Порядок строк в выводе на выбор не влияет. Решение ядра покажет
ip route get 198.51.100.20. -
Метрика решает только между строками с одинаковым префиксом. Здесь
/32против/0, и выигрывает более длинный префикс. -
Ядро выбирает одну строку: подходящую с самым длинным префиксом.
ip route get 198.51.100.20каждый раз напечатает один и тот же шлюз.
Обеим строкам адрес подходит, но /32 длиннее /0, поэтому выбрана строка через 192.0.2.1. Метрика сравнивается, только когда префиксы равны.
Главное в шаге
-
default— префикс/0, он подходит любому адресу. - Из подходящих строк ядро выбирает самый длинный префикс.
- Метрика решает только между маршрутами с одинаковым префиксом.