Сегодня изучим создание простейшего тоннеля.
Будет ли у нас сегодня свет в конце тоннеля? Запускайте Cisco Packet Tracer и мужайтесь -- статья очень длинная. Но зато, пока вы не разберетесь с тем, что такое тоннель и как он настраивается, я так просто вас из тоннеля не отпущу ;) поехали!
Зачем нужен тоннель? Ну, например, соединить два офиса.
В каждом из офисов приватная сеть. Нужно обеспечить связность этих приватных сетей. Как мы знаем, приватные адреса в интернете не маршрутизируются, и так просто задать маршрут не получится (хотя в Cisco Packet Tracer получится, а вот в жизни нет). Будем изучать, как это в жизни.
Сначала попробуем без тоннеля соединить два офиса
Построим в CPT простую схему. Сначала соединим два офиса без тоннеля. Просто считаем, что у нас есть достаточно длинный шнур и мы можем его проложить без риска, что кто-то его выдернет или украдет на цветмет. Ограничение на 100 метров тоже игнорируем, чтобы не вводить лишние сущности в виде оптоволокна).
Также, для простоты не будем строить имитацию каждой сети из компьютеров и коммутаторов, ограничимся роутером офиса и одним единственным компьютером - все это для каждой сети.
Для простоты я не указываю маски сетей. Используем маски стандартные классовые. По этой же причине (а еще чтобы не запутались вы) не используем /30.
Далее настраиваем роутеры
Для Router0
en
conf t
hostname router0
int gi0/0/0
ip addr 192.168.1.1 255.255.255.0
no shut
int gi0/0/1
ip addr 10.0.0.1 255.0.0.0
no shut
do wr
Для простоты я не указываю маски сетей. Используем маски стандартные классовые. По этой же причине (а еще чтобы не запутались вы) не используем /30.
Далее настраиваем роутеры
Для Router1
en
conf t
hostname router1
int gi0/0/0
ip addr 192.168.2.1 255.255.255.0
no shut
int gi0/0/1
ip addr 10.0.0.2 255.0.0.0
no shut
do ping 10.0.0.1
do wr
Обратите внимание, что перед сохранением с помощью do wr мы также проверили пинг do ping 10.0.0.1
Это важно, потому что, может, например вдруг мы не в тот интерфейс включили провод или не тому интерфейсу присвоили IP-адрес.
Теперь настроим лэптопы (была книжка Фигурнова давным давно, там это слово почему-то назвали лэптор и оно перекочевало и в другие всякие энциклопедии ;)
Laptop0
Laptop1
А если не хочется статически настраивать, можно настроить DCHP на роутере, у меня на эту тему есть отдельная статья: https://dzen.ru/a/ZegoS1XGFzahibu3
Настроить настроили, давайте проверим, что каждый "лэптор" пингует свой роутер. Так мы проверяем и правильность подключения и правильность сетевых настроек.
Laptop0
Laptop1
Но если мы попробуем с Laptop1 пинговать Laptop0 нас ждет ожидаемая проблема.
Чтобы пакеты доходили, нужно настроить маршрутизацию.
То есть роутеру Router 1 сказать, что сеть 192.168.1.0 находится за Router0 (то есть за 10.0.0.1)
А чтобы ответ мог вернуться, нужно Router0 сообщить, что сеть 192.168.2.0 находится за Router1 (то есть за 10.0.0.2)
Hастраиваем статическую машрутизацию
Подробнее о маршрутизации я написал статью: https://dzen.ru/a/Zfx2NbgccxBY1vX7
Итак на Router0
ip route 192.168.2.0 255.255.255.0 10.0.0.2
do sh ip ro
do wr
Обратите внимание, что перед сохранением мы посмотрели таблицу маршрутов. Если бы мы ошиблись, в некоторых случаях маршрут не поднялся бы (например, если адрес шлюза, через который мы указываем маршрут, был бы не доступен либо до него нельзя было сделать ARP запрос).
Настраиваем router1
ip route 192.168.1.0 255.255.255.0 10.0.0.1
do sh ip ro
do wr
Теперь проверяем работу.
Наши два офиса соединены прямым проводом и между приватными сетями имеется связность.
Пингунем с Laptop1 ноутбук Laptop0 и видим, что пинг есть*.
Можно включить режим симуляции, в фильтрах отключить все, добавить только ICMP и повторить пинг, чтобы увидеть движение пакета.
Вообще, когда изучаете сети в CPT, всегда рекомендую пользоваться симуляцией (только делайте это аккуратно, не постоянно. Запустили, посмотрели на движение одного пакета, снова перешли в реальное время. Иначе CPT упадет. И не забывайте сохраняться).
* И как раз в симуляции мы понимаем, что пинговали не другой ноутбук, а только роутер другой сети. Исправляемся.
Но в жизни такое не посмотришь.
Потому используем трассировку.
Кстати у меня есть подробная статья о том, Как трассировка работает https://dzen.ru/a/Zc5YZ8iXmxSMHb1p
В windows и его имитации в лэптопе на CPT трассировка выполняется командой tracert:
Теперь подготовим подключение через "Интернет"
Прежде всего, удалим прямое подключение.
Но этого мало.
Хотя интерфейсы выключены, на них все равно "висят" айпи адреса, и даже назначение новых адресов не спасет ситуацию. Напротив, старые адреса останутся, станут вторыми адресами, и потом ищи думай, где и почему не работает.
Всегда нужно удалять неиспользуемые настройки, не забывать про них.
На router0
int gi0/0/1
no ip addr 10.0.0.1 255.0.0.0
do sh run | sec int
do wr
Обратите внимание, с помощью do sh run | sec int мы смотрим настройки в running-config интерфейсов, и убеждаемся, что действительно, адрес 10.0.0.1 больше не присвоен ничему.
На router1
int gi0/0/1
no ip addr 10.0.0.2 255.0.0.0
do sh run | sec int
do wr
А вот маршруты мы НЕ удаляем. Они нам понадобятся. Но это исключение из правила. В реальной же жизни нужно было сделать no ip route .....
Теперь добавляем роутер, и подписываем будущие адреса.
Для сети, ведущей к Router0 возьмем 5.0.0.0. Часть адресов этой, скажем так, "сети" (на самом деле такие крупные сети уже давно не сети, а просто диапазоны) выделены компании Яндекс.
Пусть Router0 будет 5.0.0.5 а промежуточный Router2 5.0.0.2
Для сети, ведущей к Router1 возьмем 8.0.0.0. Часть адресов из этой "сети" (диапазона точнее) выделены компании Гугл.
Пусть Router1 будет 8.0.0.8, а промежуточный Router 8.0.0.2
Адреса же 10.0.0.1 и 10.0.0.2 мы со схемы никуда не удаляем. Пусть они пока ничему не присвоены мы потом их присвоим виртуальным - туннельным интерфейсам.
Ну а пока:
Настроим адрес на Router0
int gi0/0/1
ip addr 5.0.0.5 255.0.0.0
do sh ip int br
do wr
no shut не используем, так как уже ранее к этому интерфейсу применяли эту команду, зато проверяем, присвоен ли был этот адрес интерфейсу с помощью команды do sh ip int br.
Видим, что адрес присвоен, но протокол down, так как мало "включить" интерфейс, нужно чтобы и провод был подключен, и чтобы интерфейс был включен с другой стороны провода. Это попозже, а пока, не обращая внимания, что символ интерфейса горит красным цветом, настроим router1
На router1
int gi0/0/1
ip addr 8.0.0.8 255.0.0.0
do sh ip int br
do wr
Теперь настроим Router2
en
conf t
hostname router2
int gi0/0/0
ip addr 5.0.0.2 255.0.0.0
no shut
int gi0/0/1
ip addr 8.0.0.2 255.0.0.0
no shut
do ping 5.0.0.5
do ping 8.0.0.8
do sh ip int bt
do sh ip ro
Пингуем соседей, смотрим на интерфейсы и на маршруты (которые поднялись, как только были подняты интерфейсы, в статье "Маршрутизация" https://dzen.ru/a/Zfx2NbgccxBY1vX7 я об этом рассказывал).
Дальше у нас пока нет задачи обеспечить связность между компьютерами. Это мы сделаем настройкой тоннеля. Но нам важно, чтобы router0 и router1 могли пинговать друг друга. Пока они этого сделать не могут.
Почему? Потому что маршрутов нет.
Router0 должен знать, что сеть гугла (8.0.0.0) находится за router2.
А router1 должен знать, что сеть яндекса (5.0.0.0) находится... в данном случае тоже за router2.
На router0
ip route 8.0.0.0 255.0.0.0 5.0.0.2
Смотрите, не перепутайте где что мы указываем!
И сразу do sh ip ro
do wr
На router1
Пинг есть.
Теперь все готов к настройке тоннеля.
Настраиваем "Интернеты"
На схеме виртуальную линию мы нарисуем простой линией. К ней мы приурочем оставшиеся подписи туннельных интерфейсов.
Также, так как Router2 нас не интересует (в жизни там могло быть и 2 и 3 и более роутера), можно спрятать его в "облачко".
Для этого следует его выделить и нажать на значок "облачко+"
Итог будет выглядеть так
Но вообще я не рекомендую так делать.
Потому лучше сразу нажать на отмену.
А если уже потом опомнились, то нужно зайти в облачко. И мы увидим внутри этого "интернета" наш единственный роутер. Чтобы открепить его от облачка, нужно нажать на значок со стрелками
После чего нажать на роутер и выбрать Move to root
После чего можно нажать на стрелку "На уровень выше"
Облачко перекрыло роутер
Просто хватаем его мышкой и перетаскиваем. Также его можно удалить
Вот именно с такой схемой я и рекомендую тренироваться.
Но для удобства этой статьи я все-таки спрячу Router2 за облачком, чтобы подчеркнуть: мы настраиваем тоннель для работы через внешнюю сеть.
в режиме конфигурирования переходим в настройки виртуального тоннельного интерфейса
int tun0
в tunnel source мы указываем интерфейс, в который будут уходить "упакованные" IP-пакеты
tunnel source gi0/0/1
в tunnel destination мы указываем IP-адрес роутера, который выступает для нас сервером, который будет извлекать из "упакованного" IP-пакета завернутый в него пакет с туннельными IP-адресами
tunnel destination 8.0.0.8
обращаем внимание, что IP-адреса должны быть правильно указаны. Не наш адрес, не адрес промежуточного роутера. А адрес того роутера, на котором тоже настроен (или будет настроен тоннель)
Проверим интерфейсы и сразу сохраним
do sh ip int br
do wr
Настроим на Router1 тоннель
в режиме конфигурации
int tun0
ip addr 10.0.0.2 255.0.0.0
tunnel source gi0/0/1
tunnel destination 5.0.0.2
также посмотрим на сетевые интерфейсы
do sh ip int br
и на то как выглядит running-config
do sh run | sec in
обратите внимание на поле Mtu (о нем поговорим отдельно).
Сохраним do wr
Можно сразу было отфильтровать (только не tun0, как я сначала пытался, а Tun или полностью)
Проверяем туннель
Сначала просто пинг
В прошлый раз мы пинговали с Laptop1 на Laptop0, потому в этот раз с Laptop1 на Laptop0
Посмотрим трассировку.
Теперь самое время посмотреть, что происходит в трассировке.
Запускаем симуляцию, запускаем команду пинг, и нажимаем "Play"
Видим, как пакет движется по внешней сети.
Нам важно поймать его, пока он движется по "внешней сети".
Для этого по описанной выше схеме извлечем "роутер" из облака.
Кликаем на пакет, когда он обрабатывается на Router2
Получилось.
И хотя пакет успел уйти дальше, мы видим его таким, каким он был на промежуточном роутере.
Нажмем на Outbound PDU и чуть растянем окно.
Обратите внимание, что в пакетидущий от 5.0.0.5 на 8.0.0.8 вложен заголовок GRE в который вложен снова IP-пакет, уже идущий от 192.168.1.2 на 192.168.1.3
Более детально исследуя, вы также можете заметить, что после прохождения Router2 TTL внешнего пакета меняется, а внутреннего нет. Router2 не видим для внутреннего пакета, не видим его и в TTL.
А теперь ответ, почему MTU 1476
Для сравнения стандартный MTU 1500 (вывод ifconfig в linux)
Разница 24 байта. Заголовок IP имеет 20 байт (видно это и на картинке выше 5 32битных слов, в выводе симулятора занимающих одну строчку).
Заголовок GRE - еще одно 32 битное слово, или 4 байта. Вот и приходится дополнительно из полезной нагрузки фрейма еще и 24 байта вычитать.
Итак, с тоннелем на примере GRE мы разобрались.
Подписывайтесь на мой канал https://dzen.ru/olinux
и читайте заметки о неочевидных моментах в работе GNU/Linux и сетевых протоколов.
Всегда с вами,
Сергей Кручинин
преподаватель GNU/Linux и компьютерных сетей