CISCO IPSec

CISCO IPSec — в статье рассказаны варианты развёртывания VPN туннеля: "чистый" IPSec, GRE over IPSec в виртуальной среде EVE-NG.

Как работать со статьёй? Можно просто читать, но толку от этого будет мало. Для максимальной пользы нужно развернуть такую же лабу в EVE-NG и проделывать все шаги, какие проделываются в статье.

Тестовая среда

Использовалась IOSv Software (VIOS-ADVENTERPRISEK9-M), Version 15.6(2)T, RELEASE SOFTWARE (fc2).

CISCO IPSec

Туннель туннель будет прокидываться между интерфейсами GigabitEthernet0/0 роутеров.

Попробуем симулировать среду 2 граничных роутеров, между которыми Интернет. Поэтому на роутерах настроен NAT. Компьютеры  PC1 и PC2 друг-друга напрямую не видят, так как они за натом. Начальная конфигурация R1:

...
interface GigabitEthernet0/0
ip address 10.10.10.1 255.255.255.252
ip nat outside
ip virtual-reassembly in
duplex auto
speed auto
media-type rj45
!
interface GigabitEthernet0/1
ip address 192.168.1.1 255.255.255.0
ip nat inside
ip virtual-reassembly in
duplex auto
speed auto
media-type rj45
...
ip nat inside source list 1 interface GigabitEthernet0/0 overload
ip route 0.0.0.0 0.0.0.0 10.10.10.2 — маршрут по умолчанию на адрес следующего перехода (адрес интерфейса GigabitEthernet0/0 роутера R2)
!
access-list 1 permit 192.168.1.0 0.0.0.255
...

Для R2 аналогично. Далее уже не буду каждый раз это писать. Подразумевается, что на R2 симметричные настройки.

Кроме этого для защиты со стороны "интернета" на интерфейсах далее будет настроен ACL, в котором разрешены на вход в роутер лишь несколько протоколов. Такой ACL обязательно потребуется в продакшене.

Много букв про IPSec

Да, можно заучить команды, но очень важно понимать нюансы настройки и работы IPSec. А тут их как никогда много. Причём в разных источниках информация об IPSec немного различается.  Достаточно таких источников пересмотрел. Скорее всего мой рассказ тоже будет немного отличаться от других. Постараюсь, тем не менее, обращать внимание на важные особенности.

Про IPSec хорошо и очень подробно рассказывается в курсе CCNA Security (210-260 IINS). К этому курсу, как и к другим, есть официальный гайд в формате PDF: CCNA Security 210-260 Official Cert Guide.

IPSec — не 1 протокол, это набор протоколов (Framework), работа IPSec — согласованная работа этих протоколов. Набор протоколов в IPSec неоднозначный, нужно выбрать, какие именно протоколы будут использоваться.

С использованием IPSec достигается концепция безопасности CIA Triad: Confidentiality, Integrity, Availability

  • Конфиденциальность данных — никто посторонний не сможет их просмотреть;
  • Целостность данных — данные не были изменены при передаче;
  • Доступность данных — постороннее лицо не может уничтожить пересылаемые данные или причинить им ущерб.

Кроме этого IPSec обеспечивает Antireplay (все пакеты нумеруются и если пакет уже приходил, то второй пакет с таким же номером будет отброшен).

Рассмотрим используемые протоколы:

CISCO IPSec

Шифрование

Применяется симметричное шифрование, то есть такое, где ключ для шифрования и расшифровки один и тот же. Оно менее устойчиво ко взлому чем ассиметричное, но только симметричное шифрование технически доступно для большим объёмов передаваемых пользовательских данных, так как использует относительно низкую утилизацию CPU устройства. Рекомендуется AES.

R1(config-isakmp)# encryption ?

3des  Three key triple DES
aes   AES - Advanced Encryption Standard.
des   DES - Data Encryption Standard (56 bit keys).
Целостность

Для каждого сообщения вычисляется хеш, который прикладывается к сообщению. Хеш очень короткий, всегда одинаковой длины (определяется алгоритмом), он однозначно определяет исходное сообщение. При получении высчитывается хеш полученного сообщения, он сравнивается с приложенным хешем. Если значения 2 хешей совпадают, значит сообщение не было изменено. Такой метод уязвим к атаке "человек посередине" (Man-In-The-Middle): сообщение перехватывается по пути следования, изменяется, прикладывается новый хеш. Для принимающей стороны всё ok. Чтобы этого не могло произойти, применяется технология HMAC (Hash-Based Message Authentication Code): перед созданием хеша к сообщению прикладывается ключ, который есть только у отправляющей и принимающей стороны. В результате, атакующий после изменения сообщения не сможет вычислить нужный хеш, так как у него нет ключа. А вычислить ключ по исходному сообщению и хешу для сообщение+ключ он тоже не сможет. Точнее, на это нужно время, чем устойчивее алгоритм хеширования, тем больше времени нужно на взлом. Рекомендуется SHA256 и выше.

R1(config-isakmp)# hash ?

md5    Message Digest 5
sha    Secure Hash Standard
sha256 Secure Hash Standard 2 (256 bit)
sha384 Secure Hash Standard 2 (384 bit)
sha512 Secure Hash Standard 2 (512 bit)
Обмен ключами

Для создания туннеля обе стороны должны совместно вычислить общий секретный ключ для симметричного шифрования данных в туннеле (не путать с PSK, который нужен для аутентификации). Всё это надо сделать через публичную сеть Интернета. Как это выполнить? На пустом месте через небезопасную сеть договорится о ключе для шифрования? Для этого используется специальный ассиметричный алгоритм Диффи-Хеллмана (DH). Степень защиты при расчёте общего ключа для шифрования определяется группой DH. Рекомендуется: Если в алгоритмах шифрования или аутентификации используется 128-битовый ключ, группа 14, 19, 20 или 24, а для 256-битового ключа группа 21 или 24.

R1(config-isakmp)# group ?

1   Diffie-Hellman group 1 (768 bit)
14  Diffie-Hellman group 14 (2048 bit)
15  Diffie-Hellman group 15 (3072 bit)
16  Diffie-Hellman group 16 (4096 bit)
19  Diffie-Hellman group 19 (256 bit ecp)
2   Diffie-Hellman group 2 (1024 bit)
20  Diffie-Hellman group 20 (384 bit ecp)
21  Diffie-Hellman group 21 (521 bit ecp)
24  Diffie-Hellman group 24 (2048 bit, 256 bit subgroup)
5   Diffie-Hellman group 5 (1536 bit)
Аутентификация

Каждый роутер должен подтвердить другому роутеру (и наоборот, то есть для 2 роутеров процедура выполняется 2 раза, сначала в одну, потом в обратную сторону) свою подлинность для участия в IPSec туннеле. Возможности: Общий, вводимый вручную, секретный ключ PSK (Pre Shared Key), Сертификаты RSA. Рекомендуется: Сертификаты RSA.

Аутентификация на основе общего ключа PSK происходит так: к ключу прикладывается определённая несекретная информация, известная и общая для обоих роутеров, высчитывается хеш, отправляется второму роутеру. Второй роутер повторяет процедуру для своего ключа и сравнивает хеши. Совпадение хешей означает совпадение общих ключей и как результат — подлинность, приславшего сообщение роутера. Потом второй роутер повторяет процедуру. В результате оба роутера подтвердили свою подлинность друг-другу.

Аутентификация RSA в рамках данной заметки рассматриваться не будет, поэтому разговора про неё нет. По факту повсеместно используется PSK, так как настройка гораздо проще.

R1(config-isakmp)# authentication ?

pre-share  Pre-Shared Key
rsa-encr   Rivest-Shamir-Adleman Encryption
rsa-sig    Rivest-Shamir-Adleman Signature
Загрузка CPU

Пару слов: рекомендации это конечно хорошо, но чем сильнее алгоритмы, тем больше накладных расходов на их обсчёт. Туннелей может быть несколько, кроме этого на роутере есть и другие сервисы, файрвол, возможно IOS IPS, возможно NetFlow, возможно через этот роутер в интернете сидит огромное число народу через NAT, возможно часто идёт потоковое видео (ВКС, к примеру). Всё это нужно учитывать и алгоритмы подбирать такие, чтобы они совместно со всем вышеперечисленным не положили роутер. Для этого мониторить загрузку CPU:

R1# show processes cpu history

При высокой нагрузке алгоритмы брать попроще. В примере буду использовать сильные алгоритмы. В продакшене видел люди не парятся, используют 56-битный DES и MD5 🙂 Пример реализации, тут рассказанный, он для изучения возможностей IPSec, не калька для продакшена. Это важно.


Чистый IPSec

"Чистый" это моё название, официально туннель называется просто IPSec VPN tunnel.

Туннель возможен между CISCO ISR (Integrated Services Routers), ASA в любом сочетании. В CISCO ASA настройки могут быть выполнены через графическое средство — ASDM. Там всё понятно и пошагово, поэтому для определённости будем считать, что туннель пробрасывается между двумя ISR. Настройка в этом случае сложнее, ведь она производится через CLI и нужно понимать в каком порядке вводить команды, а также что значит каждая команда.

Фазы IPSec

Процесс установки IPSec VPN туннеля состоит из 2ух последовательных стадий-фаз (Phases):

  • IKE Phase 1 — Создаётся 1 двунаправленный туннель, необходимый для согласования Phase 2. По этому туннелю передаётся только управляющая информация, пользовательские данные не передаются. Называется ISAKMP туннель;
  • IKE Phase 2 — С помощью туннеля фазы 1 создаются дополнительно ещё 2 однонаправленных туннеля, от первого роутера ко второму и от второго к первому, по которым передаётся пользовательская информация. Туннели второй фазы и есть то, что называется IPSec туннель.

Важно отметить, что туннель не поднимается сразу после выполнения настроек. Согласования фазы 1, затем 2 начинается после того, как на роутер попадают данные, предназначенные для туннеля ("интересный" трафик). Данные эти отбираются с помощью ACL (называется Crypto ACL, хотя по факту это самый обычный ACL).

Также важно то, что туннель не существует сколь угодно долго после создания, у него есть время жизни (Lifetime). После истечения Lifetime туннель гасится и пересоздаётся снова (с помощью фаз 1 и 2, при наличии интересного трафика). Если интересного трафика нет, туннель лежит, но постоянно готов к созданию сразу при появлении такого трафика.

Lifetime выбирается достаточно большим, чтобы туннель слишком часто не пересоздавался. И достаточно маленьким, чтобы туннель не был взломан. При использовании стойких ко взлому алгоритмов актуальность малого Lifetime туннеля снижается.

R1(config-isakmp)# lifetime ?

<60-86400> lifetime in seconds

Встречал в разных материалов, что по истечении Lifetime "обновляются ключи шифрования", открываю официальный гайд, о котором сказано в начале статьи:

CISCO IPSec

Впрочем, никто мне не мешает проверить (будет далее).

Необходимые понятия
  • IKE — Самый, пожалуй, центровой протокол в IPSec Framework это IKE (Internet Key Exchange). Остальные протоколы работают под его управлением;
  • ISAKMP — Реализация IKE для первой фазы (Security Association and Key Management Protocol);
  • SA — В ходе фазы 1 и фазы 2 роутеры обмениваются и утверждают набор параметров IPSec Framework: хеширование, шифрование и так далее. Каждый набор или коллекция и есть SA (Security Association). Для создания IPSec туннеля требуется 2 SA: для первой и для второй фазы. На роутере уже есть предустановленные SA, но пользоваться ими не рекомендуется (по крайней мере предустановленные SA 1 фазы используют устаревшие, нестойкие алгоритмы). SA на одном роутере должна быть полностью идентична SA на другом роутере для каждой фазы.

Важно. Недостатком чистого IPSec туннеля является то, что он может передавать только юникастовые пакеты. Мультикаст передаваться не может, это является препятствием для обмена информацией динамическими протоколами маршрутизации. Чистый IPSec используется когда проброс информации динамических протоколов маршрутизации через туннель не нужен.


Настройка IPSec

Порядок следующий, настраиваем фазу 1, PSK, создаём Crypto ACL для отбора интересного трафика, настраиваем фазу 2: Transform Set и Crypto Map, в Crypto Map используем созданный Crypto ACL, Transform Set, затем вешаем Crypto Map на нужный интерфейс, разрешаем входящий трафик ISAKMP, ESP.

Фаза 1

Начинаем настраивать SA первой фазы. Создаётся политика  ISAKMP. HAGLE — удобная мнемоника для запоминания этой SA:

  • Hash — хеширование SHA256;
  • Autentification — аутентификация PSK;
  • Group — группа DH 21;
  • Lifetime — время жизни туннеля 3600 (по умолчанию 1 день = 86400);
  • Encryption — шифрование AES  256 (по умолчанию для AES 128).

Как уже говорилось параметры SA для обоих роутеров должны совпадать. Исключение составляет параметр Lifetime: если он не совпадает, то взят будет наименьший.

R1(config)# crypto isakmp policy 3
R1(config-isakmp)# hash sha256
R1(config-isakmp)# authentication pre-share
R1(config-isakmp)# group 21
R1(config-isakmp)# lifetime 3600
R1(config-isakmp)# encryption aes 256

R2(config)# crypto isakmp policy 3
R2(config-isakmp)# hash sha256
R2(config-isakmp)# authentication pre-share
R2(config-isakmp)# group 21
R2(config-isakmp)# lifetime 3600
R2(config-isakmp)# encryption aes 256

Важно отметить, что цифра политики означает приоритет её использования:

R1(config)# crypto isakmp policy ?

<1-10000> Priority of protection suite

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

Дефолтные SA первой фазы

Посмотрим их:

R1# show crypto isakmp default policy

Default IKE policy
Default protection suite of priority 65507
encryption algorithm: AES - Advanced Encryption Standard (128 bit keys).
hash algorithm: Secure Hash Standard
authentication method: Rivest-Shamir-Adleman Signature
Diffie-Hellman group: #5 (1536 bit)
lifetime: 86400 seconds, no volume limit
Default protection suite of priority 65508
encryption algorithm: AES - Advanced Encryption Standard (128 bit keys).
hash algorithm: Secure Hash Standard
authentication method: Pre-Shared Key
Diffie-Hellman group: #5 (1536 bit)
lifetime: 86400 seconds, no volume limit
Default protection suite of priority 65509
encryption algorithm: AES - Advanced Encryption Standard (128 bit keys).
hash algorithm: Message Digest 5
authentication method: Rivest-Shamir-Adleman Signature
Diffie-Hellman group: #5 (1536 bit)
lifetime: 86400 seconds, no volume limit
Default protection suite of priority 65510
encryption algorithm: AES - Advanced Encryption Standard (128 bit keys).
hash algorithm: Message Digest 5
authentication method: Pre-Shared Key
Diffie-Hellman group: #5 (1536 bit)
lifetime: 86400 seconds, no volume limit
Default protection suite of priority 65511
encryption algorithm: Three key triple DES
hash algorithm: Secure Hash Standard
authentication method: Rivest-Shamir-Adleman Signature
Diffie-Hellman group: #2 (1024 bit)
lifetime: 86400 seconds, no volume limit
Default protection suite of priority 65512
encryption algorithm: Three key triple DES
hash algorithm: Secure Hash Standard
authentication method: Pre-Shared Key
Diffie-Hellman group: #2 (1024 bit)
lifetime: 86400 seconds, no volume limit
Default protection suite of priority 65513
encryption algorithm: Three key triple DES
hash algorithm: Message Digest 5
authentication method: Rivest-Shamir-Adleman Signature
Diffie-Hellman group: #2 (1024 bit)
lifetime: 86400 seconds, no volume limit
Default protection suite of priority 65514
encryption algorithm: Three key triple DES
hash algorithm: Message Digest 5
authentication method: Pre-Shared Key
Diffie-Hellman group: #2 (1024 bit)
lifetime: 86400 seconds, no volume limit
R1#

Их 8, начиная с самой устойчивой, затем постепенно устойчивость ко взлому снижается. При отсутствии вручную заданной SA первой фазы роутер попытается использовать дефолтные SA в порядке приоритетов. Сначала саму стойкую 65507, согласование окончилось ошибкой, тогда 65508. И так далее.

PSK

Указывается ключ и IP роутера с другой стороны туннеля (пира):

R1(config)# crypto isakmp key IPSecVPNtunnel address 10.10.10.2

R2(config)# crypto isakmp key IPSecVPNtunnel address 10.10.10.1
Crypto ACL

Самый обычный ACL, нам нужно отобрать трафик с PC1 на PC2 для R1 и с PC2 на PC1 для R2:

R1(config)# access-list 101 permit ip 192.168.1.0 0.0.0.255 192.168.2.0 0.0.0.255 

R2(config)# access-list 101 permit ip 192.168.2.0 0.0.0.255 192.168.1.0 0.0.0.255
Фаза 2

SA второй фазы несколько отличается от первой. IPSec может использовать протокол AH или протокол ESP:

  • AH — Authentication Header, IP протокол 51, обеспечивает  аутентификацию и целостность данных, но не применяет шифрование, поэтому в реальной жизни его ценность минимальна;
  • ESP — Encapsulation Security Protocol, IP протокол 50, обеспечивает аутентификацию, целостность данных и шифрование. Для туннеля через Интернет интересен только этот протокол.

IPSec работает или в туннельном режиме, или в транспортном режиме:

  • Туннельный режим — добавляется новый IP заголовок, исходный пакет полностью упаковывается, используется при создании туннеля между роутерами (site-to-site). Для нас подходит только этот режим;
  • Транспортный режим — используется IP заголовок исходного пакета, применяется или при подключении клиентов к серверу (VPN client), или когда уже есть сетевая доступность между устройствами (GRE over IPSec).

CISCO IPSec

Transform Set

Настраиваем набор алгоритмов для фазы 2:

R1(config)# crypto ipsec transform-set R1-R2 ?

ah-md5-hmac AH-HMAC-MD5 transform
ah-sha-hmac AH-HMAC-SHA transform
ah-sha256-hmac AH-HMAC-SHA256 transform
ah-sha384-hmac AH-HMAC-SHA384 transform
ah-sha512-hmac AH-HMAC-SHA512 transform
comp-lzs IP Compression using the LZS compression algorithm
esp-3des ESP transform using 3DES(EDE) cipher (168 bits)
esp-aes ESP transform using AES cipher
esp-des ESP transform using DES cipher (56 bits)
esp-gcm ESP transform using GCM cipher
esp-gmac ESP transform using GMAC cipher
esp-md5-hmac ESP transform using HMAC-MD5 auth
esp-null ESP transform w/o cipher
esp-seal ESP transform using SEAL cipher (160 bits)
esp-sha-hmac ESP transform using HMAC-SHA auth
esp-sha256-hmac ESP transform using HMAC-SHA256 auth
esp-sha384-hmac ESP transform using HMAC-SHA384 auth
esp-sha512-hmac ESP transform using HMAC-SHA512 auth

Здесь R1-R2 имя набора, оно будет далее использоваться в Crypto MAP и выбирать его нужно таким, чтобы потом не запутаться, то есть одинаковым для обоих роутеров. Выбираем далее esp-aes 256:

R1(config)# crypto ipsec transform-set R1-R2 esp-aes ?

128 128 bit keys. — по умолчанию
192 192 bit keys.
256 256 bit keys.

И esp-sha256-hmac, туннельный режим:

R1(config)# crypto ipsec transform-set R1-R2 esp-aes 256 esp-sha256-hmac

R2(config)# crypto ipsec transform-set R1-R2 esp-aes 256 esp-sha256-hmac

Поскольку туннельный режим идёт по умолчанию, то вводить команду mode tunnel  для сета не нужно (она добавится автоматически).

Дефолтный SA второй фазы

Смотрим:

R1# show crypto ipsec transform-set

Transform set default: { esp-aes esp-sha-hmac }
will negotiate = { Transport, },

Transform set R1-R2: { esp-256-aes esp-sha256-hmac }
will negotiate = { Tunnel, },

Единственный дефолтный сет имеет транспортный режим. Он в нашем туннеле не заработает, поэтому SA второй фазы нужно обязательно набивать руками.

Crypto Map

Создаётся Crypto Map, которая вещается на интерфейс. По сути разновидность PBR (Policy-Based Routing): интересный трафик исключается из глобальной маршрутизации и принудительно "засовывается" в туннель.

Указывается имя, номер:

R1(config)# crypto map R1-R2-MAP ?

<1-65535> Sequence to insert into crypto map entry
...

Номер имеет важное значение: на 1 интерфейс можно повесить только 1 мапу, но на 1 интерфейс можно повесить мапы с одним именем (будет считаться как 1 мапа) и разными номерами. Каждое вхождение с новым номером будет соответствовать новому туннелю. Таким образом, теоретически на 1 интерфейс можно повесить 65535 туннелей.

Тут небольшое лирическое отступление. А вообще сколько туннелей норма при вот таком режиме IPSec, как сейчас разбирается, чтобы полносвязное соединение было (всё на всё)? Два пира — всего 1 туннель (1 на роутер), 3 пира — всего 3 туннеля (1 на роутер), 4 пира — уже 6 туннелей (3 на роутер).. Моё скромное мнение: 1-3 пира, используем IPSec туннели, 4 и более, используем DMVPN.

Продолжаем:

R1(config)# crypto map R1-R2-MAP 1 ipsec-isakmp

% NOTE: This new crypto map will remain disabled until a peer and a valid access list have been configured.

В явном вид говорится, что мапа останется неактивной пока не будет добавлен пир и валидный Crypto ACL для отбора трафика.

...
R1(config-crypto-map)# match address 101
R1(config-crypto-map)# set transform-set R1-R2
R1(config-crypto-map)# set peer 10.10.10.2

R2(config)# crypto map R1-R2-MAP 1 ipsec-isakmp
R2(config-crypto-map)# match address 101
R2(config-crypto-map)# set transform-set R1-R2
R2(config-crypto-map)# set peer 10.10.10.1

Привязываем ACL, сет алгоритмов и адрес удалённого роутера.

Дополнительные возможности Crypto Map
R1(config-crypto-map)# set pfs group24

При согласовании фазы 2 будет ещё раз выполнен алгоритм Диффи-Хеллмана для создания нового симметричного ключа шифрования. В результате у туннелей второй фазы будет собственный ключ шифрования, иначе используется ключ из первой фазы.

R1(config-crypto-map)# set security-association lifetime ?

days      Time-based key duration in days
kilobytes Volume-based key duration
seconds   Time-based key duration in seconds

Для второй фазы можно задать отдельное время жизни в днях, килобайтах или секундах, иначе вторая фаза будет проходить (после первой, разумеется) при истечении Lifetime первой фазы и пересоздании туннеля.

...
R1(config-crypto-map)# set security-association lifetime seconds 900
Добавление Crypto Map на интерфейс

Добавляем мапу к интерфейсу, никаких ошибок быть не должно:

R1(config)# interface GigabitEthernet 0/0
R1(config-if)# crypto map R1-R2-MAP
R1(config-if)# end

*Aug 12 17:02:14.382: %CRYPTO-6-ISAKMP_ON_OFF: ISAKMP is ON

R2(config)# interface GigabitEthernet 0/0
R2(config-if)# crypto map R1-R2-MAP

Если после вылезли вот такие ошибки:

R1(config-if)# crypto map R1-R2-MAP

*Aug 15 09:35:39.216: IPSEC: Expand action denied, discard or forward packet.
*Aug 15 09:35:39.217: IPSEC: Expand action denied, discard or forward packet.
*Aug 15 09:35:39.217: IPSEC: Expand action denied, discard or forward packet.
*Aug 15 09:35:39.217: IPSEC: Expand action denied, discard or forward packet.
*Aug 15 09:35:39.218: IPSEC: Expand action denied, discard or forward packet.
*Aug 15 09:35:39.218: IPSEC: Expand action denied, notify RP
*Aug 15 09:35:39.218: IPSEC: Expand action denied, discard or forward packet.
*Aug 15 09:35:39.218: IPSEC: Expand action denied, discard or forward packet.
*Aug 15 09:35:39.225: %CRYPTO-6-ISAKMP_ON_OFF: ISAKMP is ON

То тут 2 варианта: сам что-то накосячил или глюк vIOS при полностью правильных настройках. В первом случае работать скорее не будет, во втором случае работает нормально, проверял.

Важный момент, чтобы Crypto Map отработал пакет должен попасть на интерфейс, где мапа висит. У нас это достигается маршрутом по умолчанию:

ip route 0.0.0.0 0.0.0.0 10.10.10.2

Если бы не было этого маршрута, то пакет от 192.168.1.2 к 192.168.2.2 был бы отброшен. Мапа сама его не подтянет. Попаданий в Crypto ACL пакетов не будет, туннель не поднимется.

Изменение NAT

В том виде как он есть, нат не даст работать туннелю. Пакеты будут просто проваливаться в нат и всё. Нужно исключить пакеты для туннеля из нат:

R1(config)# no ip nat inside source list 1 interface GigabitEthernet0/0 overload
R1(config)# no access-list 1
R1(config)# ip nat inside source list 100 interface GigabitEthernet0/0 overload
R1(config)# access-list 100 deny ip 192.168.1.0 0.0.0.255 192.168.2.0 0.0.0.255
R1(config)# access-list 100 permit ip 192.168.1.0 0.0.0.255 any

Ещё раз краткий алгоритм работы IPSec:

CISCO IPSec

Разрешение трафика ISAKMP и ESP

Последний момент в настройке IPSec. Туннель настраивается всегда на граничных роутерах, Crypto Map вешается на интерфейс, смотрящий в Интернет. Но такой роутер защищён от нежелательного входящего со стороны интернет-трафика (ZBF firewall, CBAC firewall, ACL). А нам надо чтобы прошло согласование 2 фаз IKE. Поэтому нужно в явном виде "пропилить дырки" для входящего трафика IKE и ESP:

R1(config)# ip access-list extended firewall_acl 
R1(config-ext-nacl)# permit udp host 10.10.10.2 host 10.10.10.1 eq isakmp
R1(config-ext-nacl)# permit esp host 10.10.10.2 host 10.10.10.1
Разрешение трафика EIGRP

В качестве примера разберём как разрешить трафик EIGRP. Предположим, что между роутерами EIGRP настроен. Протокол EIGRP шлёт пакеты 2 типов:

  • Мультикаст на адрес 224.0.0.10;
  • Юникаст на IP адрес интерфейса соседа.

Поэтому понадобятся ещё 2 правила:

...
R1(config-ext-nacl)# permit eigrp host 10.10.10.2 224.0.0.10 0.0.0.0
R1(config-ext-nacl)# permit eigrp host 10.10.10.2 host 10.10.10.1
Разрешение Ping

И даже такой ACL недостаточен для нормальной работы. Туда нужно много чего добавить (как минимум SSH). Добавим правило чтобы возвращались проходил пинг:

R1(config-ext-nacl)# permit icmp any host 10.10.10.1 echo
R1(config-ext-nacl)# permit icmp any host 10.10.10.1 echo-replay

И "лепим" этот ACL на внешний интерфейс во входящем направлении:

R1(config)# interface GigabitEthernet 0/0
R1(config-if)# ip access-group firewall_acl in

Проверка IPSec

Сначала посмотрим чего понастраивали:

R1# show crypto isakmp policy

Global IKE policy
Protection suite of priority 3
        encryption algorithm:   AES - Advanced Encryption Standard (256 bit keys).
        hash algorithm:         Secure Hash Standard 2 (256 bit)
        authentication method:  Pre-Shared Key
        Diffie-Hellman group:   #21 (521 bit)
        lifetime:               3600 seconds, no volume limit

Сет уже просмотрели, когда выводилась инфа о дефолтном сете. Смотрим мапу:

R1# show crypto map
        Interfaces using crypto map NiStTeSt1:

Crypto Map IPv4 "R1-R2-MAP" 1 ipsec-isakmp
        Peer = 10.10.10.2
        Extended IP access list 101
            access-list 101 permit ip 192.168.1.0 0.0.0.255 192.168.2.0 0.0.0.255
        Current peer: 10.10.10.2
        Security association lifetime: 4608000 kilobytes/900 seconds
        Responder-Only (Y/N): N
        PFS (Y/N): Y
        DH group:  group24
        Mixed-mode : Disabled
        Transform sets={
                R1-R2:  { esp-256-aes esp-sha256-hmac  } ,
        }
        Interfaces using crypto map R1-R2-MAP:
                GigabitEthernet0/0

А что это такое? Что за NiStTeSt1? Это баг данной версии IOS (требуется регистрация, нет если учётной записи в CISCO, то пора создать). Смотреть состояние SAs рано, там всё пусто и по нулям.


Тест туннеля

Для начала включим дебаг:

R1# debug crypto isakmp — так же полезная команда debug crypto ipsec

Crypto ISAKMP debugging is on

Запустим трафик с PC1 на PC2, например пинг:

PC1> ping 192.168.2.2

192.168.2.2 icmp_seq=1 timeout
84 bytes from 192.168.2.2 icmp_seq=2 ttl=62 time=15.281 ms
84 bytes from 192.168.2.2 icmp_seq=3 ttl=62 time=5.101 ms
...

Первый пинг пропадает, так как нужно время для поднятия туннеля. Вывод дебага огромен, приводить нет смысла. Тут надо только отметить, что фаза 1 согласовывается в основном режиме (Main) или в агрессивном (Aggressive). По умолчанию основной режим, агрессивный чуть быстрее, непринципиально чтобы заморачиваться на выяснение его настройки:

*Aug 15 22:30:53.733: ISAKMP: (0):Can not start Aggressive mode, trying Main mode.
...
*Aug 15 22:30:53.735: ISAKMP: (0):beginning Main Mode exchange

Посмотрим 1 SA:

R1# show crypto isakmp sa

IPv4 Crypto ISAKMP SA
dst src state conn-id status
10.10.10.2 10.10.10.1 QM_IDLE 1001 ACTIVE

IPv6 Crypto ISAKMP SA

Смотрим 2 SA:

R1# show crypto ipsec sa

interface: GigabitEthernet0/0
Crypto map tag: R1-R2-MAP, local addr 10.10.10.1

protected vrf: (none)
local ident (addr/mask/prot/port): (192.168.1.0/255.255.255.0/0/0)
remote ident (addr/mask/prot/port): (192.168.2.0/255.255.255.0/0/0)
current_peer 10.10.10.2 port 500
PERMIT, flags={origin_is_acl,}
# pkts encaps: 4, # pkts encrypt: 4, # pkts digest: 4
# pkts decaps: 4, # pkts decrypt: 4, # pkts verify: 4
# pkts compressed: 0, # pkts decompressed: 0
# pkts not compressed: 0, # pkts compr. failed: 0
# pkts not decompressed: 0, # pkts decompress failed: 0
# send errors 0, # recv errors 0

local crypto endpt.: 10.10.10.1, remote crypto endpt.: 10.10.10.2
plaintext mtu 1438, path mtu 1500, ip mtu 1500, ip mtu idb GigabitEthernet0/0
current outbound spi: 0x2A87F66D(713553517)
PFS (Y/N): Y, DH group: group24
...

Пакеты бегают, PFS работает.

Теперь посмотрим на передаваемые пакеты с помощью WareShark:

CISCO IPSec

Нагрузка зашифрована, всё в порядке.

К вопросу о Lifetime

Самому даже интересно. Никто не мешает мне мучить виртуальные (реальные тоже) железки, вводить правильные и неправильные параметры, как захочу. Сделаем время жизни 60 секунд (возможный минимум), дебаг включён, запускаем инициализацию туннеля по пингу (5 пакетов) и ждём 1 минуту:

...
*Aug 16 20:06:56.855: ISAKMP: (1001):processing DELETE_WITH_REASON payload, mess age ID = 62935538, reason: Unknown delete reason!
*Aug 16 20:06:56.855: ISAKMP: (1001):peer does not do paranoid keepalives.
*Aug 16 20:06:56.855: ISAKMP: (1001):deleting SA reason "IKE SA Lifetime Exceeded" state (I) QM_IDLE (peer 10.10.10.2)
...

Смотрим SA:

R1# show crypto isakmp sa

IPv4 Crypto ISAKMP SA
dst src state conn-id status

IPv6 Crypto ISAKMP SA

Нету туннеля. Вопрос закрыт. Полные конфы R1 и R2.


GRE over IPSec

Смысл туннеля: пакеты GRE зашифрованы IPSec. Поскольку сам GRE (Generic Routing Encapsulation) передаётся в виде юникастовых пакетов, то его возможно помещать внутрь IPSec (точнее внутрь ESP). Таким образом GRE over IPSec решает проблему как GRE (шифрование), так и IPSec (поддержка мультикаста). Подробнее о GRE и чем он хорош.

Схема подключения та же самая. Роутеры в начальной конфигурации без (IPSec туннелей, всё, что настраивалось в 1 части статьи  — этого нет).


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

Чтобы всё было понятно, нужно разобрать первую часть статьи.

 

CISCO IPSec

GRE туннель

Сначала настраиваем GRE туннель:

R1(config)# interface tunnel 1
R1(config-if)# ip address 10.10.100.1 255.255.255.252
R1(config-if)# tunnel source GigabitEthernet 0/0
R1(config-if)# tunnel destination 10.10.10.2

R2(config)# interface tunnel 1 
R2(config-if)# ip address 10.10.100.2 255.255.255.252 
R2(config-if)# tunnel source GigabitEthernet 0/0 
R2(config-if)# tunnel destination 10.10.10.1

Делаем маршрут, чтобы трафик в удалённую подсеть заворачивал в туннель:

R1(config)# ip route 192.168.2.0 255.255.255.0 10.10.100.2

R2(config)# ip route 192.168.1.0 255.255.255.0 10.10.100.1

Проверяем работу GRE:

R1# ping 10.10.100.2

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.10.100.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 2/3/6 ms

NAT в данном случае не мешает работе туннеля, проверяем:

PC1> ping 192.168.2.2

84 bytes from 192.168.2.2 icmp_seq=1 ttl=62 time=9.278 ms
...

Почему это так чуть далее, чтобы не портить последовательность изложения.

Просмотр через WireShark

Если просмотреть пинги со 192.168.1.2 на 192.168.2.2, то видно, что пакет ICMP запакован в пакет GRE, 2 IP заголовка (выделено рамкой): внешний IP заголовок GRE пакета и IP заголовок инкапсулированной нагрузки. Прошу обратить внимание (подчёркнуто), что IP адрес отправителя и получателя для пакета GRE это IP адреса интерфейсов GigabitEthernet 0/0 роутеров. Это важно.

CISCO IPSec

В первом IP заголовке: протокол GRE, IP 47:

CISCO IPSec

Настройка IPSec

Теперь добавим IPSec:

R1(config)# crypto isakmp policy 3 
R1(config-isakmp)# hash sha256 
R1(config-isakmp)# authentication pre-share 
R1(config-isakmp)# group 21 
R1(config-isakmp)# lifetime 3600 
R1(config-isakmp)# encryption aes 256

Далее PSK:

R1(config)# crypto isakmp key IPSecVPNtunnel address 10.10.10.2

Список управления доступом: отбираем трафик GRE, идущий в туннель:

R1(config)# access-list 101 permit gre host 10.10.10.1 host 10.10.10.2

Сет возьмём дефолтный, он как раз подходит: нет смысла засовывать туннель (он уже есть), в ещё 1 туннель, поэтому транспортный режим дефолтного сета то, что нужно. Зашифруется только нагрузка (это у нас GRE и всё, что в него инкапсулировано), заголовок IP останется от исходного GRE. Теперь мапа:

R1(config)# crypto map R1-R2-MAP 1 ipsec-isakmp
R1(config-crypto-map)# match address 101 
R1(config-crypto-map)# set peer 10.10.10.2

А где сет? Дело в том, что привязка Transform Set не является обязательной для Crypto Map:

% NOTE: This new crypto map will remain disabled until a peer and a valid access list have been configured.

Достаточно пира и ACL. Как раз не привязывая сет мы даём понять, что хотим использовать дефолтный сет. Если пир или ACL не указан для мапы, то она имеет следующий вид в конфигурации:

crypto map R1-R2-MAP 1 ipsec-isakmp
! Incomplete
set peer 10.10.10.2
! access-list has not been configured yet
match address 101

Дополнительные возможности мапы использовать не будем.

Вешаем мапу на интерфейс:

R1(config)# interface GigabitEthernet 0/0
R1(config-if)# crypto map R1-R2-MAP
Обработка пакета

Резонный вопрос: а почему интерфейс для мапы GigabitEthernet 0/0, а не Tunnel 1? Во-первых, можно вешать только определённые мапы на туннельный интерфейс:

R2(config)# interface Tunnel1
R2(config-if)# crypto map R1-R2-MAP

% NOTE: crypto map is configured on tunnel interface.
Currently only GDOI crypto map is supported on tunnel interface.

Во-вторых, потому что Tunnel 1 это логический интерфейс, который занимается упаковкой обычного IP пакета в пакет GRE, а далее пакет GRE пересылается уже через физический интерфейс. Этот интерфейс GigabitEthernet 0/0. Там мы этот пакет мы и ловим мапой.

На логический интерфейс можно повесить для тех же целей IPSec Profile, так делается в DMVPN (применение IPSec Profile  за пределами этой статьи).

Тут чуть подробнее, так как это важно. Пакет от 192.168.1.2 к 192.168.2.2 отправляется компьютером PC1 сначала на шлюз по умолчанию 192.168.1.1. Это наш роутер R1. Роутер начинает просматривать таблицу маршрутизации:

R1# show ip route

Gateway of last resort is 10.10.10.2 to network 0.0.0.0

S* 0.0.0.0/0 [1/0] via 10.10.10.2
10.0.0.0/8 is variably subnetted, 4 subnets, 2 masks
C 10.10.10.0/30 is directly connected, GigabitEthernet0/0
L 10.10.10.1/32 is directly connected, GigabitEthernet0/0
C 10.10.100.0/30 is directly connected, Tunnel1
L 10.10.100.1/32 is directly connected, Tunnel1
192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.1.0/24 is directly connected, GigabitEthernet0/1
L 192.168.1.1/32 is directly connected, GigabitEthernet0/1
S 192.168.2.0/24 [1/0] via 10.10.100.2

Стоить отметить, что выделенный маршрут добавится в таблицу маршрутизации только когда IP адрес 10.10.100.2 станет достижимым, то есть когда работает туннель. После просмотра таблицы выделенный маршрут будет признан оптимальным для пересылки пакета (1 проход). Далее по таблице маршрутизации роутер будет искать через какой интерфейс отправить пакет для 10.10.100.2 (2 проход) и выберет строку:

C 10.10.100.0/30 is directly connected, Tunnel1

Связанный интерфейс Tunnel 1, пакет будет отправлен на этот интерфейс. После чего роутер не может оправить пакет через логический интерфейс, будет просмотрена конфигурация туннеля:

R1(config-if)# tunnel source GigabitEthernet 0/0

Далее будет произведена упаковка нашего пакета в GRE и отправка на GigabitEthernet 0/0. Далее пакет отбирается мапой, так как он удовлетворяет Crypto ACL, шифруется. В IP заголовке, в поле Protocol заменяется протокол с  47 (GRE) на 50 (ESP). Шифрованный пакет выстреливается через GigabitEthernet 0/0.

На самом тут были даны некоторые допущения ради наглядности: ничего роутер в таблице маршрутизации искать не будет, да ещё в несколько проходов. Активен и работает CEF, все возможные маршруты просчитаны и роутер сразу знает, что делать с пакетом:

R1#show ip cef

..
192.168.2.0/24 10.10.100.2 Tunnel1
...
NAT

Как уже говорилось NAT не мешает работе туннеля. Почему так происходит? NAT применяется к пакету во время прохождения им GigabitEthernet 0/0 (до отработки привязанной мапы). Поскольку до прибытия на GigabitEthernet 0/0 пакет инкапсулируется в GRE, где у него меняется IP заголовок и соответственно IP отправителя и IP получателя в заголовке (на 10.10.10.1 и 10.10.10.2 для R1), то ACL 1, привязанный к нату, отбросит пакет. Пакет будет отправлен через GigabitEthernet 0/0 без натирования. Захватывание пакета мапой с помощью ACL 101 и упаковка в ESP происходит позже и уже никак не влияет.

Вывод

Интерфейс IP туннеля (10.10.100.1 для R1) нужен только для для инкапсуляции пакета в GRE. На него завязана некоторая маршрутизация, но всё это для выполнения основной задачи — передать пакет для инкапсуляции.

Разрешение трафика IPSec

Берём ACL из первой части:

R1(config)# ip access-list extended firewall_acl 
R1(config-ext-nacl)# permit udp host 10.10.10.2 host 10.10.10.1 eq isakmp 
R1(config-ext-nacl)# permit esp host 10.10.10.2 host 10.10.10.1
R1(config-ext-nacl)# permit icmp any host 10.10.10.1 echo
R1(config-ext-nacl)# permit icmp any host 10.10.10.1 echo-replay

Разрешение трафика GRE не нужно, так как поверху обёрнут ESP и что там у него внутри неважно. Вешаем на интерфейс:

R1(config)# interface GigabitEthernet 0/0 
R1(config-if)# ip access-group firewall_acl in

Проверка GRE over IPSec

Основные настройки и состояния после установления IPSec туннеля рассматривались в первой части. Здесь всё тоже самое. Повторяться нет смыла. Лучше проверим, что GRE действительно запаковывается в ESP:

CISCO IPSec

Все нормально, нагрузка шифрованная.

OSPF

Проверим работоспособность протокола маршрутизации. Для этого создадим интерфейсы Loopback:

R1(config)# interface loopback 0
R1(config-if)# ip address 172.16.10.1 255.255.255.0

R2(config)# interface loopback 0
R2(config-if)# ip address 172.16.20.1 255.255.255.0

Теперь настроим OSPF:

R1(config)# router ospf 1
R1(config-router)# network 172.16.10.0 0.0.0.255 area 0
R1(config-router)# network 10.10.100.0 0.0.0.3 area 0

R2(config)# router ospf 101
R2(config-router)# network 172.16.20.0 0.0.0.255 area 0
R2(config-router)# network 10.10.100.0 0.0.0.3 area 0

Роутеры R1 и R2 сформировали отношения смежности через туннель, мультикаст работает:

*Aug 17 15:11:20.514: %OSPF-5-ADJCHG: Process 1, Nbr 172.16.20.1 on Tunnel1 from LOADING to FULL, Loading Done

Проверим работу маршрутизации:

R1# ping 172.16.20.1 source 172.16.10.1

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 172.16.20.1, timeout is 2 seconds:
Packet sent with a source address of 172.16.10.1
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 5/6/7 ms

Работает, на этом всё. Полные конфы R1 и R2.


Keepalive

Механизм работы GRE Keepalive рассказан в статье CISCO GRE. Оставил Keepalive напоследок, потому как в данной статье (в самом конце) Keepalive мешал работе. Проверяем:

R1(config)# interface tunnel 1
R1(config-if)# keepalive 5 2

R2(config)# interface tunnel 1 
R2(config-if)# keepalive 5 2

Ждём 15 секунд, если есть проблемы, то за это время Line Protocol интерфейса Tunnel 1 должен перейти в Down. Смотрим:

R1# show interfaces Tunnel 1

Tunnel1 is up, line protocol is up
Hardware is Tunnel
Internet address is 10.10.100.1/30
MTU 17916 bytes, BW 100 Kbit/sec, DLY 50000 usec,
reliability 255/255, txload 1/255, rxload 1/255
Encapsulation TUNNEL, loopback not set
Keepalive set (5 sec), retries 2

Почему так происходит? Да потому что у нас все пакеты, пересылаемые по туннелю шифруются, включая пакеты Keepalive. Соответственно последние нормально доходят:

CISCO IPSec

Вывод: наша реализация GRE over IPSec на Crypto Map лучше, чем реализация на Crypro IPSec Profile.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *