Перейти к содержанию

Juniper SRX и Cisco ASA: серия очередная

Первый раз строить IPSec между Juniper SRX и Cisco ASA мне довелось ещё в далёком 2014 году. Уже тогда это было весьма болезненно, потому что проблем было много (обычно — разваливающийся при регенерации туннель), диагностировать было сложно (ASA стояла у нашего заказчика, поэтому возможности для дебага были ограничены), но как-то это работало.

С той поры и рекомендованный JunOS для SRX обновился на 15.1 (для линейки SRX300, по крайней мере), и ASA научилась в route based IPSec (c версии софта 9.8), что несколько упрощает настройку. И вот на текущей работе не так давно представился шанс снова собрать такую схему. И снова неудачно — при регенерации туннель благополучно падал (и не всегда поднимался без ручного рестарта). И снова в логах тишина и непонятки, а т.к. ASA находилась у нашего партнёра, то и дебажить, соответственно, не было никакой возможности.И вот теперь представился случай собрать схему, при которой обе стороны (и SRX, и ASA) находятся под нашим управлением, соответственно, поиграться можно на славу.

Диспозиция

Итак, что у нас имеется:

  • Juniper SRX340, JunOS 15.1X49D150.2
  • Cisco ASA 5506 asa 9.8.4
  • route based IPSec между ними (роутинг будет обеспечиваться BGP, о нём тоже скажу пару слов)

Схема

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

Juniper

Начнём с конфигурации SRX. У меня довольно много различных туннелей строится на SRX, в итоге я пришёл примерно к такой схеме:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
set security ike policy IKE-ASA mode main
set security ike policy IKE-ASA proposals SHA256-AES128-5-86400
set security ike policy IKE-ASA pre-shared-key ascii-text ...

set security ike gateway GW-ASA ike-policy IKE-ASA
set security ike gateway GW-ASA address 192.0.2.2
set security ike gateway GW-ASA dead-peer-detection interval 10
set security ike gateway GW-ASA dead-peer-detection threshold 3
set security ike gateway GW-ASA local-identity inet 198.51.100.2
set security ike gateway GW-ASA external-interface ae0.4
set security ike gateway GW-ASA version v2-only

set security ipsec vpn VPN-ASA bind-interface st0.7
set security ipsec vpn VPN-ASA df-bit clear
set security ipsec vpn VPN-ASA vpn-monitor source-interface st0.7
set security ipsec vpn VPN-ASA vpn-monitor destination-ip 169.254.100.2
set security ipsec vpn VPN-ASA ike gateway GW-ASA
set security ipsec vpn VPN-ASA ike ipsec-policy SHA256-AES128-3600-14-policy
set security ipsec vpn VPN-ASA establish-tunnels immediately

set interfaces st0 unit 7 description "ASA AnyConnect router"
set interfaces st0 unit 7 family inet mtu 1436
set interfaces st0 unit 7 family inet address 169.254.100.1/30

set routing-options static route 192.0.2.2/32 next-hop 198.51.100.1

set security zones security-zone ZONE-VPN interfaces st0.7 host-inbound-traffic system-services ping
set security zones security-zone ZONE-VPN interfaces st0.7 host-inbound-traffic system-services ike
set security zones security-zone ZONE-VPN interfaces st0.7 host-inbound-traffic system-services traceroute
set security zones security-zone ZONE-VPN interfaces st0.7 host-inbound-traffic protocols bgp

Видно, что используется IKEv2, без traffic-selectors (у нас в арсенале и без того достаточно средств, чтобы ограничить хождение трафика — от префикс-листов BGP до security policies). До кучи используется DPD (dead peer detection) и vpn-monitor (у них немного разный тип проверок, для надёжности я использую оба).

Cisco

Конфигурация ASA:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
crypto ipsec ikev2 ipsec-proposal SHA256-AES128
 protocol esp encryption aes-256 aes-192 aes
 protocol esp integrity sha-256

crypto ipsec profile IPSEC-PROFILE-AMS1-VPN2
 set ikev2 ipsec-proposal SHA256-AES128
 set pfs group14
 set security-association lifetime kilobytes unlimited
 set security-association lifetime seconds 3600

crypto ikev2 policy 1
 encryption aes-256 aes-192 aes
 integrity sha256
 group 5
 prf sha256
 lifetime seconds 86400
 
tunnel-group 198.51.100.2 type ipsec-l2l
tunnel-group 198.51.100.2 ipsec-attributes
 isakmp keepalive threshold 30 retry 10
 ikev2 remote-authentication pre-shared-key ...
 ikev2 local-authentication pre-shared-key ...

crypto ikev2 enable outside

interface Tunnel7
 nameif l2l-ams1-vpn2
 ip address 169.254.100.2 255.255.255.252
 tunnel source interface outside
 tunnel destination 198.51.100.2
 tunnel mode ipsec ipv4
 tunnel protection ipsec profile IPSEC-PROFILE-AMS1-VPN2

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

Сравнение конфигов

IKE policy / proposal

1
2
3
4
5
6
crypto ikev2 policy 1
 encryption aes-256 aes-192 aes
 integrity sha256
 group 5
 prf sha256
 lifetime seconds 86400
1
2
3
4
5
6
7
8
9
10
set security ike proposal SHA256-AES128-5-86400 description ike-phase1-proposal1
set security ike proposal SHA256-AES128-5-86400 authentication-method pre-shared-keys
set security ike proposal SHA256-AES128-5-86400 dh-group group5
set security ike proposal SHA256-AES128-5-86400 authentication-algorithm sha-256
set security ike proposal SHA256-AES128-5-86400 encryption-algorithm aes-128-cbc
set security ike proposal SHA256-AES128-5-86400 lifetime-seconds 86400

set security ike policy IKE-ASA mode main
set security ike policy IKE-ASA proposals SHA256-AES128-5-86400
set security ike policy IKE-ASA pre-shared-key ascii-text ...

Здесь начинается некоторая путаница в терминологии. То, что у Cisco называется IKE policy, у Juniper — IKE Proposal. А IKE policy у Juniper похоже на tunnel group у ASA… Лично мне больше нравится подход Juniper, но тут, безусловно, дело привычки. Надо сказать, настройка IKEv2 (тем более route based) на ASA выглядит всё же куда логичнее, чем crypto maps и прочее безобразие, которое было раньше.

IPSec policy/proposal

1
2
3
4
5
6
7
8
9
crypto ipsec ikev2 ipsec-proposal SHA256-AES128
 protocol esp encryption aes-256 aes-192 aes
 protocol esp integrity sha-256

crypto ipsec profile IPSEC-PROFILE-SHA256-AES128-3600-14
 set ikev2 ipsec-proposal SHA256-AES128
 set pfs group14
 set security-association lifetime kilobytes unlimited
 set security-association lifetime seconds 3600
1
2
3
4
5
6
7
8
9
set security ipsec proposal SHA256-AES128-3600 description ipsec-phase2-proposal
set security ipsec proposal SHA256-AES128-3600 protocol esp
set security ipsec proposal SHA256-AES128-3600 authentication-algorithm hmac-sha-256-128
set security ipsec proposal SHA256-AES128-3600 encryption-algorithm aes-128-cbc
set security ipsec proposal SHA256-AES128-3600 lifetime-seconds 3600

set security ipsec policy SHA256-AES128-3600-14-policy description SHA256-AES128-3600-14-policy
set security ipsec policy SHA256-AES128-3600-14-policy perfect-forward-secrecy keys group14
set security ipsec policy SHA256-AES128-3600-14-policy proposals SHA256-AES128-3600

Здесь оба вендора делают плюс-минус одинаково — сначала создаём proposal с параметрами шифрования/аутентификации, а потом навешиваем на него lifetime и pfs.

Gateway

1
2
3
4
5
tunnel-group 176.56.179.13 type ipsec-l2l
tunnel-group 176.56.179.13 ipsec-attributes
 isakmp keepalive threshold 30 retry 10
 ikev2 remote-authentication pre-shared-key ...
 ikev2 local-authentication pre-shared-key ...
1
2
3
4
5
6
7
set security ike gateway GW-ASA ike-policy IKE-ASA-LEGAL
set security ike gateway GW-ASA address 192.0.2.2
set security ike gateway GW-ASA dead-peer-detection interval 10
set security ike gateway GW-ASA dead-peer-detection threshold 3
set security ike gateway GW-ASA local-identity inet 198.51.100.2
set security ike gateway GW-ASA external-interface ae0.4
set security ike gateway GW-ASA version v2-only

А здесь отличия уже более явные. На ASA PSK указывается непосредственно в настройках пира. Juniper же позволяет здесь задать и исходящий интерфейс и дополнительные опции типа local-identity, плюс ссылается на ike policy (где мы указывали PSK). Кстати, если вы захотите переделать на ASA IKEv2 в IKEv1 (и наоборот), то у Cisco надо будет пересоздавать всю tunnel-group. А на SRX всего лишь сменить одну строчку. (Правда, далее при commit могут вылезти несовместимые опции, но это уже детали)

VPN / VTI

1
2
3
4
5
6
7
interface Tunnel7
 nameif l2l-ams1-vpn2
 ip address 169.254.100.2 255.255.255.252
 tunnel source interface outside
 tunnel destination 198.51.100.2
 tunnel mode ipsec ipv4
 tunnel protection ipsec profile IPSEC-PROFILE-SHA256-AES128-3600-14
1
2
3
4
5
6
7
8
9
10
11
set security ipsec vpn VPN-ASA bind-interface st0.7
set security ipsec vpn VPN-ASA df-bit clear
set security ipsec vpn VPN-ASA vpn-monitor source-interface st0.7
set security ipsec vpn VPN-ASA vpn-monitor destination-ip 169.254.100.2
set security ipsec vpn VPN-ASA ike gateway GW-ASA
set security ipsec vpn VPN-ASA ike ipsec-policy SHA256-AES128-3600-14-policy
set security ipsec vpn VPN-ASA establish-tunnels immediately

set interfaces st0 unit 7 description "AnyConnect router"
set interfaces st0 unit 7 family inet mtu 1436
set interfaces st0 unit 7 family inet address 169.254.100.1/30

И снова конфиг Juniper мне кажется более логичным. VPN настраивается отдельно (он может быть и policy-based), сам security tunnel — отдельно. Отдельное спасибо за «establish-tunnels immediately». Очень полезная опция ;) (цисководы поймут, о чём я). Ещё один «бонус» SRX — можно строить многоточечные IPSec, как с автообнаружением пиров (работает, к сожалению, только между SRX), так с ручным роутингом. Это, конечно, не полноценный DMVPN, но жизнь в сетапах типа «один центр — много филиалов» значительно облегчает.

Interfaces

Отдельно остановлюсь на настройке интерфейсов, на которых строится IPSec. У Juniper это, соответственно, ae0.4, у ASA — outside

1
crypto ikev2 enable outside
1
2
3
4
set security zones security-zone ZONE-INTERNET interfaces ae0.4 host-inbound-traffic system-services ike
set security zones security-zone ZONE-VPN interfaces st0.7 host-inbound-traffic system-services ping
set security zones security-zone ZONE-VPN interfaces st0.7 host-inbound-traffic system-services traceroute
set security zones security-zone ZONE-VPN interfaces st0.7 host-inbound-traffic protocols bgp

На интерфейсах нужно разрешить ike, иначе работать ничего не будет :) Дополнительно, у SRX нужно для туннельного интерфейса разрешить bgp/ipsec/whatever для входящих подключений на st0.x интерфейсе

Настройка BGP

Тут всё довольно банально (с одной стороны)

1
2
3
4
5
6
7
8
9
10
11
12
13
set protocols bgp group ASA type external
set protocols bgp group ASA description "AnyConnect router"
set protocols bgp group ASA hold-time 30
set protocols bgp group ASA import IMPORT-EBGP-ASA
set protocols bgp group ASA export EXPORT-EBGP-ASA
set protocols bgp group ASA local-as 64666
set protocols bgp group ASA neighbor 169.254.100.2 peer-as 65001

set policy-options policy-statement EXPORT-EBGP-ASA term 0 from route-filter 10.0.0.0/8 exact
set policy-options policy-statement EXPORT-EBGP-ASA term 0 then accept
set policy-options policy-statement EXPORT-EBGP-ASA term 1 then reject

set policy-options policy-statement IMPORT-EBGP-ASA term 1 then reject

На ASA отдаём агрегированный префикс нашей локалки — у меня это будет 10/8. От ASA ничего не принимаем, потому что с версии софта 9.8.4 всё равно нельзя анонсировать по BGP адреса management-интерфейсов (что объяснимо) и BVI (что жутко неудобно). Но если у вас за ASA есть ещё какие-то сети, их нужно будет добавить в policy, конечно.

1
2
asa(config-router-af)# network 10.255.32.252 mask 255.255.255.254
ERROR: BGP configuration not supported on management-only/BVI interface

Чтобы «увидеть» inside интерфейс, нужно будет на SRX прописать static route в сторону ipsec:

1
set routing-options static route 10.255.32.252/31 next-hop 169.254.100.2

Вдобавок, ASA до сих пор не умеет в loopback интерфейсы, поэтому все логи/netflow и прочая мы будем отправлять с inside.В ASA5506 есть встроенный свич, поэтому можно использовать виртуальный BVI-интерфейс (особенно полезно, когда у вас схема «роутер-на-палочке», и используется всего лишь один физический порт.

1
2
3
4
5
interface BVI1
 nameif inside
 security-level 100
 ip address 10.255.32.253 255.255.255.254
management-access inside

После этого в нужных местах (logging, snmp, flow) в качестве интерфейса-источника нужно будет указать `inside`.

Если что-то пошло не так a.k.a. troubleshooting

IKE/IPSec

Первое — у вас должны установиться обе фазы IPSec (у Juniper это, собственно, IKE/IPSec). Смотрим:

1
2
3
4
5
6
7
8
9
admin@srx> show security ike security-associations
Index   State  Initiator cookie  Responder cookie  Mode           Remote Address  
2128190 UP     ae7d7d447326218a  2be3b3004ae0e36a  IKEv2          192.0.2.2    

admin@srx> show security ipsec security-associations  
  Total active tunnels: 6
  ID    Algorithm       SPI      Life:sec/kb  Mon lsys Port  Gateway  
  <131077 ESP:aes-cbc-128/sha256 fec3c7d1 2867/ unlim U root 500 192.0.2.2    
  >131077 ESP:aes-cbc-128/sha256 74d792ca 2867/ unlim U root 500 192.0.2.2

На ASA:

1
2
3
4
5
6
7
8
9
10
11
12
13
asa# sho crypto ikev2 sa

IKEv2 SAs:

Session-id:5, Status:UP-ACTIVE, IKE count:1, CHILD count:1

Tunnel-id Local                                               Remote                                                  Status         Role
585564345 192.0.2.2/500                                  198.51.100.2/500                                        READY    RESPONDER
      Encr: AES-CBC, keysize: 128, Hash: SHA256, DH Grp:5, Auth sign: PSK, Auth verify: PSK
      Life/Active Time: 86400/47018 sec
Child sa: local selector  0.0.0.0/0 - 255.255.255.255/65535
          remote selector 0.0.0.0/0 - 255.255.255.255/65535
          ESP spi in/out: 0xc989d9ea/0xcca8b6d5

У Juniper ещё можно посмотреть статистику по ipsec-туннелю, включая причины падения:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
admin@srx> show security ipsec security-associations index 131078 detail

ID: 131078 Virtual-system: root, VPN Name: VPN-ASA-LEGAL-PL
  Local Gateway: 198.51.100.2, Remote Gateway: 192.0.2.2
  Local Identity: ipv4_subnet(any:0,[0..7]=0.0.0.0/0)
  Remote Identity: ipv4_subnet(any:0,[0..7]=0.0.0.0/0)
  Version: IKEv2
  DF-bit: clear, Copy-Outer-DSCP Disabled, Bind-interface: st0.7
  Port: 500, Nego#: 734, Fail#: 0, Def-Del#: 0 Flag: 0x600a29
  Tunnel events:
    Mon Dec 09 2019 13:40:35: IPSec SA rekey successfully completed (48 times)
    Mon Dec 09 2019 00:30:47: IKE SA rekey successfully completed (10 times)
    Fri Nov 29 2019 02:13:55: IPSec SA negotiation successfully completed (1 times)
    Fri Nov 29 2019 02:13:55: IKE SA negotiation successfully completed (1 times)
    Fri Nov 29 2019 02:13:55: No response from peer. Negotiation failed (7 times)
    Fri Nov 29 2019 02:10:14: DPD detected peer as down. Existing IKE/IPSec SAs cleared (1 times)
    Fri Nov 29 2019 01:39:15: IPSec SA rekey successfully completed (1 times)
    Fri Nov 29 2019 00:49:50: IPSec SA negotiation successfully completed (1 times)
    Fri Nov 29 2019 00:49:50: IKE SA negotiation successfully completed (1 times)
    Fri Nov 29 2019 00:49:30: No response from peer. Negotiation failed (23 times)
    Fri Nov 29 2019 00:37:24: DPD detected peer as down. Existing IKE/IPSec SAs cleared (1 times)
    Fri Nov 29 2019 00:30:00: IPSec SA rekey successfully completed (77 times)
    Thu Nov 28 2019 20:11:31: IKE SA rekey successfully completed (7 times)
    Tue Nov 26 2019 08:51:44: IPSec SA negotiation successfully completed (1 times)
    Thu Nov 21 2019 21:24:32: IKE SA negotiation successfully completed (1 times)
    Thu Nov 21 2019 01:06:27: IKE SA rekey successfully completed (6 times)
  Direction: inbound, SPI: 4bd2e2bd, AUX-SPI: 0
                              , VPN Monitoring: UP
    Hard lifetime: Expires in 3132 seconds
    Lifesize Remaining:  Unlimited
    Soft lifetime: Expires in 2495 seconds
    Mode: Tunnel(10 10), Type: dynamic, State: installed
    Protocol: ESP, Authentication: hmac-sha256-128, Encryption: aes-cbc (128 bits)
    Anti-replay service: counter-based enabled, Replay window size: 64
  Direction: outbound, SPI: 504f306e, AUX-SPI: 0
                              , VPN Monitoring: UP
    Hard lifetime: Expires in 3132 seconds
    Lifesize Remaining:  Unlimited
    Soft lifetime: Expires in 2495 seconds
    Mode: Tunnel(10 10), Type: dynamic, State: installed
    Protocol: ESP, Authentication: hmac-sha256-128, Encryption: aes-cbc (128 bits)
    Anti-replay service: counter-based enabled, Replay window size: 64

Если с IPSec всё в порядке, то нужно смотреть на ACL (security policies, host-inbound правила и т.д.). На крайней случай, можно попробовать перезагрузить коробку (ASA) — мне, бывало, помогает.

BGP

Здесь всё довольно стандартно — если сессия не устанавливается, можно посмотреть через

1
capture
, летят ли BGP-hello в обе стороны.

На этом всё. Не знаю, виной ли тому новый софт, или звёзды так сошлись — но туннель ASA<>SRX держится стабильно и не падает раз в сутки, как было раньше.Надеюсь, у вас тоже всё получится!

Будьте первым, кто оставит комментарий

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

    %d такие блоггеры, как: