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, в итоге я пришёл примерно к такой схеме:
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:
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
crypto ikev2 policy 1
encryption aes-256 aes-192 aes
integrity sha256
group 5
prf sha256
lifetime seconds 86400
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
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
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
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 ...
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
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
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
crypto ikev2 enable outside
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
Тут всё довольно банально (с одной стороны)
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, конечно.
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:
set routing-options static route 10.255.32.252/31 next-hop 169.254.100.2
Вдобавок, ASA до сих пор не умеет в loopback интерфейсы, поэтому все логи/netflow и прочая мы будем отправлять с inside.В ASA5506 есть встроенный свич, поэтому можно использовать виртуальный BVI-интерфейс (особенно полезно, когда у вас схема “роутер-на-палочке”, и используется всего лишь один физический порт.
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). Смотрим:
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:
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-туннелю, включая причины падения:
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
Здесь всё довольно стандартно – если сессия не устанавливается, можно посмотреть через capture
, летят ли BGP-hello в обе стороны.
На этом всё. Не знаю, виной ли тому новый софт, или звёзды так сошлись – но туннель ASA<>SRX держится стабильно и не падает раз в сутки, как было раньше.Надеюсь, у вас тоже всё получится!