Что в таблице
Каждая запись содержит:
- destination - подсеть-получатель (
10.0.0.0/24,0.0.0.0/0для default) - next hop - IP следующего роутера (
via X.X.X.X) или-если подсеть напрямую подключена - dev - через какой интерфейс отправлять
- metric - приоритет (меньше = лучше) при нескольких подходящих
- scope -
link(одна подсеть) илиglobal - proto - кто записал маршрут:
kernel,static,boot,ra(router advertisement),bgp,ospf,dhcp
Longest prefix match
Когда пакет уходит на 1.2.3.4, ядро ищет в таблице самую длинную
совпадающую подсеть. Например:
default via 192.168.1.1 dev eth0
10.0.0.0/8 via 192.168.1.254 dev eth0
10.42.0.0/16 via 10.42.0.1 dev wg0
8.8.8.8→ не попадает в10.x.x.x, идёт через default → 192.168.1.110.99.5.5→ попадает в/8(но не в/16) → 192.168.1.25410.42.7.7→ попадает в/8И в/16, но/16длиннее → wg0
Это правило универсально, BGP/OSPF не меняют: они только ВСТАВЛЯЮТ записи в таблицу, выбор делает kernel-FIB.
Default route
0.0.0.0/0 - «всё что не покрыто более специфичной записью». На
обычном хосте это обязательная запись для выхода в интернет.
Без default route:
$ ping 8.8.8.8
ping: connect: Network is unreachable
Где смотреть
ip route # вся таблица main
ip -4 route show # только IPv4
ip route get 1.2.3.4 # какой маршрут СЕЙЧАС выберется для 1.2.3.4
Помимо main есть ещё local (адреса самой машины) и default
(отдельные tables через ip rule для policy-routing).
Где это хранится в ядре
- RIB (Routing Information Base) - то что вводят протоколы и админ
- FIB (Forwarding Information Base) - оптимизированная для lookup структура (trie); именно по ней пакет маршрутизируется
Для большинства задач пользователю эта разница неважна.