Найти тему
Кручинин.Linux

Маршрутизация

Маршрутизация -- на самом деле плохопонимаемая вещь.

К примеру, она выполняется не только на маршрутизаторах, но и на компьютерах. На каждом, который подключен к сети и имеет IP-адрес.

Если компьютер не подключен к сети, то у него маршрутов нет (хотя и это не совсем так, но упростим задачу).

Если мы подключили компьютер к сети, и назначили ему IP-адрес (без всяких там адресов шлюза), то кроме IP-адреса на компьютере поднимается маршрут для сети этого адреса, который направлен не на шлюз, а в интерфейс.

И если до этого попытка отправить пинг заканчивалась неудачей (просто потому что маршрута не было), то теперь сначала будет отправляться arp запрос, и только потом когда не вернется ответа -- будет неудача.

Продемонстрирую.

Сначала выключу сетевой интерфейс

ifdown eth0

посмотрим интерфейсы

ip a

посмотрим маршруты

ip ro

-- пусто

Отредактирую файл /etc/network/interfaces (я работаю в Астре, также будет в убунте или дебиане, но и то не всегда)

nano /etc/network/interfaces

-2

Оставлю только address, закомментирую gateway.

Сохраняю.

Делаю ifup eth0

Еще раз смотрю адрес

ip a

Вижу что адрес появился

Теперь смотрю маршрут

ip ro

Он тоже появился

-3

Это означает, что теперь понятно, куда отправлять arp запрос, если местоназначения пакета принадлежит сети 192.168.200.0/24

Откуда взялся адрес сети?

Был вычеслен из поля address, у нас же указан IP-адрес и маска, адрес побитово помножен на маску, вот и адрес сети.

Теперь раскомментируем gateway - адрес шлюза

-4

Остановим сеть и снова запустим интерфейс

-5

Посмотрим еще на выдачу route -n

-6

Как только мы добавили gateway -- шлюз по умолчанию, у нас появился второй маршрут.

Таким образом, когда мы пытаемся отправить сообщение куда-то, происходит поиск по таблице маршрутизации. У нас две записи в таблице, одна с маской /24 (255.255.255.0) вторая с маской /0 (0.0.0.0)

Сначала проверяется более длинная маска.

К примеру, я хочу отправить пинг на 192.168.200.4

Смотрим 192.168.200.4 умножим на маску 255.255.255.0 побитово, получим 192.168.200.0. Есть такая сеть с такой маской? Есть

Куда она ведет? В интерфейс eth0.

Это означает что для этого адреса будем запрашивать MAC-адрес, делать ARP-запрос.

А если это адрес 192.168.2.8?

Алгоритм тот же.

192.168.2.8 умножим на маску 255.255.255.0 побитово, получим 192.168.2.0. Есть такая сеть с такой маской? Нет.

Смотрим следующую запись.

Следующая, более короткая маска 0.

Умножим 192.168.2.0 на 0.0.0.0. Получим 0.0.0.0

Есть сеть с такой маской? Есть

Это и есть дефолт гейтвей. И указан адрес шлюза. Вот для него и будем спрашивать arp-запрос.

Итак, с компьютером разобрались.

Рассмотрим случай, когда два компьютера в разных сетях, но подключены через один маршрутизатор.

Нужно ли настраивать маршруты, или нет?

Построим схему в CPT

-7

Настроим компьютеры

Компьютер слева

-8

Компьютер справа

-9

Теперь настроим роутер.

Мы не будем настраивать маршруты с помощью ip ro, только зададим интерфейсы, попутно подглядывая в таблицу маршрутизации

Переходим в enable

en

Смотрим таблицу маршрутизации

sh ip ro

Сначала она пустая

-10

Перейдем в режим конфигурирования

conf t

Настроим интерфейс fa0/0

int fa0/0

ip addr 10.0.0.1 255.255.255.0

no shut

-11

Видим, линки поднялись, лампочки загорелись зеленым в левой сети.

Проверим таблицу маршрутов.

-12

Автоматически появился маршрут.

Теперь настроим правый интерфейс fa1/0

-13

Линк поднялся.

Посмотрим маршруты

-14

Проверим пинг

-15

Почему так работает?

На левом компьютере срабатывает запись default gateway

Роутер входит в две сети и знает их. Он ведет себя точно также как и компьютер -- отправит arp запрос на тот адрес шлюза, в который должен уйти пакет, выяснит мак адрес, и подставит его в поле место назначения Ethernet-кадра.

Правый компьютер получил пакет и шлет ответ.

У него также срабатывает запись default gateway и пакет приходит на роутер.

Роутер знает обе сети, и точно также отправит левому компьютеру.

Теперь рассмотрим ситуацию, когда вместо компьютеров роутеры.

Но нам важно обеспечить их связность без магических маршрутов по умолчанию.

Заменим компьютеры на роутеры.

-16

Настроим интерфейсы и сразу посмотрим как изменилась таблица маршрутизации.

-17

Аналогично поступим с правым роутером

-18

Пробуем отправить пинг с левого роутера на средний

-19

Хорошо.

Пробуем правый роутер пингануть.

Ни один ответ не пришел

-20

Почему так?
Разберемся

Включаем симуляцию

-21

Далее отключим все фильтры

-22

Нажмем на Edit Filters

-23

Укажем ICMP и закроем окошко

-24

Далее видим, что в фильтрах есть ICMP

Открываем левый роутер, запускаем пинг.

Видим сформировавшийся пакет.

И нажимаем на Play

-25

Но наш пакет никуда не уходит

-26

Почему?

А потому что в нашей таблице маршрутов нет подходящего для 100.100.0.2

Нужно добавить

ip 100.100.0.0 255.255.255.0 10.0.0.1

обратите внимание, что 10.0.0.1 уже должен пинговаться, мы это проверили, чуть ранее.

Включим real time, перейдем в CLI роутера, добавим маршрут и посмотрим таблицу

-27

Обратите внимание, что теперь кроме directly connected маршрута, который появляется при настройке сетевого интерфейса, появился еще и static маршрут, заданный нами.

Переходим в simulation, запускаем пинг и смотрим

-28

Пакет доходит до правого роутера

Но ответ мы не получаем

-29

Почему?

Потому что у правого роутера тоже нет маршрута

Зайдем на него.

Проверим маршрут, добавим

ip ro 10.0.0.0 255.255.255.0 100.100.0.1

также внимательно смотрим адрес шлюза -- это должен быть уже достижимый для нас роутер на L2 уровне.

-30

Добавили, и видим, что в таблице появился статический маршрут.

Заходим на левый роутер и делаем пинг

-31

Ответ прекрасно доходит. А как это в симуляции, посмотрите сами.

И обратите внимание -- на среднем роутере в данном случае настраивать статические маршруты не понадобилось.

Подписывайтесь на мой канал в дзен https://dzen.ru/olinux и будете в курсе новых моих статей по компьютерным сетям и ОС GNU/Linux.
Всегда с вами, Сергей Кручинин преподаватель GNU/Linux и компьютерных сетей

-32