Cisco ASA VPNs: Spoke-to-Spoke Traffic via Hub

In dem Cisco Support-Forum kommt regelmäßig die Frage, wie man per VPN Spoke-zu-Spoke Kommunikation über den Hub leiten kann.
Diese Konfiguration wird hier gezeigt. Vorweg aber der Hinweis, dass bei Vorhaben wie diesen, IOS-Router oftmals die bessere Wahl sind, da sie dabei um ein vielfaches flexibler sind als die ASA.

Die Konfiguration wird anhand des folgenden Aufbaus für die ASA-Version 8.4+ gezeigt. Es beginnt mit der Hub-to-Spoke-Konfiguration, die dann später mit einer Spoke-to-Spoke-Kommunikation erweitert wird:

ASA-Hub-and-Spoke

Auf allen ASAs werden Phase1- und Phase2-Policies für IPSec benötigt. Diese sind natürlich nach dem eigenen Bedürfnis zu wählen:

crypto ikev1 policy 1
 authentication pre-share
 encryption aes 256
 hash sha
 group 5
 lifetime 86400
!
crypto ikev1 enable outside
!
crypto ipsec ikev1 transform-set ESP-AES256-SHA esp-aes-256 esp-sha-hmac

Auf allen ASAs werden die benötigten Object-Groups, ACLs, Crypto-Maps und Tunnel-Groups angelegt. Zusätzlich wird der Traffic vom NAT ausgenommen:

Spoke1:

object-group network SPOKE1-NETWORKS
 network-object 10.0.1.0 255.255.255.0
object-group network HQ-NETWORKS
 network-object 10.0.0.0 255.255.255.0
object-group network NAT-EXEMPTION-DESTINATIONS
 group-object HQ-NETWORKS
!
access-list VPN-SPOKE1-TO-HQ extended permit ip object-group SPOKE1-NETWORKS object-group HQ-NETWORKS
!
crypto map VPN 1 match address VPN-SPOKE1-TO-HQ
crypto map VPN 1 set peer 192.0.2.1
crypto map VPN 1 set ikev1 transform-set ESP-AES256-SHA
crypto map VPN interface outside
!
tunnel-group 192.0.2.1 type ipsec-l2l
tunnel-group 192.0.2.1 ipsec-attributes
 ikev1 pre-shared-key Th!sP$KHQ-Spoke1isN0Tc0mpl3xEnough
!
nat (any,outside) source static SPOKE1-NETWORKS SPOKE1-NETWORKS destination static NAT-EXEMPTION-DESTINATIONS NAT-EXEMPTION-DESTINATIONS no-proxy-arp route-lookup description NAT-Excempt for VPN

Spoke2:

object-group network SPOKE2-NETWORKS
 network-object 10.0.2.0 255.255.255.0
object-group network HQ-NETWORKS
 network-object 10.0.0.0 255.255.255.0
object-group network NAT-EXEMPTION-DESTINATIONS
 group-object HQ-NETWORKS
!
access-list VPN-SPOKE2-TO-HQ extended permit ip object-group SPOKE2-NETWORKS object-group HQ-NETWORKS
!
crypto map VPN 1 match address VPN-SPOKE2-TO-HQ
crypto map VPN 1 set peer 192.0.2.1
crypto map VPN 1 set ikev1 transform-set ESP-AES256-SHA
crypto map VPN interface outside
!
tunnel-group 192.0.2.1 type ipsec-l2l
tunnel-group 192.0.2.1 ipsec-attributes
 ikev1 pre-shared-key Th!sP$KHQ-Spoke2isN0Tc0mpl3xEnough
!
nat (any,outside) source static SPOKE2-NETWORKS SPOKE2-NETWORKS destination static NAT-EXEMPTION-DESTINATIONS NAT-EXEMPTION-DESTINATIONS no-proxy-arp route-lookup description NAT-Excempt for VPN

Hub:

object-group network SPOKE1-NETWORKS
 network-object 10.0.1.0 255.255.255.0
object-group network SPOKE2-NETWORKS
 network-object 10.0.2.0 255.255.255.0
object-group network HQ-NETWORKS
 network-object 10.0.0.0 255.255.255.0
object-group network NAT-EXEMPTION-DESTINATIONS
 group-object SPOKE1-NETWORKS
 group-object SPOKE2-NETWORKS
!
access-list VPN-HQ-TO-SPOKE1 extended permit ip object-group HQ-NETWORKS object-group SPOKE1-NETWORKS
!
access-list VPN-HQ-TO-SPOKE2 extended permit ip object-group HQ-NETWORKS object-group SPOKE2-NETWORKS
!
crypto map VPN 1 match address VPN-HQ-TO-SPOKE1
crypto map VPN 1 set peer 203.0.113.1
crypto map VPN 1 set ikev1 transform-set ESP-AES256-SHA
crypto map VPN 2 match address VPN-HQ-TO-SPOKE2
crypto map VPN 2 set peer 198.51.100.1
crypto map VPN 2 set ikev1 transform-set ESP-AES256-SHA
crypto map VPN interface outside
!
tunnel-group 203.0.113.1 type ipsec-l2l
tunnel-group 203.0.113.1 ipsec-attributes
 ikev1 pre-shared-key Th!sP$KHQ-Spoke1isN0Tc0mpl3xEnough
!
tunnel-group 198.51.100.1 type ipsec-l2l
tunnel-group 198.51.100.1 ipsec-attributes
 ikev1 pre-shared-key Th!sP$KHQ-Spoke2isN0Tc0mpl3xEnough

nat (any,outside) source static HQ-NETWORKS HQ-NETWORKS destination static NAT-EXEMPTION-DESTINATIONS NAT-EXEMPTION-DESTINATIONS no-proxy-arp route-lookup description NAT-Excempt for VPN

Mit der gegebenen Konfiguration kann zwischen Spoke1 und dem Hub, als auch zwischen Spoke2 und dem Hub per VPN kommuniziert werden.

Jetzt wird die VPN-Konfig um Spoke-to-Spoke-Kommunikation erweitert. Dabei soll jeder Spoke den Traffic für die anderen Spokes durch den schon bestehenden Tunnel zum Hub senden. Der Hub sendet den Traffic dann zum jeweiligen Spoke weiter.

Spoke1:

object-group network SPOKE2-NETWORKS
 network-object 10.0.2.0 255.255.255.0
object-group network NAT-EXEMPTION-DESTINATIONS
 group-object SPOKE2-NETWORKS
!
access-list VPN-SPOKE1-TO-HQ extended permit ip object-group SPOKE1-NETWORKS object-group SPOKE2-NETWORKS

Spoke2:

object-group network SPOKE1-NETWORKS
 network-object 10.0.1.0 255.255.255.0
object-group network NAT-EXEMPTION-DESTINATIONS
 group-object SPOKE1-NETWORKS
!
access-list VPN-SPOKE2-TO-HQ extended permit ip object-group SPOKE2-NETWORKS object-group SPOKE1-NETWORKS

Die Crypto-ACLs haben jetzt permit-statements für die Kommunikation zum Hub, als auch zum anderen Spoke. Weiterhin wird auch der Spoke-to-Spoke-Traffic nicht genatted da die Spoke-Ziele der NAT-Exemption-Object-Group hinzugefügt wurden. Die Crypto-ACLs könnte man durch eine weitere Object-Group für die VPN-Ziele natürlich noch eleganter konfigurieren.

Hub:
Auf der Hub-ASA müssen zwei Änderungen vorgenommen werden.
Als erstes werden die Crypto-ACL so erweitert, dass die Crypto-ACL zum Spoke 1 auch den Traffic von Spoke2 beinhaltet und die Crypto-ACL zum Spoke2 auch den Traffic vom Spoke1 beinhaltet.

access-list VPN-HQ-TO-SPOKE1 extended permit ip object-group SPOKE2-NETWORKS object-group SPOKE1-NETWORKS
!
access-list VPN-HQ-TO-SPOKE2 extended permit ip object-group SPOKE1-NETWORKS object-group SPOKE2-NETWORKS

Als letzten Schritt wird die ASA so konfiguriert, dass Hairpinning erlaubt wird, also Traffic auf dem selben Interface die ASA verlassen kann, über das der Traffic empfangen wurde.

same-security-traffic permit intra-interface
Cisco ASA VPNs: Spoke-to-Spoke Traffic via Hub