Курс по сетевым технологиям
A A A

Краткая теория

GRE (Generic Routing Encapsulation) - проприетарный протокол Cisco для организации VPN соединений. Работает он по такому же принципу, что и IPSec, то есть к исходному пакету данных добавляет свой заголовок, за которым следует новый IP заголовок с новыми IP адресами. Выглядит этот так:

Инкапсуляция GRE

Однако есть существенное отличие между IPSec и GRE. IPSec изначально разрабатывался для осуществления шифрованной связи, GRE не использует никакого алгоритма шифрования и аутентификации.

GRE прост в настройке и используется там, где нужно организовать простую туннельную связь, не обременяя при этом процессор сложным алгоритмом шифрования.

GRE также идеален для передачи IPv6 поверх IPv4 и наоборот. 

При настройке GRE туннеля следует учитывать тот факт, что при добавлении GRE заголовка увеличивается MTU всего пакета. Это может привести к тому, что некоторые маршрутизаторы уничтожат пакеты, если не настроены на передачу с увеличенным MTU. Фрагментация GRE пакетов также запрещена, поэтому в идеале лучше уменьшить MTU в самом начале туннеля.

 

Настройка GRE

Итак, приступим к настройке протокола. Схема сети выглядит так:

Схема сети

В данном примере мы рассматриваем конфигурацию GRE типа IPv4-over-IPv4 с использованием NAT. 

Настраиваем туннельный интерфейс:

Headquarter(config)# interface Tunnel 10

 

Теперь нужно указать IP адрес данного интерфейса. Делается это для того, чтобы указать GRE  какой сетевой протокол будет инкапсулироваться, IPv4 или IPv6 либо какой-нибудь другой протокол:

Headquarter(config-if)# ip address 100.0.0.1 255.255.255.0

 

Указываем начало туннеля:

Headquarter(config-if)# tunnel source 1.1.1.1

 

А также конец туннеля:

Headquarter(config-if)# tunnel destination 2.2.2.1

 

Осталось теперь пустить весь трафик, идущий в сеть 192.168.2.0/24 в наш туннель:

Headquarter(config)# ip route 192.168.2.0 255.255.255.0 interface tunnel 10

 

То же самое с учетом адресов проделываем и на противоположном конце. Вот как выглядят настройки на обоих маршрутизаторах:

Конфигурация Headquarter

Конфигурация Branch

 

Убедимся в работе туннеля запустив Ping на одном из компьютеров:

Удачный Ping

Взглянем как выглядит инкапсулированный пакет:

Отображение пакета в Wireshark
Keepalive

Что произойдет с туннелем, если интерфейс на конечном маршрутизаторе отключится интерфейс либо оборвется кабель на промежуточном участке связи? 

Отключим интерфейс Tunnel 10 на маршрутизаторе Branch:

Интерфейс Tunnel 10 отключен

Если запустим Ping с главного офиса, то результат будет отрицательный. Взглянем на состояние интерфейсов на Headquarter:

Туннель на Headquarter поднят

Все интерфейсы и линейные протоколы связи в состоянии UP. Проверим сам интерфейс Tunnel в деталях:

Детальное отображение установок туннельного интерфейса

Здесь тоже все в порядке.  Попробуем “пингануть” туннельный интерфейс на противоположном конце с роутера Headquarter:

Неуспешный пинг

Данная информация косвенно подтверждает тот факт, что на противоположном конце не все гладко, конечно,  при условии, что маршрутизация в целом и WAN интерфейс на Branch работают как надо. 

Чтобы избежать такой ситуации в GRE предусмотрена отправка пакетов Keepalive. Давайте настроим ее на интерфейсе Tunnel 10:

Headquarter(config-if)# keepalive 10 3

Здесь мы указываем отправлять пакеты keepalive каждые 10 с. Если ответ не будет получен после 3-х попыток, то перевести туннель в состояние Down.

 

Loopback или реальный интерфейс

 В официальной документации сказано, что качестве начала и конца туннеля можно указывать либо реальный интерфейс либо Loopback. Давайте разберемся в чем разница.  Добавим к нашей сети еще один роутер для резервирования маршрута:

Схема сети с резервным маршрутом

Если мы отключим роутер ISP, то туннель автоматически перекинется через резервный маршрутизатор и будет прекрасно работать. Однако, если мы отключим интерфейс Fa0/1 на Headquarter, то туннель перейдет в состояние Down. Это связано с тем, что в качестве начала туннеля указан адрес интерфейса Fa0/1 и теперь при отключении данного порта отключается и сам туннель.

Чтобы избежать подобной ситуации рекомендуется использовать Loopback интерфейс в качестве начала и конца туннеля, причем он должен иметь маршрутизируемый адрес. То есть порт должен быть доступен по сети.

Конечно, если у вас один uplink, то достаточно указать реальный WAN интерфейс, но если 2 и более, то лучше воспользоваться Loopback.

 

Настройка GRE over IPSec

GRE не поддерживает шифрование, однако, если необходимо организовать защищенный канал связи, то можно построить туннель GRE поверх IPSec. Организация защищенного канала IPSec состоит из 2-х фаз. В первой фазе мы определяем политику безопасности (ISAKAMP IKE) для создания служебного туннеля, а во второй - параметры туннеля (IPSec) для передачи данных. 

Для начала настроим политику безопасности ISAKMP на маршрутизаторе Headquarter:

Headquarter(config)# crypto isakmp policy 1 

Headquarter(config-iakmp)# encryption aes  - метод шифрования aes 

Headquarter(config-isakmp)# authentication pre-share - метод аутентификации pre-share 

Headquarter(config-isakmp)# group 2 - метод обмена секретными ключами (метод Диффи-Хеллмана) 

Headquarter(config-isakmp)# lifetime 10000 - время жизни сессии 10 000 с

 

Определим IP адрес конечной точки туннеля, то есть IP адрес Branch, а также их общий ключ pre-share для аутентификации:

Headquarter(config)# crypto isakmp key  6 PASSWORD address 2.2.2.1

 

Настроим параметры туннеля IPSec:

Headquarter(config)# crypto ipsec transform-set GRE-IPSEC esp-3des esp-sha-hmac

 

Теперь создадим профиль подключения и назовем его GRE. В нем мы укажем параметры туннеля:

Headquarter(config)# crypto ipsec profile GRE

Headquarter(ipsec-profile)# set security-association lifetime seconds 10000

Headquarter(ipsec-profile)# set transform-set GRE-IPSEC

 

И наконец заключительный этап - мы привяжем наш профиль к туннельному интерфейсу: 

Headquarter(config-if)# tunnel protection ipsec profile GRE


Теперь запустим Ping и проверим работоспособность туннеля. Однако почему-то он не работает. Дело в том, что у нас включена отправка Keepalive. Маршрутизатор отправляет keepalive пакеты по незащищенному каналу и поэтому IPSec туннель не устанавливается. Если отключить keepalive, то туннель сразу установится и начнет работать.