Куда отправить пакет, ядро решает по таблице маршрутов: в каждой её строке — сеть и путь к ней.
Маршрут — строка таблицы: сеть назначения и путь к ней. Таблицу печатает ip route. У клиента из опыта в ней одна строка:
Её ядро добавило само, когда lab0 получил адрес 192.0.2.10/24: своя подсеть доступна напрямую.
| Поле | Что значит |
|---|---|
192.0.2.0/24 |
сеть назначения |
dev lab0 |
интерфейс, через который отправлять |
proto kernel scope link |
строку добавило ядро, сеть подключена напрямую |
src 192.0.2.10 |
свой адрес, с которого отправлять |
Для 198.51.100.20 подходящей строки нет, поэтому ping получает отказ сразу.
Сеть за соседом описывает маршрут со шлюзом — ближайшим узлом, которому пакет передают дальше. Шлюз стоит после слова via:
Шлюз должен быть соседом, из подключённой подсети. Шлюз из чужой подсети ip route add не примет: Error: Nexthop has invalid gateway.
В таблице клиента есть такая строка. Куда клиент отправит пакет для 203.0.113.5?
203.0.113.0/24 via 192.0.2.1 dev lab0
-
Для чужой подсети маршрут и нужен: эта строка ведёт всю
203.0.113.0/24через шлюз. Решение ядра покажетip route get 203.0.113.5. -
viaзначит: пакет передают шлюзу192.0.2.1, дальше его доставляет он. Напрямую уходят пакеты своей подсети — у таких строкviaнет.
Адрес после via — шлюз, которому передают пакет, а после dev — интерфейс, через который он уходит. 203.0.113.5 входит в 203.0.113.0/24, поэтому строка подходит.
Главное в шаге
-
Маршрут — строка таблицы: сеть назначения и путь к ней; таблицу печатает
ip route. -
Маршрут к подсети своего адреса ядро добавляет само —
proto kernel scope link. -
После
viaстоит шлюз — сосед, которому передают пакет для сети за ним.