Содержание статьи
Краткий ликбез по EIGRP
EIGRP — это протокол динамической маршрутизации, по классификации относящийся к дистанционно‑векторным протоколам (Distance Vector) внутреннего шлюза (IGP). Ниже — схема строения EIGRP.
Каждый пакет EIGRP содержит 20-байтовый заголовок со следующими полями.
- Version — версия протокола никогда не изменялась и имеет значение 2.
- Opcode (Operation Code) — поле, определяющее тип пакета. Нам интересны только два значения этого поля: 1 и 5. Значение 5 определяет Hello-пакет, а значение 1 — Update-пакет. Про типы пакетов поговорим чуть позже.
- Сhecksum — контрольная сумма.
- Flags — это поле принимает всего четыре значения: 0x1, 0x2, 0x4 и 0x8. Нам будут интересны только первое и последнее значения.
- Sequence Number (SEQ) и Acknowledgment Number (ACK) — это порядковый номер пакета и номер подтверждения соответственно (прямо как в TCP и UDP). Эти поля обеспечивают надежную доставку EIGRP-пакетов.
- Virtual Router ID — виртуальный идентификатор роутера.
- Autonomous System Number — номер автономной системы (AS), в которой работает маршрутизатор.
За этим заголовком следует TLV (Type, Length, Value) — грубо говоря, это второй заголовок переменного значения, который может содержать информацию о маршрутах, параметрах роутера, версии прошивки, аутентификации и так далее. Это похоже на строение DHCP, где после IP-заголовка следует DHCP, а за ним — заголовок BOOTP.
Теперь поговорим про сообщения EIGRP. В процессе маршрутизации EIGRP оперирует следующими типами пакетов (сообщениями):
- Hello. Сообщения приветствия отправляются на мультикастовый адрес 224.0.0.10 и имеют код операции (opcode) равный 5. По умолчанию интервал отправки Hello-пакетов составляет 5 секунд.
- Update. При помощи Update-пакетов маршрутизаторы сообщают друг другу информацию обо всех известных им сетях (при первичном установлении соседства), информацию о конкретных сетях, в случае перестроения маршрута до них или когда сеть назначения больше не доступна. Такие сообщения могут отправляться как на юникастовый, так и на мультикастовый адреса. В теле Update-пакета содержится следующая информация: адрес сети назначения, префикс маски сети, адрес следующего перехода, количество переходов, пропускная способность, задержка, надежность, загрузка и MTU. Получение Update-пакета подтверждается отправкой ACK.
- ACK. Этот тип сообщения отправляется как ответ на успешное получение всех остальных типов сообщений, кроме Hello. В поле ACK заголовка EIGRP записывается числовое значение: берется поле SEQ того сообщения, на которое отправляется подтверждение, и прибавляется единица.
info
И в сообщении Hello, и в сообщении ACK поле opcode
всегда равно 5. Что это значит? Получается, что, к примеру, в ответ на сообщение Update отправляется, по сути, Hello-пакет? Отчасти да, но это не совсем так. Ненулевое значение поля ACK превращает сообщение Hello в сообщение ACK. Таким образом, несмотря на одинаковое значение поля opcode, сообщения отличает значение поля ACK.
Также EIGRP оперирует еще несколькими сообщениями: Query, Reply, SIA-Query и SIA-Reply. Но они нам неинтересны, поэтому пропускаем их.
Перед тем как мы будем устанавливать соседство, перечислю необходимые для него условия:
- параметры аутентификации должны быть одинаковыми (при наличии самой аутентификации);
- значения K-коэффициентов также должны быть одинаковыми;
- маршрутизаторы должны находиться в одной автономной системе (AS).
По умолчанию Hello- и Dead-интервалы составляют 5 и 15 секунд соответственно. В отличие от OSPF эти интервалы не обязаны совпадать на маршрутизаторах для установления соседства. Но мы установим идентичные значения таймеров.
Графический интерфейс. Узнаём необходимые параметры маршрутизатора
Как ты уже понял, писать код я буду на Python. Для формирования сетевых пакетов нам понадобится библиотека Scapy. Связка из Scapy и Python проста, удобна и практична.
По ходу дела нам не придется искать роутер, поддерживающий EIGRP, или настраивать виртуальный. Достаточно иметь доступ к сети с доменом EIGRP.
Прежде чем искать маршрутизаторы EIGRP и устанавливать с ними соседство, хочу показать интерактивный графический интерфейс своего скрипта.
Для установления соседства на маршрутизаторах должны совпадать несколько параметров, к тому же для отправки EIGRP-пакетов конкретному роутеру нам нужно знать его канальный и сетевой адреса. Поэтому не хотелось бы высматривать трафик в Wireshark и искать параметры маршрутизатора, с которым мы захотим «подружиться». Будет куда удобнее просто запустить прослушивание и захват пакетов EIGRP, а затем записать параметры (IP-адрес, MAC-адрес, номер AS, Hold-таймер и значения K-коэффициентов) в удобные для нас переменные, чтобы дальше ими оперировать при крафтинге пакетов.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»