Здравствуйте, коллеги! Сегодня мы будем рассматривать протокол GRE (Generic Router Encapsulation) на устройствах Cisco, а также основы его работы.
GRE (Generic Routing Encapsulation) — это протокол туннелирования, описанный в RFC 1701 и RFC 1702, предназначенный для инкапсуляции различных типов пакетов в IP-пакеты для их передачи через сеть. GRE используется для создания виртуальных туннелей между маршрутизаторами, что позволяет передавать не-IP-трафик (например, Ethernet, AppleTalk, IPX) через IP-сеть.
GRE не поддерживает шифрование и не решает задачи безопасности, в отличие от IPsec, который предлагает необходимую защиту. Тем не менее, GRE имеет свои преимущества в случаях, когда безопасность не является критичной, и когда требуется передача мультипротокольного трафика (например, IPX, AppleTalk и другие). Также, поскольку GRE не использует шифрование, он значительно менее нагружает процессор, что делает его более подходящим для сценариев, где безопасность не важна, например, при передаче VoIP трафика, где важна производительность и минимальная нагрузка на сеть.
GRE — это протокол туннелирования, который не обеспечивает шифрование или защиту данных. Он используется для инкапсуляции трафика и передачи его через туннель, но не решает задачи безопасности. Для обеспечения безопасности GRE часто комбинируется с IPsec, который добавляет шифрование, аутентификацию и целостность данных.
Пример работы протокола GRE и его взаимодействие с IPsec:

Оригинальный пакет:
Ethernet → IP → ICMP
Транспортный режим:
Ethernet → IP → ESP → ICMP → ESP Trailer → ESP Authentication (зашифровано)
Транспортный режим: Этот режим используется для шифрования служебного трафика, передаваемого между двумя сетевыми устройствами, такими как роутеры или коммутаторы. В данном режиме внешний IP-заголовок не создается, и осуществляется шифрование только данных. Оригинальный IP-заголовок остается без изменений.
Туннельный режим:
Ethernet → новый IP → ESP → IP → ICMP → ESP Trailer → ESP Authentication (зашифровано)
Туннельный режим: Применяется для организации защищенных VPN-соединений, обеспечивая связь между территориально удаленными филиалами и объединяя их в одну логическую локальную сеть. Туннельный режим также может использоваться для шифрования трафика внутри одной локальной сети, например, между клиентом и сервером. В этом режиме создается внешний IP-заголовок, а оригинальный IP-заголовок шифруется вместе с данными.
IPsec over GRE (транспортный режим):
Ethernet → новый IP → ESP → GRE → IP → ICMP → ESP Trailer → ESP Authentication (зашифровано)
Этот режим может использоваться для организации защищенных VPN-соединений и объединения филиалов. Однако его применение может быть нецелесообразным, так как добавление лишнего GRE-заголовка увеличивает размер пакета и уменьшает объем полезных данных, которые можно передать в одном стандартном интернет-кадре.
Когда IPsec используется в сочетании с GRE, чаще всего применяется туннельный режим, что может привести к добавлению дополнительных заголовков, включая GRE и два IP-заголовка. Применение трех IP-заголовков может встречаться при использовании туннельного режима с IPsec и GRE, но это увеличивает накладные расходы и может быть нецелесообразным в некоторых случаях.
Кроме того, существует режим GRE over IPsec, где GRE-заголовок размещается перед ESP. Это возможно благодаря гибкости IPsec, который изначально был разработан как настройка над стеком TCP/IP, оставаясь при этом незаметным для других уровней.
В реальной практике IPsec используется преимущественно в туннельном и транспортном режимах, поскольку они обеспечивают достаточную защиту и гибкость.
В этой части статьи мы рассмотрим практическую реализацию в лабораторной среде 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 (Официальная версия RFC 1701)

GRE есть две версии (RFC 1701, RFC 1702) версия 0 и версия 1. Наиболее часто используется 0 версия, и оно применяется если в качестве пассажиров вступает протоколы IP,CLNP,IPX,AplleTalk.Именно в лаб работах мы работали с этой версией GRE. Он содержит следующие поля
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:
Flags and Version (2 octets)
В первых двух октетах содержатся Flags GRE. Бит 0 — это самый значимый бит, бит 15 — самый младший. Биты с 13 по 15 зарезервированы для поля Version. Биты с 5 по 12 зарезервированы для будущего использования и должны передаваться как нули.
Version Number (bits 13-15)
Поле Version Number должно всегда содержать значение 0.

Checksum Present (bit 0)
Если бит Checksum Present установлен в 1, это означает, что поле Checksum используется и содержит действительные данные.
Routing Present (bit 1)
Если бит Routing Present установлен в 1, это указывает на наличие полей Offset и Routing, которые содержат действительные данные.
Key Present (bit 2)
Если бит Key Present установлен в 1, это означает, что поле Key присутствует в заголовке GRE.
Sequence Number Present (bit 3)
Если бит Sequence Number Present установлен в 1, это означает, что поле Sequence Number присутствует в заголовке GRE.
Strict Source Route (bit 4)
Этот бит рекомендуется устанавливать в 1, только если все данные маршрута состоят из Strict Source Routes.
Recursion Control (bits 5-7)
Поле Recursion Control состоит из трех бит, которые обозначают количество допустимых дополнительных инкапсуляций. Это значение обычно по умолчанию равно 0.
GRE Packet Fields
Protocol Type (2 octets)
Поле Protocol Type определяет тип протокола полезной нагрузки пакета. Обычно это будет тип протокола Ethernet, указывающий на тип данных в пакете.
Offset (2 octets)
Поле Offset указывает на положение первого октета активного Source Route Entry в поле маршрутизации. Это поле присутствует, если установлен бит Routing Present или Checksum Present, и оно содержит актуальные данные, если установлен бит Routing Present.
Checksum (2 octets)
Поле Checksum содержит IP контрольную сумму для всего пакета GRE, включая заголовок и данные. Это поле присутствует, если установлен бит Checksum Present, и оно актуально только в этом случае.
Key (4 octets)
Поле Key представляет собой четырехбайтовое число, которое добавляется инкапсулирующим устройством. Это поле может быть использовано для аутентификации источника пакета. Если поле Key Present установлено в 1, то поле Key присутствует в заголовке.
Sequence Number (4 octets)
Поле Sequence Number представляет собой 32-битное беззнаковое целое число, которое указывает порядок передачи пакетов. Оно используется для того, чтобы получатель мог установить правильную последовательность пакетов. Это поле присутствует, если установлен бит Sequence Number Present.
Routing (variable)
Поле Routing является необязательным и присутствует только если установлен бит Routing Present. Оно содержит список записей Source Route Entries (SRE). Каждая запись SRE имеет следующую структуру:

Address Family (2 octets): указывает, какой протокол используется для маршрутизации.
SRE Offset (1 octet): указывает смещение от начала поля Routing Information до первой активной записи Source Route Entry.
SRE Length (1 octet): указывает длину записи маршрута.
Routing Information (variable): содержит данные маршрута, которые используются для маршрутизации пакета.
Маршрутизация заканчивается записью с нулевой длиной и адресом 0x0000, что указывает на конец списка.
Протокол GRE версии 1 применяется в случае, если пассажиром является протокол PPP. Нам уже известно, что PPP является протоколом канального уровня и передается только по соединениям с Serial Link. Если требуется обеспечить связь между двумя устройствами с использованием PPP поверх Ethernet, то существует два варианта.
1.Вариант

Первый вариант подразумевает инкапсуляцию PPP в протокол PPPoE, который затем инкапсулируется в Ethernet-кадр. Это позволяет передавать данные через Ethernet, используя PPP для установления соединений. При этом GRE не применяется. PPPoE работает как расширение PPP, обеспечивая передачу данных между устройствами по Ethernet.
2 Вариант

Второй вариант предполагает использование PPP (Point-to-Point Protocol) в качестве пассажира в GRE. На слайде представлена структура протокола PPTP (Point-to-Point Tunneling Protocol), который был разработан компанией Microsoft и используется для создания VPN-соединений. PPTP является одним из стандартных протоколов для реализации VPN в Windows Server.
Как работает инкапсуляция в PPTP:
PPP инкапсулируется в GRE. В стандартной структуре GRE обычно вложение представляет собой IP-заголовок.
В случае PPTP, вложение в GRE представляет собой PPP-заголовок, а уже в этот заголовок помещается IP-заголовок.
Это отличается от стандартного подхода, где в GRE инкапсулируется оригинальный IP-заголовок напрямую, а в случае PPTP сначала идет PPP-заголовок, который затем инкапсулирует IP-заголовок.
Таким образом, PPP служит для установления сеанса, а уже внутри PPP могут передаваться различные данные, такие как IP или другие протоколы, необходимые для VPN-соединения.
Почему используется GRE первой версии:
Когда PPP инкапсулируется в GRE, применяется версия 1 GRE (RFC 1702). Это связано с тем, что версия 1 GRE поддерживает инкапсуляцию данных различных протоколов, таких как PPP. В отличие от стандартного GRE, где инкапсулируется IP-пакет, PPTP требует именно такой структуры для правильной передачи данных между устройствами через туннель.
Структура GRE версии 1(RFC 1702) ,
У GRE первой версии есть несколько отличий по сравнению с GRE нулевой версии. Вот основные изменения:
32-битное поле Acknowledgement Number — это новое поле, которое добавляется в GRE первой версии. Оно используется для подтверждения того, что пакет прибыл на другую сторону GRE туннеля. Это поле помогает отслеживать доставку пакетов через туннель.
16-битное поле Payload Length — это поле указывает размер полезной нагрузки, не включая размер заголовка GRE. Это помогает точно определить, сколько данных содержится в пакете, кроме самой инкапсуляции GRE.
16-битное поле Call ID — это поле содержит идентификатор, который указывает на страну, к которой принадлежит пакет. Это может использоваться для управления или маршрутизации пакетов на основе их происхождения.
Поля C, Checksum Present и R, Routing Present — в GRE первой версии биты в этих полях всегда установлены в 0, в отличие от GRE нулевой версии, где эти биты могли быть активированы для передачи информации о контрольной сумме или маршрутизации.
Поле K, Key Present — в GRE первой версии это поле всегда установлено в 1, что указывает на наличие ключа в пакете, обеспечивающего аутентификацию или идентификацию.
Поле S (Sequence Number Present) — это поле устанавливается в 1, если полезная нагрузка присутствует в пакете. Если полезная нагрузка отсутствует, то бит сбрасывается в 0. Без полезного вложения PPP-пакет используется для подтверждения ранее полученного пакета. В GRE нулевой версии в этом поле устанавливался бит, который указывал на использование поля Sequence Number.
Поле S маленькая (Strict Source Route) — в GRE первой версии этот бит всегда сброшен в 0, так же как и Preclusion Control.
Поле A (Acknowledgement) — устанавливается в 1, если пакет содержит номер подтверждения Acknowledgement Number, который используется для подтверждения передачи данных. Это поле не является обязательным.
Flags — все флаги сброшены в 0, что упрощает структуру пакета.
Версия — в GRE первой версии версия всегда установлена в 1.
Protocol Type — в поле Protocol Type всегда устанавливаются значения 0x0800 (для IPv4) или другие значения, указывающие на PPP-вложение.
Эти изменения делают GRE первой версии более гибким и функциональным по сравнению с нулевой версией, добавляя возможность управления передачей данных через туннель, а также более детальную инкапсуляцию и подтверждение доставки пакетов.
© Javid CCNP