Со временем обрывки знаний и умений становится все труднее удержать в голове. Они расползаются по уголкам памяти заполняя все свободное место. Извлекать необходимое на свет становится все сложнее. Этот блог - рабочая записная книжка.

Sunday, May 4, 2008

Соединяя офисные пространства (lan-2-lan ipsec vpn gre)

0. Вводная
Продолжим разборки с различными технологиями vpn предоставляемыми рутерами cisco. Заметка будет больше практического характера. Ориентирована на тех, кто уже знаком с общей теорией работы ipsec и простейшими примерами построения туннелей. Итак, сегодня в качестве примера рассмотрим построение всё такого-же статического туннеля. Отличие только в том, что в данном примере, все пакеты подлежащие шифрованию будут сначалаинкапсулироваться в gre туннель и только потом в ipsec . Зачем такая сложность может ответить любой кто сталкивался с необходимостью пропускать через туннель мультикаст пакеты, которые в свою очередь любят использовать современные протоколы динамической маршрутизации. Впрочем, обо всём по порядку.
Адресация сети снова выглядит следующим образом.

Внутренняя сеть А: 192.168.1.0/24
Внутренняя сеть Б: 192.168.2.0/24

Внешний интерфейс А: 10.10.11.2/24
Внешний интерфейс Б: 10.10.10.2/24

Между внешними интерфейсами у меня находиться pix. В данном случае это не так важно, но он поможет сниффить проходящий траффик.

1. Труба (она же туннель).
Итак, необходимо установить туннель между внешними интерфейсами маршрутизаторов, в данном случае 10.10.11.2 и 10.10.10.2.
Минимальные параметры настройки:
- каждый туннель "привязывается" к конкретному физическому интерфейсу, в данном случае это FastEthernet 1/0.
- поскольку это layer 3 соединения, необходима ip адресация. Для уменьшения путаницы с "лишними" адресами будем использовать адреса физических интерфейсов. Ссылка.
- совершенно очевидно, что раз есть у туннеля начало, значит еть где-то и конец :) Указание второго пира, также обязательный параметр.
В примере приведена конфигурация только одной стороны туннеля, очевидно другая сторона конфигурируется идентично за исключением адреса пира.

//пример конфигурации gre туннеля
RouterA(config)# interface Tunnel10
RouterA(config-if)# tunnel source FastEthernet1/0
RouterA(config-if)# tunnel destination 10.10.10.2
RouterA(config-if)# ip unnumbered FastEthernet1/0

Итак туннель поднят, но не совсем понятно для каких целей, поскольку по нему еще ничего не ходит. Развернем рутинг для сетей 192.168.1.0/24 и 192.168.2.0/24, соответственно в сторону туннеля.
//рутинг в туннель
RouterA(config)# ip route 192.168.2.0 255.255.255.0 Tunnel10

Для рутера Б, нужно развернуть сеть
192.168.1.0/24.
Теперь внутренние сети находящиеся за рутерами видят друг друга.
//простейшая проверка - ping
RouterA#ping
Protocol [ip]:
Target IP address: 192.168.2.1
Repeat count [5]:
Datagram size [100]:
Timeout in seconds [2]:
Extended commands [n]: y
Source address or interface: 192.168.1.1
Type of service [0]:
Set DF bit in IP header? [no]:
Validate reply data? [no]:
Data pattern [0xABCD]:
Loose, Strict, Record, Timestamp, Verbose[none]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.2.1, timeout is 2 seconds:
Packet sent with a source address of 192.168.1.1
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 32/61/104 ms


Как видно пинг проходит успешно, но всегда интересно посмотреть, что же там внутри туннеля, для этих целей на стенде используется PIX с правильно настроеным capture.

// sniff
pixfirewall# show cap anyin
10 packets captured
1: 16:01:56.004577 10.10.11.2 > 10.10.10.2: ip-proto-47, length 104
2: 16:01:56.024870 10.10.10.2 > 10.10.11.2: ip-proto-47, length 104
(skip)
9: 16:01:56.232715 10.10.11.2 > 10.10.10.2: ip-proto-47, length 104
10: 16:01:56.249163 10.10.10.2 > 10.10.11.2: ip-proto-47, length 104
10 packets shown

Как и предпологалось, туннель работает нормально. Протокол 47 стека IP И есть gre.

2. Шифруем

Дальше всё просто. Принципиальных отличий между данной и минимальной конфигурацией практически никаких. Всё что нужно сделать это изменить crypto acl определяющий какой трафик подлежит шифрации.
Поскольку сниффер нам показал только gre пакеты между двумя пирами шифровать будем только их. Что в принципе достаточно очевидно. :)
//crypto acl, конечно они должны быть зеркальны с обоих сторон туннеля
RouterA(config)# access-list 150 permit gre host 10.10.11.2 host 10.10.10.2


isakmp, crypto map и прочие безобразия настраиваются совершенно идентично. На всякий случай привожу кусок конфигурации рутера А.

//пример окончательной конфигурации

!
crypto isakmp policy 200
encr aes 256
authentication pre-share
group 2
lifetime 36000
crypto isakmp key sUpeRkEy address 10.10.10.2
!
crypto ipsec transform-set ts-aes-sha esp-aes 256 esp-sha-hmac
!
crypto map cr_outside 200 ipsec-isakmp
set peer 10.10.10.2
set transform-set ts-aes-sha
match address 150
!
interface Tunnel10
ip unnumbered FastEthernet1/0
tunnel source FastEthernet1/0
tunnel destination 10.10.10.2
!
interface FastEthernet1/0
ip address 10.10.11.2 255.255.255.0
duplex auto
speed auto
crypto map cr_outside
!
ip route 192.168.2.0 255.255.255.0 Tunnel10
!
access-list 150 permit gre host 10.10.11.2 host 10.10.10.2
!

// Проведем то же элементарное тестирование с помощью ping. Ниже представлен вывод сниффера.
pixfirewall# show capture anyin
17 packets captured
1: 15:33:57.516788 10.10.11.2.500 > 10.10.10.2.500: udp 144
2: 15:33:57.741477 10.10.10.2.500 > 10.10.11.2.500: udp 104
3: 15:33:57.911284 10.10.11.2.500 > 10.10.10.2.500: udp 304
4: 15:33:58.126153 10.10.10.2.500 > 10.10.11.2.500: udp 304
5: 15:33:58.186025 10.10.11.2.500 > 10.10.10.2.500: udp 108
6: 15:33:58.206059 10.10.10.2.500 > 10.10.11.2.500: udp 76
7: 15:33:58.219852 10.10.11.2.500 > 10.10.10.2.500: udp 172
8: 15:33:58.259401 10.10.10.2.500 > 10.10.11.2.500: udp 172
9: 15:33:58.268388 10.10.11.2.500 > 10.10.10.2.500: udp 60
10: 15:33:59.395807 10.10.11.2 > 10.10.10.2: ip-proto-50, length 164
11: 15:33:59.444541 10.10.10.2 > 10.10.11.2: ip-proto-50, length 164
(skip)
17: 15:33:59.556703 10.10.10.2 > 10.10.11.2: ip-proto-50, length 164
17 packets shown

Как и ожидалось, конфигурация работает и даже шифрует трафик.
Первые 9 пакетов показывают обмен небольшими udp пакетами по 500 порту. Этот порт используется isakmp при установлении SA.
Далее идёт обмен пакетами протокола 50 стека IP, что и есть, собственно, ipsec.

7 comments:

Anonymous said...

Разберитесь с конфигами, вводите в заблуждение (еще и по прошлым статьям)

//пример конфигурации gre туннеля
RouterA(config)# interface Tunnel10
RouterA(config-if)# tunnel source FastEthernet1/0
RouterA(config-if)# tunnel destination 10.10.11.2
RouterA(config-if)# ip unnumbered FastEthernet1/0


//пример окончательной конфигурации
interface Tunnel10
ip unnumbered FastEthernet1/0
tunnel source FastEthernet1/0
tunnel destination 10.10.10.2
!


+
crypto isakmp key sUpeRkEy address 10.10.10.2 - где 10.10.10.2 адрес удаленного пира
в одной из предыдущих статей здесь вводите адрес локального пира.

pablo said...

Спасибо за комментарий.
Исправлено.

Anonymous said...

Не мешало бы сказать, что в данном случае GRE туннель пробрасывается внутри трубы IPSEC.
Гораздо проще сделать наоборот: IPSEC внутри GRE туннеля. Делается через команду "tunnel protected" в конфигурации туннеля. Аксес-листы при этом прописывать не нужно, они создаются неявно - будут шифроваться все пакеты, которые проходят по GRE туннелю.
К тому же помогает избавиться от некоторых проблем с динамической маршрутизацией через туннели.

pablo said...

Спасибо за достаточно познавательный комментарий. Обязательно разберусь с "альтернативным" вариантом инкапсуляции. :)

ilyarubinchik said...

Почему не рассматриваете DMVPN? В случае если все пиры циско и пиров больше 2х то это решение намного лучше.

pablo said...

2 ilyarubinchik:
Доберусь и до него. :)

Deepwalker said...

Anonymous, я вряд ли ошибусь, если скажу что вы ошибаетесь.

Оба метода приводят в конечном счете к идентичным настройкам внутри роутера. Вы сможете это легко увидеть через sh cry map и тп - они будут идентичны.

Но тот метод, о котором говорите вы, мне нравится гораздо больше - писать меньше в настройке надо :)

Еще - это работает в версиях иоса начиная с 12.3 по моему.