Рейтинг@Mail.ru

NetCloud

Простыми словами о сетевых технологиях

Осваиваем VPN: настройка GRE-туннеля на Cisco (часть 1)

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

Туннелирование — процесс, в ходе которого создается защищенное логическое соединение между двумя конечными точками посредством инкапсуляции различных протоколов. При туннелировании данные упаковываются вместе со служебными заголовками в новый «конверт» для обеспечения конфиденциальности и целостности всей передаваемой информации. Важно отметить, что протокол GRE не обеспечивает шифрование данных и таким образом не дает никаких гарантий безопасности при передаче данных. Для шифрования существуют другие протоколы, которые работают совместно с GRE. Достаточно популярен сегодня для таких целей IPSec.

Прежде всего рассмотрим ситуацию, которая пояснит в каких случаях применяется туннелирование. Вот есть у нас такая сеть.

vpn

В этой схемы две внутренних подсети — 192.168.1.0/24 и 192.168.3.0/24. Каждая из них подключена к маршрутизаторам, которые имеют выход в Интернет с публичными адресами 11.11.11.11 и 33.33.33.33 соответственно. Представим такую ситуацию, когда нам необходимо обеспечить связность между двумя подсетями (например, каждая подсеть — это офис одного предприятия). Локальные (серые) адреса в сети Интернет не маршрутизируются. Для настройки связности необходимо «поднять» на каждом из маршрутизаторов виртуальный туннель (interface Tunnel) и назначить этому туннелю свой IP-адрес (в данном примере используется подсеть 192.168.1.0/30). Также в туннеле указывается source и destination IP-адрес, которые соответствуют публичным адресам. Пример: для маршутизатора A source ip = 11.11.11.11, destination ip = 33.33.33.33. После чего, настраиваем статический маршрут с указанием, что все пакеты, которые имеют адрес назначения внутренней сети, должны пересылаться на созданный туннель.

Выше я описал настройку туннеля в общих словах. Далее я покажу пример настройки GRE-туннеля на конкретном оборудовании Cisco с подробными комментариями.

Конфигурация для Router A:

Router_A(config)#interface fastEthernet0/0 - настройка интерфейса в сторону LAN1
Router_A(config-if)#description LAN - описание интерфейса
Router_A(config-if)#ip address 192.168.1.1 255.255.255.0 - задаем шлюз для LAN1
Router_A(config-if)#no shutdown - включаем интерфейс
Router_A(config-if)#exit 
Router_A(config)#interface fastEthernet0/1 - настройка порта в сторону Интернета
Router_A(config-if)#description Internet - описание интерфейса
Router_A(config-if)#ip address 11.11.11.11 255.0.0.0 - задаем публичный IP
Router_A(config-if)#no shutdown - включаем интерфейс
Router_A(config-if)#exit
Router_A(config)#interface Tunnel0 - настройка GRE-туннеля
Router_A(config-if)#ip address 192.168.2.1 255.255.255.252 - задаем IP для первой точки
Router_A(config-if)#tunnel source 11.11.11.11 - подменяем IP-адрес отправителя
Router_A(config-if)#tunnel destination 33.33.33.33 - подменяем IP-адрес получателя
Router_A(config-if)#exit 
Router_A(config)#ip route 192.168.3.0 255.255.255.0 Tunnel0 - добавляем статический маршрут в сторону LAN2
Router_A(config)#ip route 0.0.0.0 0.0.0.0 11.11.11.12 - добавляем статический маршрут в сторону провайдера

Аналогичная конфигурация для Router B (без комментариев):

Router_B(config)#interface fastEthernet0/0
Router_B(config-if)#description LAN
Router_B(config-if)#ip address 192.168.3.1 255.255.255.0
Router_B(config-if)#no shutdown
Router_B(config-if)#exit 
Router_B(config)#interface fastEthernet0/1
Router_B(config-if)#description Internet
Router_B(config-if)#ip address 33.33.33.33 255.0.0.0
Router_B(config-if)#no shutdown
Router_B(config-if)#exit
Router_B(config)#interface Tunnel0
Router_B(config-if)#ip address 192.168.2.2 255.255.255.252 
Router_B(config-if)#tunnel source 33.33.33.33
Router_B(config-if)#tunnel destination 11.11.11.11
Router_B(config-if)#exit
Router_B(config)#ip route 192.168.1.0 255.255.255.0 Tunnel0
Router_B(config)#ip route 0.0.0.0 0.0.0.0 33.33.33.34

Для того, чтобы проверить работоспособность туннеля необходимо выполнить следующие команды.

Пример: проверка GRE-туннеля с RouterA на RouterB





Пингуем из первой подсети во вторую
RouterA>ping 192.168.1.2 source 192.168.3.2

Смотрим состояние туннеля
RouterA>show interface tunnel0

Результат вывода команды show interface Tunnel 0 на RouterA

show_int_tunnel

Как видим туннель поднялся. Теперь проверим связность между компьютером из посети LAN1 и сервером из подсети LAN2.

ping_to_serv

Два пакета потерялись на ARP-запросе, а дальше пинг идет. Значит мы настроили туннель между двумя подсетями и имеем доступ к серверу.

Напоследок рассмотрим процесс инкапсуляции заголовка GRE в IP-пакет. Анализировать этот процесс удобно с помощью программы-анализатора трафика Wireshark. Ссылка на скачивание программы и инструкция.

gre-for-humans

GRE-заголовок накладывается «поверх» стандартного IP-пакета. При этом в самом GRE-заголовке содержится так называемый Tunnel IP Header. Именно в нем содержится информация о tunnel source и tunnel destination, которые ранее мы указывали при конфигурации маршрутизаторов. Данные адреса вкладываются в основной пакет, когда он отправляется в публичную сеть. В поле Control Information оригинального IP-пакета содержатся исходные IP-адреса источника и назначения. Таким образом, локальные серые IP-адреса скрыты в пакете, а в маршрутизации участвуют только те адреса которые мы указали в  tunnel source и tunnel destination. При передаче пакета в локальную сеть GRE-заголовок отбрасывается и остается «чистый» IP-пакет.

А вот ISMP-запрос от компьютера из LAN1 к серверу LAN2. Пакет «пойман» на участке между маршрутизатором и Интернет. Видно, что стандартный IP-пакет инкапсулируется в GRE, который потом в свою очередь инкапсулируется в новый IP-пакет с адресами источника и назначения: 11.11.11.11 и 33.33.33.33 соответственно.

routera_to_public

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