Маршрутизация -- на самом деле плохопонимаемая вещь.
К примеру, она выполняется не только на маршрутизаторах, но и на компьютерах. На каждом, который подключен к сети и имеет IP-адрес.
Если компьютер не подключен к сети, то у него маршрутов нет (хотя и это не совсем так, но упростим задачу).
Если мы подключили компьютер к сети, и назначили ему IP-адрес (без всяких там адресов шлюза), то кроме IP-адреса на компьютере поднимается маршрут для сети этого адреса, который направлен не на шлюз, а в интерфейс.
И если до этого попытка отправить пинг заканчивалась неудачей (просто потому что маршрута не было), то теперь сначала будет отправляться arp запрос, и только потом когда не вернется ответа -- будет неудача.
Продемонстрирую.
Сначала выключу сетевой интерфейс
ifdown eth0
посмотрим интерфейсы
ip a
посмотрим маршруты
ip ro
-- пусто
Отредактирую файл /etc/network/interfaces (я работаю в Астре, также будет в убунте или дебиане, но и то не всегда)
nano /etc/network/interfaces
Оставлю только address, закомментирую gateway.
Сохраняю.
Делаю ifup eth0
Еще раз смотрю адрес
ip a
Вижу что адрес появился
Теперь смотрю маршрут
ip ro
Он тоже появился
Это означает, что теперь понятно, куда отправлять arp запрос, если местоназначения пакета принадлежит сети 192.168.200.0/24
Откуда взялся адрес сети?
Был вычеслен из поля address, у нас же указан IP-адрес и маска, адрес побитово помножен на маску, вот и адрес сети.
Теперь раскомментируем gateway - адрес шлюза
Остановим сеть и снова запустим интерфейс
Посмотрим еще на выдачу route -n
Как только мы добавили 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
Настроим компьютеры
Компьютер слева
Компьютер справа
Теперь настроим роутер.
Мы не будем настраивать маршруты с помощью ip ro, только зададим интерфейсы, попутно подглядывая в таблицу маршрутизации
Переходим в enable
en
Смотрим таблицу маршрутизации
sh ip ro
Сначала она пустая
Перейдем в режим конфигурирования
conf t
Настроим интерфейс fa0/0
int fa0/0
ip addr 10.0.0.1 255.255.255.0
no shut
Видим, линки поднялись, лампочки загорелись зеленым в левой сети.
Проверим таблицу маршрутов.
Автоматически появился маршрут.
Теперь настроим правый интерфейс fa1/0
Линк поднялся.
Посмотрим маршруты
Проверим пинг
Почему так работает?
На левом компьютере срабатывает запись default gateway
Роутер входит в две сети и знает их. Он ведет себя точно также как и компьютер -- отправит arp запрос на тот адрес шлюза, в который должен уйти пакет, выяснит мак адрес, и подставит его в поле место назначения Ethernet-кадра.
Правый компьютер получил пакет и шлет ответ.
У него также срабатывает запись default gateway и пакет приходит на роутер.
Роутер знает обе сети, и точно также отправит левому компьютеру.
Теперь рассмотрим ситуацию, когда вместо компьютеров роутеры.
Но нам важно обеспечить их связность без магических маршрутов по умолчанию.
Заменим компьютеры на роутеры.
Настроим интерфейсы и сразу посмотрим как изменилась таблица маршрутизации.
Аналогично поступим с правым роутером
Пробуем отправить пинг с левого роутера на средний
Хорошо.
Пробуем правый роутер пингануть.
Ни один ответ не пришел
Почему так?
Разберемся
Включаем симуляцию
Далее отключим все фильтры
Нажмем на Edit Filters
Укажем ICMP и закроем окошко
Далее видим, что в фильтрах есть ICMP
Открываем левый роутер, запускаем пинг.
Видим сформировавшийся пакет.
И нажимаем на Play
Но наш пакет никуда не уходит
Почему?
А потому что в нашей таблице маршрутов нет подходящего для 100.100.0.2
Нужно добавить
ip 100.100.0.0 255.255.255.0 10.0.0.1
обратите внимание, что 10.0.0.1 уже должен пинговаться, мы это проверили, чуть ранее.
Включим real time, перейдем в CLI роутера, добавим маршрут и посмотрим таблицу
Обратите внимание, что теперь кроме directly connected маршрута, который появляется при настройке сетевого интерфейса, появился еще и static маршрут, заданный нами.
Переходим в simulation, запускаем пинг и смотрим
Пакет доходит до правого роутера
Но ответ мы не получаем
Почему?
Потому что у правого роутера тоже нет маршрута
Зайдем на него.
Проверим маршрут, добавим
ip ro 10.0.0.0 255.255.255.0 100.100.0.1
также внимательно смотрим адрес шлюза -- это должен быть уже достижимый для нас роутер на L2 уровне.
Добавили, и видим, что в таблице появился статический маршрут.
Заходим на левый роутер и делаем пинг
Ответ прекрасно доходит. А как это в симуляции, посмотрите сами.
И обратите внимание -- на среднем роутере в данном случае настраивать статические маршруты не понадобилось.
Подписывайтесь на мой канал в дзен https://dzen.ru/olinux и будете в курсе новых моих статей по компьютерным сетям и ОС GNU/Linux.
Всегда с вами, Сергей Кручинин преподаватель GNU/Linux и компьютерных сетей