GRE (Generic Router Encapsulation) CISCO
Здравствуйте, коллеги! Сегодня мы будем рассматривать протокол GRE (Generic Router Encapsulation) на устройствах Cisco, а также основы его работы.
На сегодняшний день этот протокол используется реже, так как существует более эффективные протоколы, такие как IPsec. Одной из причин этого является наличие дополнительного заголовка в GRE, который уменьшает полезные данные, а также может вызывать проблемы с размером пакетов, особенно при передаче через MTU. В отличие от GRE, IPsec использует более компактные и безопасные заголовки, что позволяет передавать больше полезных данных через интерфейсы.
Использование GRE не предоставляет нам значительных преимуществ с точки зрения безопасности и производительности, особенно когда речь идет об защищенных соединениях. Однако он находит свое применение в некоторых случаях, например, при туннелировании трафика между маршрутизаторами, где шифрование не является необходимым.
Пример работы протокола GRE и его взаимодействие с IPsec:

Оригинальный пакет:
Ethernet → IP → ICMP
Транспортный режим:
Ethernet → IP → ESP → ICMP → ESP Trailer → ESP Authentication (зашифровано)
Туннельный режим:
Ethernet → новый IP → ESP → IP → ICMP → ESP Trailer → ESP Authentication (зашифровано)
IPsec over GRE (транспортный режим):
Ethernet → новый IP → ESP → GRE → IP → ICMP → ESP Trailer → ESP Authentication (зашифровано)
В этой части статьи мы рассмотрим практическую реализацию в лабораторной среде GNS3, где была построена небольшая сеть.
Как видно на схеме, у нас есть два офиса: главный и филиал. Мы настроили туннель через IP-адрес 172.20.20.0, по которому оба офиса соединены между собой с использованием GRE (Generic Routing Encapsulation). Это позволяет эффективно организовать защищенную связь между офисами через публичную сеть.

Настройки на маршрутизаторе главного офиса
Команда | Описание |
---|---|
Router1 (config)# int e0/1 | Переход на интерфейс Ethernet e0/1 маршрутизатора (интерфейс, подключенный к интернету). Это физический интерфейс, через который будет проходить интернет-трафик. |
Router1 (config)# ip address 209.165.201.1 255.255.255.0 | Установка IP-адреса для интерфейса e0/1. Адрес предоставляется провайдером и используется для внешней связи через интернет. |
Router2 (config)# ip address 209.165.201.2 255.255.255.0 | Установка IP-адреса для интерфейса маршрутизатора второго офиса. Адрес аналогичен для внешней связи, но принадлежит другому маршрутизатору. |
Router1 (config)# int Tunnel0 | Переход на конфигурацию виртуального интерфейса Tunnel0. Этот интерфейс используется для настройки GRE туннеля между двумя маршрутизаторами. |
Router1 (config)# tunnel mode gre ip | Установка режима работы интерфейса как GRE (Generic Routing Encapsulation), что позволяет инкапсулировать IP-пакеты в туннель для безопасной передачи. |
Router1 (config)# ip address 192.168.2.1 255.255.255.255 | Установка IP-адреса для туннельного интерфейса. Этот адрес уникален для туннеля и не должен перекрываться с другими IP-адресами в сети. |
Router1 (config)# tunnel source e0/1 | Указание интерфейса e0/1 в качестве источника для туннельного трафика. Это интерфейс с внешним подключением, через который туннель будет инициироваться. |
Router1 (config)# tunnel destination 209.165.201.2 | Указание публичного IP-адреса второго маршрутизатора, с которым устанавливается GRE туннель. Это внешний (белый) адрес маршрутизатора филиала. |
Настройки на маршрутизаторе филиала
Команда | Описание |
---|---|
Router2 (config)# int Tunnel0 | Переход на интерфейс Tunnel0 для настройки туннеля на маршрутизаторе филиала. |
Router2 (config)# tunnel mode gre ip | Установка режима туннеля как GRE (Generic Routing Encapsulation), для передачи данных через безопасный канал. |
Router2 (config)# ip address 192.168.2.2 255.255.255.0 | Установка уникального IP-адреса для туннельного интерфейса на маршрутизаторе филиала. Этот адрес также будет использоваться для маршрутизации трафика через туннель. |
Router2 (config)# tunnel source e0/1 | Указание интерфейса e0/1 как источника для туннельного трафика на маршрутизаторе филиала. Это интерфейс, через который маршрутизатор подключается к интернету. |
Router2 (config)# tunnel destination 209.165.201.1 | Указание публичного IP-адреса маршрутизатора главного офиса, с которым устанавливается GRE туннель. |
Router1 (config)# ip route 192.168.4.1 255.255.255.0 192.168.2.2 | Добавление статического маршрута на маршрутизаторе главного офиса, указывающего, что пакеты, предназначенные для сети филиала, должны направляться через туннель. |
Router2 (config)# show int Tunnel0 | Просмотр состояния туннельного интерфейса на маршрутизаторе филиала, чтобы убедиться, что туннель активен и передача данных возможна. |
Router2 (config)# show ip route | Просмотр маршрутов на маршрутизаторе филиала, чтобы подтвердить, что трафик для главного офиса правильно направляется через туннель. |
Примечания:
IP-адреса могут отличаться: В реальной сети IP-адреса, указанные для туннеля и интерфейсов, могут быть различными. Убедитесь, что настройки соответствуют вашей сети.
Статические маршруты: Обязательно добавьте статический маршрут на каждом маршрутизаторе, чтобы пакеты правильно маршрутизировались через туннель.
Проверка состояния: Используйте команды show int Tunnel0 и show ip route для диагностики и проверки работы туннеля. Это поможет удостовериться в правильности настройки и в том, что туннель активно передает трафик.

PC 1 (192.168.2.1) отправляет запрос (например, пинг ICMP) на PC 2 (192.168.2.2). Это стандартный пакет, который имеет исходный адрес 192.168.2.1 и целевой адрес 192.168.2.2.
На маршрутизаторе R1, который подключен к PC 1, этот исходный IP-пакет инкапсулируется в новый пакет с добавлением заголовка GRE. GRE (Generic Routing Encapsulation) — это протокол инкапсуляции, который позволяет передавать данные по туннелю. В результате, создается новый пакет, который будет включать:
Ethernet — канальный уровень.
Новый IP-адрес маршрутизатора R1 (например, 156.213.54.7) — внешний (публичный) IP-адрес маршрутизатора, через который трафик будет передаваться в интернет.
GRE — заголовок GRE, который инкапсулирует исходный пакет.
Оригинальный IP-пакет (с ICMP-запросом) — это исходный пакет от PC 1, который был инкапсулирован в GRE.
Инкапсулированный пакет теперь отправляется через интернет (обозначен как облако на схеме). Он передается через публичную сеть, используя внешний IP-адрес маршрутизатора R1 (156.213.54.7).
Пакет продолжает свой путь через интернет, не изменяя содержимого (все данные находятся в GRE-обертке), что позволяет безопасно передавать данные между сетями, даже через общедоступную сеть (интернет).
Таким образом, на этом этапе весь трафик между PC 1 и PC 2 передается через туннель, инкапсулированный в GRE, который позволяет передавать данные в рамках защищенной и виртуальной сети между двумя офисами через публичную сеть.

Распаковка пакета на маршрутизаторе R2:
После того как инкапсулированный пакет, отправленный R1, достигает маршрутизатора R2, процесс инкапсуляции происходит в обратном порядке.
Удаление GRE-заголовка:
На маршрутизаторе R2 происходит извлечение исходного пакета из GRE-обертки. В этом процессе удаляется GRE-заголовок, который был добавлен на R1. Теперь пакету возвращается его оригинальная форма, то есть IP-пакет с исходным адресом 192.168.2.1 и целевым адресом 192.168.2.2.
Обработка пакета маршрутизатором R2:
После удаления GRE-заголовка, R2 видит оригинальный IP-пакет с ICMP запросом (например, пинг), который был отправлен PC 1.
Этот пакет теперь передается дальше на PC 2 (192.168.2.2).
Отправка ICMP-пакета на PC 2:
PC 2 (192.168.2.2) получает ICMP-пакет, который теперь не содержит обертки GRE и готов к дальнейшей обработке.
Важные шаги в процессе:
GRE-заголовок удаляется только на маршрутизаторе R2, так как R2 извлекает оригинальный IP-пакет.
Пакет передается по туннелю без изменений через интернет (обозначенный облаком).
Когда пакет достигает R2, он извлекается из GRE-туннеля и отправляется непосредственно PC 2.


Ethernet — канальный уровень, который определяет физическое соединение для передачи данных.
Новый IP — это внешний IP-адрес, который используется для доставки пакета через интернет.
GRE — заголовок инкапсуляции, который добавляется для передачи пакета через туннель. Он необходим для того, чтобы маршрутизаторы могли обрабатывать данные как туннельные пакеты.
Заголовок доставки (Delivery header) — информация, которая используется для адресации и доставки пакета через сеть.
IP — оригинальный заголовок пакета, который был инкапсулирован в GRE-пакет, и содержит информацию о передаче данных.
ICMP — это полезная нагрузка (например, запрос на пинг), которая является исходными данными, инкапсулированными в пакет GRE.
47 — это номер протокола GRE в таблице IP-протоколов. Он указывает, что пакет инкапсулирован в GRE и что маршрутизаторы должны обрабатывать его как GRE-трафик, а не обычный IP-пакет. Этот номер помогает сетевым устройствам распознать и правильно обработать пакет, передаваемый через GRE туннель.
Команда | Описание | Когда использовать | Причина использования |
---|---|---|---|
Router (config)# int tunnel 0 | Переход на виртуальный туннельный интерфейс Tunnel0. Это позволяет настроить GRE туннель и работать с ним. | Используется всегда при настройке GRE туннеля для его активации. | Это первая команда, которая позволяет маршрутизатору работать с виртуальным туннельным интерфейсом, который используется для туннелирования данных через сеть. |
Router (config)# keepalive 10 | Включение функции отслеживания состояния туннельного интерфейса. Если соседний маршрутизатор не отвечает на «keepalive» пакеты, то интерфейс автоматически переводится в состояние down. | Когда необходимо отслеживать состояние туннеля и автоматически его отключать, если связь теряется. | Эта команда полезна для обеспечения стабильности соединения и автоматического отключения туннеля при потере связи с соседним маршрутизатором. Это важная функция для поддержания надежности соединения. |
Router (config)# ip tcp adjust-mss 1436 | Настройка опции MSS (Maximum Segment Size) для TCP SYN-пакетов, которые проходят через маршрутизатор. Эта команда изменяет максимальный размер сегмента для TCP-пакетов, передаваемых через туннель. | Используется, когда возникает проблема с фрагментацией пакетов или если туннель передает пакеты большего размера, чем поддерживает интерфейс. | Это необходимо, когда по сети передаются большие TCP пакеты, которые могут быть фрагментированы. Команда помогает избежать фрагментации, уменьшая размер пакетов до поддерживаемого. Это особенно важно для обеспечения надежной работы VPN и GRE туннелей, чтобы предотвратить потерю данных и проблемы с соединением. |
Когда и почему использовать эти команды:
int tunnel 0:
Когда: Нужно активировать и настроить виртуальный туннельный интерфейс GRE на маршрутизаторе.
Почему: Без этой команды маршрутизатор не будет знать, какой интерфейс использовать для туннелирования данных.
keepalive 10:
Когда: Нужно отслеживать активность соседнего маршрутизатора и автоматически отключать туннель, если связь теряется.
Почему: Это помогает поддерживать работоспособность сети, автоматически отключая туннель, если соседний маршрутизатор перестает отвечать.
ip tcp adjust-mss 1436:
Когда: Если возникают проблемы с фрагментацией пакетов через GRE туннель.
Почему: Эта команда уменьшает размер TCP пакетов, чтобы избежать их фрагментации на сетевых устройствах, что помогает сохранить стабильность соединения и уменьшить потерю данных.
Существует две основные версии GRE:
GRE Version 0:
Описание: Это стандартная версия GRE, используемая для инкапсуляции пакетов IP в GRE-туннеле. Она не поддерживает дополнительную функциональность, такую как аутентификация или шифрование, и используется для передачи любых IP-пакетов через туннель.
Использование: Подходит для простого туннелирования между двумя сетями.
GRE Version 1:
Описание: Эта версия добавляет поддержку новых возможностей, таких как аутентификация и контроль целостности данных. Однако она используется реже и имеет более ограниченное применение по сравнению с версией 0.
Использование: Используется в случаях, когда требуется дополнительная безопасность и контроль целостности.
В большинстве случаев используется GRE Version 0, так как она проще и достаточно функциональна для большинства задач по туннелированию.

Структура GRE версии 0
Основная структура:
Ethernet (Желтый блок):
Описание: Это канальный уровень, который используется для передачи данных по сети Ethernet. Он представляет собой физическую среду для передачи пакетов.
Роль: Этот блок отвечает за передачу пакетов через Ethernet-сеть. Здесь устанавливается исходный адрес и MAC-адрес устройства.
Новый IP (Желто-оранжевый блок):
Описание: Это IP-заголовок, который используется для доставки пакета через интернет (или другие сети). Он используется для маршрутизации пакетов между устройствами в разных подсетях или по всему интернету.
Роль: Новый IP-адрес указывает адресацию для доставки пакета через внешний маршрутизатор (маршруты, указанные на маршрутизаторе).
GRE (Серый блок):
Описание: Это заголовок инкапсуляции для протокола GRE (Generic Routing Encapsulation). GRE используется для инкапсуляции различных типов данных в IP-пакетах, позволяя передавать их через туннели.
Роль: Заголовок GRE используется для инкапсуляции пакетов и доставки их через туннель. В нем содержится важная информация, необходимая для правильной передачи данных, включая версию GRE, тип данных, контрольные суммы и другие поля.
IP (Зеленый блок):
Описание: Это оригинальный IP-заголовок, который был инкапсулирован в GRE. Он содержит информацию о передаче данных, такие как адрес назначения и источник. Это тот же IP-пакет, который бы был передан без GRE, но теперь он находится внутри GRE-туннеля.
Роль: Заголовок IP помогает маршрутизировать пакет через сеть и указывает, какой конечный адрес должен получить данные.
ICMP (Зеленый блок):
Описание: Это часть полезной нагрузки пакета. В данном случае, это ICMP-пакет, который может использоваться для диагностики, например, для пинга. Он находится внутри инкапсулированного IP-пакета.
Роль: Это данные, которые передаются через туннель. В нашем случае это запрос ICMP (например, пинг).
Структура заголовка GRE:
C, R, K, S, s (Флаги, поля контроля):
Описание: Эти биты используются для управления туннелем и его поведением:
C (Check bit) — флаг, который указывает, что следует производить проверку ошибок в пакете.
R (Routing bit) — указывает на использование маршрутизации в туннеле.
K (Key bit) — если установлен, используется ключ безопасности для туннеля.
S (Sequence bit) — используется для управления последовательностью пакетов.
s (Reserved bit) — зарезервировано для будущих расширений.
Recur (Рекурсия):
Описание: Этот бит отвечает за рекурсивную инкапсуляцию. Он указывает, нужно ли инкапсулировать пакеты в другие GRE пакеты, создавая многослойную инкапсуляцию.
Роль: Может использоваться для сложных сценариев маршрутизации или когда требуется повторная инкапсуляция пакетов.
Flags (Флаги):
Описание: Это дополнительные флаги, которые могут указывать на различные особенности туннеля, такие как наличие дополнительной проверки или меток.
Роль: Управляют поведением и режимами туннеля, могут быть использованы для изменения функциональности.
Version (Версия):
Описание: Указывает версию протокола GRE. В данном случае это версия 0.
Роль: Позволяет идентифицировать тип протокола для правильной обработки данных. Разные версии GRE могут иметь различные возможности или заголовки.
Protocol (Протокол):
Описание: Это поле указывает, какой протокол инкапсулирован в GRE. Это поле указывает на тип данных, который передается (например, IP, CLNP, IPX, AppleTalk и т. д.).
Роль: Это важный элемент, который помогает маршрутизатору понять, как интерпретировать инкапсулированные данные.
Checksum (Контрольная сумма):
Описание: Это поле используется для проверки целостности данных. Контрольная сумма позволяет обнаружить ошибки при передаче.
Роль: Обеспечивает корректность данных, гарантируя, что переданные пакеты не были повреждены.
Key (Ключ):
Описание: Используется для добавления метки безопасности или уникальной идентификации туннеля.
Роль: Этот ключ помогает отличить различные туннели, улучшая безопасность и контроль трафика.
Sequence Number (Номер последовательности):
Описание: Это поле используется для отслеживания порядковых номеров пакетов, передаваемых через туннель.
Роль: Упорядочивает пакеты, чтобы избежать проблем с их обработкой и доставкой.
Routing (Маршрутизация):
Описание: Это поле может содержать информацию о маршруте, который должен быть использован для передачи пакета через туннель.
Роль: Помогает определить, как маршрутизировать пакеты через GRE-туннель.
Data (Данные):
Описание: Это сам пакет или информация, передаваемая через туннель. В данном случае это ICMP-пакет, который был инкапсулирован.
Роль: Это полезная нагрузка, которая должна быть доставлена на конечное устройство.

Структура GRE версии 1, которая используется в сочетании с PPP (Point-to-Point Protocol), и включает дополнительные функции по сравнению с GRE версии 0.
Основная структура:
Ethernet (Желтый блок):
Описание: Это канальный уровень, который используется для передачи данных через физическую среду Ethernet.
Роль: Это базовая передача данных на канальном уровне, которая будет передана через IP-сеть.
Новый IP (Желто-оранжевый блок):
Описание: Это IP-заголовок, который используется для маршрутизации пакетов через сеть.
Роль: Этот блок необходим для правильной доставки пакета через интернет, указывая адрес назначения и источник.
GRE (Серый блок):
Описание: Заголовок GRE используется для инкапсуляции и передачи пакетов через туннель. В версии 1 GRE включает дополнительные функции и параметры.
Роль: Это основа инкапсуляции, которая помогает передавать данные через виртуальные туннели.
PPP (Красный блок):
Описание: Это заголовок PPP (Point-to-Point Protocol), который используется для создания прямого соединения между двумя точками. В данном случае PPP добавляется поверх GRE для улучшенной аутентификации и контроля данных.
Роль: PPP позволяет устанавливать и поддерживать соединение с аутентификацией и возможностью сжатия данных.
PPP Payload (Payload):
Описание: Это полезная нагрузка, которая содержит фактические данные, которые передаются по туннелю. В данном случае это инкапсулированный пакет PPP.
Роль: Это данные, которые должны быть доставлены от источника к получателю.
Структура заголовка GRE версии 1:
C, R, K, S, s (Флаги и поля контроля):
Описание: Эти биты управляют функциями туннеля:
C (Check bit) — флаг проверки ошибок.
R (Routing bit) — используется для маршрутизации данных через туннель.
K (Key bit) — указывает на использование ключа безопасности.
S (Sequence bit) — указывает на необходимость последовательности пакетов.
s (Reserved bit) — зарезервировано для будущих версий или функций.
Роль: Эти флаги управляют поведением туннеля и обеспечивают дополнительную функциональность, например, безопасность и контроль.
Recur (Рекурсия):
Описание: Этот бит используется для поддержки рекурсивных туннелей, то есть инкапсуляции туннелей внутри других туннелей.
Роль: Этот параметр помогает организовать более сложные структуры туннелей, что полезно для многослойной маршрутизации.
A (Флаг подтверждения):
Описание: Этот флаг используется для подтверждения получения пакетов в туннеле.
Роль: Помогает подтверждать, что данные были успешно переданы и получены.
Flags (Флаги):
Описание: Дополнительные флаги, которые указывают на различные особенности туннеля, такие как включение безопасности или других настроек.
Роль: Контролируют поведение туннеля и могут влиять на дополнительные параметры, такие как контроль целостности данных.
Version (Версия):
Описание: Указывает на версию протокола GRE. В данном случае это версия 1.
Роль: Помогает идентифицировать тип туннеля и его возможности, а также влияет на поддержку дополнительных функций.
Protocol (Протокол):
Описание: Указывает, какой тип данных передается через GRE туннель (например, IP, IPX, AppleTalk).
Роль: Это поле указывает, какой протокол инкапсулирован в пакете, позволяя маршрутизатору правильно интерпретировать передаваемые данные.
Payload Length (Длина полезной нагрузки):
Описание: Это поле указывает на длину полезной нагрузки в пакете PPP.
Роль: Это важно для корректной обработки пакета, так как позволяет маршрутизатору понять, сколько данных передается.
Sequence Number (Номер последовательности):
Описание: Это поле помогает отслеживать порядок пакетов, передаваемых через туннель.
Роль: Гарантирует, что пакеты будут доставлены в правильном порядке, что особенно важно для потоковых данных.
Acknowledgment Number (Номер подтверждения):
Описание: Это поле используется для подтверждения получения пакетов.
Роль: Используется для управления передачей данных и обеспечения надежности соединения.
Data (Данные):
Описание: Это фактическая полезная нагрузка, которая передается через туннель.
Роль: Это сами данные, которые инкапсулируются и передаются через GRE и PPP туннели.