Cisco Site-to-Site IPsec VPNs

Наконец-то долгожданная практика ,)

В этой статье мы рассмотрим два простых случая построения site-to-site VPN на оборудовании Cisco. В первом случае оба устройства имеют белые адреса (static crypto map), а во втором один из маршрутизаторов оказывается за NAT (dynamic crypto map). Ну и в качестве бонуса рассмотрим ситуацию совместного сожительства и static и dynamic crypto map на одном маршрутизаторе.

Те, кому лень читать 1000+ слов могут перейти сразу к конфигурациям, располагающимся в самом конце статьи.

Шаг 0, который вы должны предпринять в боевых условиях – это убедится в том, что IPsec трафик сможет дойти до вашего маршрутизатора. Если перед маршрутизатором стоит МСЭ или же сам маршрутизатор защищен ACL, CBAC, ZBF, you name it убедитесь в том, что разрешены протоколы AH и ESP (протоколы второй фазы ISAKMP/IKE), а так же устройство в состоянии получать udp сегменты на порты 500 (первая фаза ISAKMP/IKE) и/или 4500 (NAT-T).

И так, поехали. Включим ISAKMP:

Rx (config)# crypto isakmp enable

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

Rx (config)# crypto isakmp policy #_политики 
Rx (config-isakmp)# encryption [ des | 3des | aes ] 
Rx (config-isakmp)# hash [ sha | md5 ]
Rx (config-isakmp)# group [ 1 | 2 | 5 | 14-16 | 19 | 20 | 24 ]
Rx (config-isakmp)# lifetime seconds
Rx (config-isakmp)# authentication [ rsa-sig | rsa-encr | pre-share ]

Если какой-то из параметров будет не указан, то iOS установит его в значение по умолчанию, которое выделено красным.

Чтобы посмотреть все политики достаточно в exec mode подать команду show crypto isakmp policy.

Устройства установят управляющее соединение только после того, как совпадет хотя бы одна ISAKMP/IKE политика, а точнее такие параметры в политике, как алгоритм шифрования, хэш-функция, DH группа и метод аутентификации. Lifetime значение будет принято наименьшим из двух политик.

В процессе установки соединения, как вы помните, соседи обмениваются всем списком политик и сравнение начинается с самой маленькой по порядковому номеру и соответственно самой безопасной с точки зрения устройства.

IKE dead peer detection (DPD) – а не погиб ли наш сосед?

Что еще стоит сделать в этой части, так это включить механизм, который определяет доступен ли сосед. Делается это с помощью команды crypto isakmp keepalive seconds [retries] [periodic].

Решение проблем первой фазы осуществляется с помощью debug crypto isakmp.

Аутентификация устройств первой фазы с помощью pre-shared key выполняется так:

Rx(config)# crypto isakmp key секретный_ключ remote_ip [subnet_mask] [no-xauth]

В случае если IP адрес соседа не известен (динамический NAT) или перед вами не стоит задачи аутентифицировать каждого соседа по отдельности, то можно использоваться wildcards:

Rx(config)#crypto isakmp key secret_key address 0.0.0.0 0.0.0.0 no-xauth

На этом можно считать, что с фазой 1 мы закончили.

В процессе настройки второй фазы нам предстоит указать какой трафик защищать (crypto acl), как его защищать (transform set) и до кого его защищать (crypto map).

Crypto acl по сути являются обычными acl. Могут быть именованными и нумерованными. Имейте ввиду, что crypto acl предполагают только одно значение permit.

Transform set – представляет собой список параметров с помощью которых вы собираетесь защищать канал передачи данных. Для успешного завершения второй фазы у каждого из соседов должен быть хотя бы один совпадающий transofrm set. В transofrm set вы можете использовать только один параметр каждого типа:

Тип Параметр
AH ah-md5-hmac
ah-sha-hmac
ESP аутентификация esp-md5-hmac
esp-sha-hmac
ESP шифрование esp-null
esp-des
esp-3des
esp-seal
esp-aes 128
esp-aes 192
esp-aes-256
Сжатие comp-lzs

Создается transform set следующим образом:

Rx (config)# crypto ipsec transform-set tset-name value1 [ value2 [ value3 [ value4 ]]]
Crypto map

Функцией crypto map является совмещение всех параметров (crypto acl, transfort set, адрес или имя хоста соседа, адрес с которого надо отправлять данные) необходимых для управляющего канала первой фазы и защищенного канала передачи данных, который устанавливается в процессе фазы 2. Существует static и dynamic crypto map. Crypto map привязываются к интерфейсам, только одна static  crypto map может быть активной на интерфейсе. Одна и та же static crypto map может быть активной на нескольких интерфейсах.

Static crypto map

Могут быть построены как с помощью ISAKMP, так и без. Последний вариант в рамках это статьи рассматриваться не будет, но вы можете познакомится с ним по ссылке http://www.cisco.com/en/US/tech/tk583/tk372/technologies_configuration_example09186a0080093c26.shtml

С использованием ISAKMP crypto map создается следующим образом:

Rx(config)# crypto map name #_number ipsec-isakmp 
Rx(config-crypto-m)# match address crypto_acl_name_or_# 
Rx(config-crypto-m)# set peer [ hostname | ip_addr ] 
Rx(config-crypto-m)# set transform-set tset-name1 [ ... tsetname6]

Для просмотра crypto map есть команда show crypto map [ interface interface | tag name ]

Чтобы активировать static crypto map достаточно сделать следующее:

Rx(config)# interface interface Rx(config-if)# crypto map name 

 

Dynamic crypto map

C static crypto map есть небольшая проблема – вам необходимо знать адрес соседа. В ситуации когда сосед находится за nat или адреса ему провайдер выдает автоматически придется использовать dynamic crypto map.  Вот где wild-carded pre-shared key сияет во всей красе :)

По хорошему счету dynamic crypto map – эта та же static crypto map, только параметры, которые раньше были завязаны на адрес соседа банально опускаются, что оставляет нам:

Rx(config)# crypto dynamic-map name #_number 
Rx(config-crypto-m)# set transform-set tset-name1 [ ... tsetname6]

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

show crypto dynamic-map [tag name] показывает dynamic map легко и непринужденно.

Чтобы активировать dynamic crypto map вам нужно включить ее в статическую крипто карту. К слову это и позволяет использовать static l2l, dynamic l2l и remote access на одном маршрутизаторе. Так же желательно (cisco best practice), но не обязательно давать dynamic crypto map номера выше, чем статическим.

Включается dynamic в static следующим образом:

Rx(config)# crypto map stat_map_name #_number ipsec-isakmp dynamic dyn_map_name

Далее static_map_name активируется на интерфейсе так же как и любая другая статичная крипто карта.

Putting all together

Лабораторный стэнд:

Сочные конфиги для самых терпиливых:

case 1: R1 <=> R2 Static crypto map

R1(config)#crypto isakmp enable
! политики первой фазы
R1(config)#crypto isakmp policy 10
R1(config-isakmp)#encryption aes 128
R1(config-isakmp)#hash md5
R1(config-isakmp)#group 2
R1(config-isakmp)#authentication pre-share
R1(config-isakmp)#lifetime 120
R1(config)#crypto isakmp keepalive 30 periodic
! ключ аутентификации
R1(config)#crypto isakmp key DERKEY address 10.2.2.1 255.255.255.255 no-xauth
! crypto acl
R1(config)#ip access-list extended cacl-r2
R1(config-ext-nacl)#permit ip 192.168.1.0 0.0.0.255 192.168.2.0 0.0.0.255 log
! transform set фазы 2
R1(config)#crypto ipsec transform-set tset1 esp-aes 128 esp-md5-hmac
R1(cfg-crypto-trans)#mode tunnel
! static crypto map
R1(config)#crypto map stat-cmap 100 ipsec-isakmp
R1(config-crypto-map)#match address cacl-r2
R1(config-crypto-map)#set peer 10.2.2.1
R1(config-crypto-map)#set transform-set tset1
R1(config)#interface fa0/1
R1(config-if)#crypto map stat-cmap
R1#ping 192.168.2.1 so 192.168.1.1
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 80 percent (4/5), round-trip min/avg/max = 104/142/180 ms
R2(config)#crypto isakmp enable
R2(config)#crypto isakmp policy 10
R2(config-isakmp)#encryption aes 128
R2(config-isakmp)#hash md5
R2(config-isakmp)#group 2
R2(config-isakmp)#authentication pre-share
R2(config-isakmp)#lifetime 120
R2(config)#crypto isakmp keepalive 30 periodic
R2(config)#crypto isakmp key DERKEY address 10.1.1.1 255.255.255.255 no-xauth
R2(config)#ip access-list extended cacl-r1
R2(config-ext-nacl)#permit ip 192.168.2.0 0.0.0.255 192.168.1.0 0.0.0.255 log
R2(config)#crypto ipsec transform-set tset1 esp-aes 128 esp-md5-hmac
R2(cfg-crypto-trans)#mode tunnel
R2(config)#crypto map stat-cmap 100 ipsec-isakmp
R2(config-crypto-map)#match address cacl-r1
R2(config-crypto-map)#set peer 10.1.1.1
R2(config-crypto-map)#set transform-set tset1
R2(config)#interface fa0/1
R2(config-if)#crypto map stat-cmap

case 2: R1 <=> R3 Dynamic crypto map

R1(config)#crypto isakmp enable
R1(config)#crypto isakmp policy 10
R1(config-isakmp)#encryption aes 128
R1(config-isakmp)#hash md5
R1(config-isakmp)#group 2
R1(config-isakmp)#authentication pre-share
R1(config-isakmp)#lifetime 120
R1(config)#crypto isakmp nat keepalive 10
R1(config)#crypto isakmp key DYNKEY address 0.0.0.0 0.0.0.0 no-xauth
R1(config)#ip access-list extended cacl-r3
R1(config-ext-nacl)#permit ip 192.168.1.0 0.0.0.255 192.168.3.0 0.0.0.255
R1(config)#crypto ipsec transform-set tset1 esp-aes 128 esp-md5-hmac
R1(cfg-crypto-trans)#mode tunnel
R1(config)#crypto dynamic-map dyn-cmap 1000
R1(config-crypto-map)#match address cacl-r3
R1(config-crypto-map)#set transform-set tset1
R1(config)#crypto map stat-cmap 200 ipsec-isakmp dynamic dyn-cmap
R1(config)#int fa0/1
R1(config-if)#crypto map stat-cmap
R3(config)#crypto isakmp enable
R3(config)#crypto isakmp policy 10
R3(config-isakmp)#encryption aes 128
R3(config-isakmp)#hash md5
R3(config-isakmp)#group 2
R3(config-isakmp)#authentication pre-share
R3(config-isakmp)#lifetime 120
R3(config)#crypto isakmp keepalive 30 periodic
R3(config)#crypto isakmp key DERKEY address 10.1.1.1 255.255.255.255 no-xauth
R3(config)#ip access-list extended cacl-r1
R3(config-ext-nacl)#permit ip 192.168.3.0 0.0.0.255 192.168.1.0 0.0.0.255 log
R3(config)#crypto ipsec transform-set tset1 esp-aes 128 esp-md5-hmac
R3(cfg-crypto-trans)#mode tunnel
R3(config)#crypto map stat-cmap 100 ipsec-isakmp
R3(config-crypto-map)#match address cacl-r1
R3(config-crypto-map)#set peer 10.1.1.1
R3(config-crypto-map)#set transform-set tset1
R3(config)#interface fa0/1
R3(config-if)#crypto map stat-cmap

 case 3: R1 <=> R2 / R3 Static & Dynamic crypto map

R1(config)#crypto isakmp policy 10
R1(config-isakmp)#encryption aes 128
R1(config-isakmp)#hash md5
R1(config-isakmp)#authentication pre-share
R1(config-isakmp)#group 2
R1(config-isakmp)#lifetime 120
R1(config)#crypto isakmp key DERKEY address 10.2.2.1 no-xauth
R1(config)#crypto isakmp key DYNKEY address 0.0.0.0 0.0.0.0 no-xauth
R1(config)#crypto isakmp keepalive 30 periodic
R1(config)#crypto isakmp nat keepalive 10
R1(config-if)#ip access-list extended cacl-r2
R1(config-ext-nacl)#permit ip 192.168.1.0 0.0.0.255 192.168.2.0 0.0.0.255 log
R1(config-if)#ip access-list extended cacl-r3
R1(config-ext-nacl)#permit ip 192.168.1.0 0.0.0.255 192.168.3.0 0.0.0.255
R1(config)#crypto ipsec transform-set tset1 esp-aes esp-md5-hmac
R1(cfg-crypto-trans)#crypto dynamic-map dyn-cmap 1000
R1(config-crypto-map)#set transform-set tset1
R1(config-crypto-map)#match address cacl-r3
R1(config-crypto-map)#crypto map stat-cmap 100 ipsec-isakmp
R1(config-crypto-map)#set peer 10.2.2.1
R1(config-crypto-map)#set transform-set tset1
R1(config-crypto-map)#match address cacl-r2
R1(config-crypto-map)#crypto map stat-cmap 200 ipsec-isakmp dynamic dyn-cmap
R1(config)#interface FastEthernet0/1
R1(config-if)#crypto map stat-cmap

Настройку R2 & R3 можно посмотреть выше.

И…

  • Anonymous

    Написали бы про isakmp profile, иначе не будут работать S2C на одном интерфейсе с S2S.

  • Без паники, все будет :)

  • Alex

    Rx (config)# crypto isakmp policy #_политики
    Rx (config-isakmp)# encapsulation [ des | 3des | aes ]
    исправьте на encryption

  • Поправил, спасибо.

  • Евгений

    скаджите а может быть несколько

    Аутентификаций устройств первой фазы с помощью pre-shared key

    crypto isakmp key [pass123] [ip1]

    crypto isakmp key [pass123] [ip2]

    crypto isakmp key [pass123] [ip3]

  • Почему бы и нет? :)

  • Аff

    Здравствуйте, не получается создать isakmp. В чем проблема?
    Router(config)#crypto isakmp enable
    ^
    % Invalid input detected at ‘^’ marker.

  • Какой IOS?

  • Aff

    15,1

  • А остальные команды вводятся? IOS не K8? фич сет не урезан?

  • Aff

    Cisco IOS Software, C2900 Software (C2900-UNIVERSALK9_NPE-M), Version 15.1(4)M3,
    RELEASE SOFTWARE (fc1)
    Compiled Tue 06-Dec-11 17:09 by prod_rel_team
    ROM: System Bootstrap, Version 15.0(1r)M15, RELEASE SOFTWARE (fc1)
    System image file is “flash0:c2900-universalk9_npe-mz.SPA.151-4.M3.bin”
    Last reload type: Normal Reloadipbase ipbasek9 Permanent ipbasek9
    security None None None
    uc None None None
    data None None None

  • Aff

    Я так понял что линейка NPE не поддерживает: IPSec VPN, L2TPoIPSec, SSLVPN, GETVPN, DMVPN, sRTP. Что с этим можно сделать? поможет ли обновление IOS или нужно докупать лицензии?

  • Aff

    Cisco CISCO2911/K9 (revision 1.0)

  • Aff, старайтесь не постить по 10 комментариев подряд. NPE – no payload encryption, но даже если вы зальете правильный IOS нужно еще активировать security feature set.
    Обратитесь к поставщику оборудования – он расскажет все грязные подробности.

  • Aff

    Получается без покупки security лицензии, шифрование и в том числе VPN невозможно?

  • все верно

  • Макс Юрчак

    Станислав, спасибо за ваши статьи. Дело в том, что сделал я так как у вас написанно. Вроде по по команде sh crypto session detail туннель поднялся, пинги до хостов на противоположных сторонах ходят. А вот сервисы вроде RDP не работают. Web сервисы не открываются.

  • Пальцем в небо – забыли указать исключения для NAT. Хотя ICMP в этом случае тоже не должен работать.

  • Макс Юрчак

    Если вы про запрет пакетов для сети В из сети А то они есть.
    deny ip A.A.A.A 0.0.0.255 B.B.B.B 0.0.0.255
    то есть запрещаем ходить в сеть В из сети А через NAT. стоит почти одним из самых первых правил.
    На самом деле интересная вещь, пытаясь получить доступ до HTTPS из сети А в сити В, сначала говорить, что подключение происходит по SSL и стоит просмотреть сертификат и принять его, отвечаешь “Да принять сертификат” и всё, потом висит загрузка сайта!