Questo documento descrive l'effetto del PBR (Policy Based Routing) e del PBR locale quando applicati ai pacchetti Encapsulating Security Payload (ESP) e Internet Security Association and Key Management Protocol (ISAKMP) quando si usa Cisco IOS®.
Contributo di Michal Garcarz, Cisco TAC Engineer.
Cisco raccomanda la conoscenza di base dei seguenti argomenti:
Il riferimento delle informazioni contenute in questo documento è Cisco IOS versione 15.x.
Le informazioni discusse in questo documento fanno riferimento a dispositivi usati in uno specifico ambiente di emulazione. Su tutti i dispositivi menzionati nel documento la configurazione è stata ripristinata ai valori predefiniti. Se la rete è operativa, valutare attentamente eventuali conseguenze derivanti dall'uso dei comandi.
Prima di stabilire il tunnel IPsec, il router avvia uno scambio ISAKMP. Quando questi pacchetti vengono generati dal router, vengono trattati come traffico generato localmente e vengono applicate le decisioni PBR locali. Inoltre, tutti i pacchetti generati dal router (Enhanced Interior Gateway Routing Protocol (EIGRP), Next Hop Resolution Protocol (NHRP), Border Gateway Protocol (BGP) o ping Internet Control Message Protocol (ICMP)) vengono considerati come traffico generato localmente e viene applicata la decisione PBR locale.
Il traffico che viene inoltrato dal router e inviato attraverso il tunnel, definito traffico di transito, non viene considerato traffico generato localmente e qualsiasi criterio di routing desiderato deve essere applicato all'interfaccia in entrata del router.
Le implicazioni per il traffico che attraversa il tunnel sono che il traffico generato localmente segue il PBR, a differenza del traffico di transito. Questo articolo spiega le conseguenze di questa differenza di comportamento.
Per il traffico di transito che deve essere incapsulato da ESP, non è necessario avere voci di routing in quanto il PBR determina l'interfaccia di uscita per il pacchetto prima e dopo l'incapsulamento ESP. Per il traffico generato localmente che deve essere incapsulato tramite ESP, sono necessarie voci di routing, in quanto il PBR locale determina l'interfaccia in uscita solo per il pacchetto prima dell'incapsulamento e il routing determina l'interfaccia in uscita per il pacchetto post-incapsulato.
Questo documento contiene un tipico esempio di configurazione in cui viene usato un router con due collegamenti ISP. Un collegamento viene utilizzato per accedere a Internet e il secondo per la VPN. In caso di errore del collegamento, il traffico viene reindirizzato con un collegamento con un altro provider di servizi Internet (ISP). Presentate anche le insidie.
Il PBR viene eseguito in Cisco Express Forwarding (CEF), mentre il PBR locale è a commutazione di contesto.
In questa sezione viene descritto il comportamento del traffico avviato dal router (R)1. Tale traffico è ESP incapsulato da R1.
Il tunnel IPsec LAN-LAN è costruito tra R1 e R3.
Il traffico interessante è tra R1 Lo0 (192.168.100.1) e R3 Lo0 (192.168.200.1).
Il router R3 ha un percorso predefinito verso R2.
R1 non dispone di voci di routing, ma solo di reti connesse direttamente.
R1 dispone di PBR locale per tutto il traffico:
interface Loopback0
ip address 192.168.100.1 255.255.255.0
!
interface Ethernet0/0
ip address 192.168.0.1 255.255.255.0
crypto map CM
track 10 ip sla 10
ip sla 10
icmp-echo 192.168.0.2 source-ip 192.168.0.1
route-map LOCALPBR permit 10
set ip next-hop verify-availability 192.168.0.2 1 track 10
ip local policy route-map LOCALPBR
Tutto il traffico generato localmente su R1 viene inviato a R2 quando è attivo.
Per verificare cosa succede quando si richiama il tunnel, inviare il traffico interessante dal router stesso:
R1#debug ip packet
R1#ping 192.168.200.1 source lo0
Il comando debug consente inoltre di usare l'elenco degli accessi per limitare la quantità di traffico elaborata dai debug. Il comando debug ip packet visualizza solo il traffico a commutazione di contesto.
Di seguito sono riportati i debug di R1:
IP: s=192.168.100.1 (local), d=192.168.200.1 (Ethernet0/0), len 100, local
feature, Policy Routing(3), rtype 2, forus FALSE, sendself FALSE, mtu 0, fwdchk
FALSE
IP: s=192.168.100.1 (local), d=192.168.200.1 (Ethernet0/0), len 100, sending
IP: s=192.168.100.1, d=192.168.200.1, pak EF6E8F28 consumed in output feature,
packet consumed, IPSec output classification(30), rtype 2, forus FALSE, sendself
FALSE, mtu 0, fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 192, local feature, Policy
Routing(3), rtype 2, forus FALSE, sendself FALSE, mtu 0, fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 192, sending
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 192, output feature,
IPSec output classification(30), rtype 2, forus FALSE, sendself FALSE, mtu 0,
fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 192, output feature,
IPSec: to crypto engine(64), rtype 2, forus FALSE, sendself FALSE, mtu 0,
fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 192, output feature,
Post-encryption output features(65), rtype 2, forus FALSE, sendself FALSE, mtu 0,
fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 192, post-encap feature,
(1), rtype 2, forus FALSE, sendself FALSE, mtu 0, fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 192, post-encap feature,
FastEther Channel(3), rtype 2, forus FALSE, sendself FALSE, mtu 0, fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 192, sending full packet
Ecco cosa succede:
Il traffico interessante (192.168.100.1 > 192.168.200.1) viene abbinato al PBR locale e viene determinata l'interfaccia in uscita (E0/0). Questa azione attiva il codice di crittografia per avviare ISAKMP. Il pacchetto viene inoltre instradato dal PBR locale, che determina l'interfaccia in uscita (E0/0). Il traffico ISAKMP viene inviato e il tunnel viene negoziato
Cosa succede quando si esegue di nuovo il ping?
R1#show crypto session
Crypto session current status
Interface: Ethernet0/0
Session status: UP-ACTIVE
Peer: 10.0.0.2 port 500
IKEv1 SA: local 192.168.0.1/500 remote 10.0.0.2/500 Active
IPSEC FLOW: permit ip host 192.168.100.1 host 192.168.200.1
Active SAs: 2, origin: crypto map
R1#ping 192.168.200.1 source lo0 repeat 1
IP: s=192.168.100.1 (local), d=192.168.200.1 (Ethernet0/0), len 100, local
feature, Policy Routing(3), rtype 2, forus FALSE, sendself FALSE, mtu 0,
fwdchk FALSE
IP: s=192.168.100.1 (local), d=192.168.200.1 (Ethernet0/0), len 100, sending
IP: s=192.168.100.1 (local), d=192.168.200.1 (Ethernet0/0), len 100, output
feature, IPSec output classification(30), rtype 2, forus FALSE, sendself FALSE,
mtu 0, fwdchk FALSE
IP: s=192.168.100.1, d=192.168.200.1, pak EEB40198 consumed in output feature,
packet consumed, IPSec: to crypto engine(64), rtype 2, forus FALSE, sendself
FALSE, mtu 0, fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 172, output feature,
IPSec output classification(30), rtype 1, forus FALSE, sendself FALSE, mtu 0,
fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 172, output feature,
IPSec: to crypto engine(64), rtype 1, forus FALSE, sendself FALSE, mtu 0,
fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 172, output feature,
Post-encryption output features(65), rtype 1, forus FALSE, sendself FALSE,
mtu 0, fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), g=10.0.0.2, len 172,
forward
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 172, post-encap
feature, (1), rtype 0, forus FALSE, sendself FALSE, mtu 0, fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 172, post-encap
feature, FastEther Channel(3), rtype 0, forus FALSE, sendself FALSE, mtu 0,
fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 172, encapsulation
failed.
Success rate is 0 percent (0/1)
Ecco cosa succede:
Il traffico interessante generato localmente, 192.168.100.1 > 192.168.200.1, viene instradato localmente sulla base di regole e viene determinata l'interfaccia in uscita (E0/0). Il pacchetto viene consumato dalla funzionalità di output IPsec su E0/0 e incapsulato. Il pacchetto incapsulato (da 192.168.0.1 a 10.0.0.2) viene controllato per verificare la presenza di routing per determinare l'interfaccia di uscita, ma le tabelle di routing di R1 non contengono nulla, ecco perché l'incapsulamento non riesce.
In questo scenario, il tunnel è attivo, ma il traffico non viene inviato perché, dopo l'incapsulamento ESP, Cisco IOS controlla le tabelle di routing per determinare l'interfaccia di uscita.
In questa sezione viene descritto il comportamento del traffico di transito che attraversa il router, ossia il protocollo ESP incapsulato da tale router.
Il tunnel L2L è costruito tra R1 e R3.
Il traffico interessante è tra R4 (192.168.100.1) e R3 lo0 (192.168.200.1).
Il router R3 ha un percorso predefinito verso R2.
Il router R4 dispone di un percorso predefinito verso R1.
R1 non ha routing.
La topologia precedente viene modificata per mostrare il flusso quando il router riceve i pacchetti per la crittografia (traffico di transito anziché traffico generato localmente).
Al momento, il traffico interessante ricevuto da R4 viene instradato su R1 (da PBR su E0/1), e c'è anche un routing di policy locale per tutto il traffico:
interface Ethernet0/1
ip address 192.168.100.10 255.255.255.0
ip policy route-map PBR
route-map LOCALPBR permit 10
set ip next-hop verify-availability 192.168.0.2 1 track 10
!
route-map PBR permit 10
set ip next-hop verify-availability 192.168.0.2 1 track 10
ip local policy route-map LOCALPBR
Per verificare cosa succede quando si apre il tunnel su R1 (dopo aver ricevuto il traffico interessante da R4), immettere:
R1#debug ip packet
R4#ping 192.168.200.1
Di seguito sono riportati i debug di R1:
IP: s=192.168.100.1 (Ethernet0/1), d=192.168.200.1 (Ethernet0/0), len 100,
input feature, Policy Routing(68), rtype 2, forus FALSE, sendself FALSE, mtu 0,
fwdchk FALSE
IP: s=192.168.100.1 (Ethernet0/1), d=192.168.200.1 (Ethernet0/0), len 100,
input feature, MCI Check(73), rtype 2, forus FALSE, sendself FALSE, mtu 0,
fwdchk FALSE
IP: s=192.168.100.1, d=192.168.200.1, pak EEB4A9D8 consumed in output feature,
packet consumed, IPSec output classification(30), rtype 2, forus FALSE,
sendself FALSE, mtu 0, fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 192, local feature,
Policy Routing(3), rtype 2, forus FALSE, sendself FALSE, mtu 0, fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 192, sending
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 192, output feature,
IPSec output classification(30), rtype 2, forus FALSE, sendself FALSE, mtu 0,
fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 192, output feature,
IPSec: to crypto engine(64), rtype 2, forus FALSE, sendself FALSE, mtu 0,
fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 192, output feature,
Post-encryption output features(65), rtype 2, forus FALSE, sendself FALSE,
mtu 0, fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 192, post-encap
feature, (1), rtype 2, forus FALSE, sendself FALSE, mtu 0, fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 192, post-encap
feature, FastEther Channel(3), rtype 2, forus FALSE, sendself FALSE, mtu 0,
fwdchk FALSE
IP: s=192.168.0.1 (local), d=10.0.0.2 (Ethernet0/0), len 192, sending full
packet
Ecco cosa succede:
Il traffico interessante raggiunge il PBR su E0/0 e attiva il codice crittografico per inviare il pacchetto ISAKMP. Il pacchetto ISAKMP viene instradato localmente in base ai criteri e l'interfaccia in uscita viene determinata dal PBR locale. Viene costruito un tunnel.
Di seguito viene riportato un altro ping da R4 al numero 192.168.200.1:
R4#ping 192.168.200.1
Di seguito sono riportati i debug di R1:
IP: s=192.168.100.1 (Ethernet0/1), d=192.168.200.1 (Ethernet0/0), len 100,
input feature, Policy Routing(68), rtype 2, forus FALSE, sendself FALSE, mtu 0,
fwdchk FALSE
IP: s=192.168.100.1 (Ethernet0/1), d=192.168.200.1 (Ethernet0/0), len 100,
input feature, MCI Check(73), rtype 2, forus FALSE, sendself FALSE, mtu 0,
fwdchk FALSE
IP: s=192.168.100.1 (Ethernet0/1), d=192.168.200.1 (Ethernet0/0), len 100,
output feature, IPSec output classification(30), rtype 2, forus FALSE, sendself
FALSE, mtu 0, fwdchk FALSE
IP: s=192.168.100.1, d=192.168.200.1, pak EF722068 consumed in output feature,
packet consumed, IPSec: to crypto engine(64), rtype 2, forus FALSE, sendself
FALSE, mtu 0, fwdchk FALSE
IP: s=192.168.0.1 (Ethernet0/1), d=10.0.0.2 (Ethernet0/0), len 172, input
feature, Policy Routing(68), rtype 2, forus FALSE, sendself FALSE, mtu 0,
fwdchk FALSE
IP: s=192.168.0.1 (Ethernet0/1), d=10.0.0.2 (Ethernet0/0), len 172, input
feature, MCI Check(73), rtype 2, forus FALSE, sendself FALSE, mtu 0,
fwdchk FALSE
IP: s=192.168.0.1 (Ethernet0/1), d=10.0.0.2 (Ethernet0/0), len 172, output
feature, IPSec output classification(30), rtype 2, forus FALSE, sendself FALSE,
mtu 0, fwdchk FALSE
IP: s=192.168.0.1 (Ethernet0/1), d=10.0.0.2 (Ethernet0/0), len 172, output
feature, IPSec: to crypto engine(64), rtype 2, forus FALSE, sendself FALSE,
mtu 0, fwdchk FALSE
IP: s=192.168.0.1 (Ethernet0/1), d=10.0.0.2 (Ethernet0/0), len 172, output
feature, Post-encryption output features(65), rtype 2, forus FALSE, sendself
FALSE, mtu 0, fwdchk FALSE
IP: s=192.168.0.1 (Ethernet0/1), d=10.0.0.2 (Ethernet0/0), g=192.168.0.2, len
172, forward
IP: s=192.168.0.1 (Ethernet0/1), d=10.0.0.2 (Ethernet0/0), len 172, post-encap
feature, (1), rtype 0, forus FALSE, sendself FALSE, mtu 0, fwdchk FALSE
IP: s=192.168.0.1 (Ethernet0/1), d=10.0.0.2 (Ethernet0/0), len 172, post-encap
feature, FastEther Channel(3), rtype 0, forus FALSE, sendself FALSE, mtu 0,
fwdchk FALSE
IP: s=192.168.0.1 (Ethernet0/1), d=10.0.0.2 (Ethernet0/0), len 172,
sending full packet
Ecco cosa succede:
Il traffico interessante incontra il PBR su E0/0 e il PBR determina l'interfaccia in uscita (E0/0). Sul router E0/0, il pacchetto viene consumato da IPSec e incapsulato. Dopo aver controllato il pacchetto incapsulato con la stessa regola PBR e aver determinato l'interfaccia in uscita, il pacchetto viene inviato e ricevuto correttamente.
Per il traffico generato localmente, l'interfaccia in uscita per il traffico non incapsulato (ISAKMP) è determinata dal PBR locale. Per il traffico generato localmente, l'interfaccia in uscita per il traffico post-incapsulato (ESP) è determinata dalle tabelle di routing (il PBR locale non è selezionato). Per il traffico di transito, l'interfaccia in uscita per il traffico post-incapsulato (ESP) è determinata dal PBR dell'interfaccia (due volte, prima e dopo l'incapsulamento).
Questo è un esempio pratico di configurazione che presenta i problemi che si possono verificare con PBR e PBR locale con VPN. R2 (CE) ha due collegamenti ISP. Il router R6 dispone inoltre di un collegamento CE e di un ISP. Il primo collegamento da R2 a R3 viene utilizzato come percorso predefinito per R2. Il secondo collegamento a R4 viene utilizzato solo per il traffico VPN verso R6. In caso di errore del collegamento ISP, il traffico viene reindirizzato all'altro collegamento.
Il traffico tra i siti 192.168.1.0/24 e 192.168.2.0/24 è protetto. Open Shortest Path First (OSPF) viene utilizzato nel cloud Internet per pubblicizzare gli indirizzi 10.0.0.0/8, che vengono trattati come indirizzi pubblici assegnati dall'ISP al cliente. Nel mondo reale, viene utilizzato BGP al posto di OSPF.
La configurazione su R2 e R6 è basata sulla mappa crittografica. In R2, PBR viene utilizzato su E0/0 per indirizzare il traffico VPN su R4 se è attivo:
route-map PBR permit 10
match ip address cmap
set ip next-hop verify-availability 10.0.2.4 1 track 20
ip access-list extended cmap
permit ip 192.168.1.0 0.0.0.255 192.168.2.0 0.0.0.255
crypto map cmap 10 ipsec-isakmp
set peer 10.0.4.6
set transform-set TS
match address cmap
interface Ethernet0/0
ip address 192.168.1.2 255.255.255.0
ip nat inside
ip virtual-reassembly in
ip policy route-map PBR
Qui vedete che il PBR locale non è necessario. L'interfaccia PBR instrada il traffico interessante alla versione 10.0.2.4. Ciò attiva il codice crittografico per avviare ISAKMP dall'interfaccia corretta (collegamento a R4), anche quando il routing è diretto ai peer remoti tramite R3.
In R6 vengono utilizzati due peer per la VPN:
crypto map cmap 10 ipsec-isakmp
set peer 10.0.2.2 !primary
set peer 10.0.1.2
set transform-set TS
match address cmap
R2 utilizza un contratto di servizio (SLA, Service Level Agreement) IP per eseguire il ping tra R3 e R4. La route predefinita è R3. In caso di errore di R3, viene scelto R4:
ip sla 10
icmp-echo 10.0.1.3
ip sla schedule 10 life forever start-time now
ip sla 20
icmp-echo 10.0.2.4
ip sla schedule 20 life forever start-time now
track 10 ip sla 10
track 20 ip sla 20
ip route 0.0.0.0 0.0.0.0 10.0.1.3 track 10
ip route 0.0.0.0 0.0.0.0 10.0.2.4 100
R2 consente inoltre l'accesso a Internet a tutti gli utenti interni. Per ottenere la ridondanza nel caso in cui l'ISP per R3 sia inattivo, è necessario un percorso-mappa. I PAT (Port Address Translations) all'interno del traffico verso un'interfaccia in uscita diversa (PAT verso l'interfaccia E0/1 quando R3 è attivo e il percorso predefinito punta a R3 e PAT verso l'interfaccia E0/2 quando R3 è inattivo e R4 è utilizzato come percorso predefinito).
ip access-list extended pat
deny ip 192.168.1.0 0.0.0.255 192.168.2.0 0.0.0.255
deny udp any any eq isakmp
deny udp any eq isakmp any
permit ip any any
route-map RMAP2 permit 10
match ip address pat
match interface Ethernet0/2
!
route-map RMAP1 permit 10
match ip address pat
match interface Ethernet0/1
ip nat inside source route-map RMAP1 interface Ethernet0/1 overload
ip nat inside source route-map RMAP2 interface Ethernet0/2 overload
interface Ethernet0/0
ip address 192.168.1.2 255.255.255.0
ip nat inside
ip virtual-reassembly in
ip policy route-map PBR
interface Ethernet0/1
ip address 10.0.1.2 255.255.255.0
ip nat outside
ip virtual-reassembly in
crypto map cmap
interface Ethernet0/2
ip address 10.0.2.2 255.255.255.0
ip nat outside
ip virtual-reassembly in
crypto map cmap
Il traffico VPN deve essere escluso dalla traduzione come ISAKMP. Se il traffico ISAKMP non è escluso dalla traduzione, viene indirizzato all'interfaccia esterna che va verso R3:
R2#show ip nat translation
Pro Inside global Inside local Outside local Outside global
udp 10.0.1.2:500 10.0.2.2:500 10.0.4.6:500 10.0.4.6:500
*Jun 8 09:09:37.779: IP: s=10.0.2.2 (local), d=10.0.4.6, len 196, local
feature, NAT(2), rtype 0, forus FALSE, sendself FALSE, mtu 0, fwdchk FALSE
*Jun 8 09:09:37.779: IP: s=10.0.2.2 (local), d=10.0.4.6 (Ethernet0/1),
len 196, sending
*Jun 8 09:09:37.779: IP: s=10.0.1.2 (local), d=10.0.4.6 (Ethernet0/1), len 196,
output feature, Post-routing NAT Outside(24), rtype 1, forus FALSE, sendself
FALSE, mtu 0, fwdchk FALSE
*Jun 8 09:09:37.779: IP: s=10.0.1.2 (local), d=10.0.4.6 (Ethernet0/1), len 196,
output feature, Common Flow Table(27), rtype 1, forus FALSE, sendself FALSE,
mtu 0, fwdchk FALSE
*Jun 8 09:09:37.779: IP: s=10.0.1.2 (local), d=10.0.4.6 (Ethernet0/1), len 196,
output feature, Stateful Inspection(28), rtype 1, forus FALSE, sendself FALSE,
mtu 0, fwdchk FALSE
*Jun 8 09:09:37.779: IP: s=10.0.1.2 (local), d=10.0.4.6 (Ethernet0/1), len 196,
output feature, IPSec output classification(34), rtype 1, forus FALSE, sendself
FALSE, mtu 0, fwdchk FALSE
*Jun 8 09:09:37.779: IP: s=10.0.1.2 (local), d=10.0.4.6 (Ethernet0/1), len 196,
output feature, NAT ALG proxy(59), rtype 1, forus FALSE, sendself FALSE, mtu 0,
fwdchk FALSE
*Jun 8 09:09:37.779: IP: s=10.0.1.2 (local), d=10.0.4.6 (Ethernet0/1), len 196,
output feature, IPSec: to crypto engine(75), rtype 1, forus FALSE, sendself FALSE,
mtu 0, fwdchk FALSE
*Jun 8 09:09:37.779: IP: s=10.0.1.2 (local), d=10.0.4.6 (Ethernet0/1), len 196,
output feature, Post-encryption output features(76), rtype 1, forus FALSE, sendself
FALSE, mtu 0, fwdchk FALSE
*Jun 8 09:09:37.779: IP: s=10.0.1.2 (local), d=10.0.4.6 (Ethernet0/1), len 196,
pre-encap feature, IPSec Output Encap(1), rtype 1, forus FALSE, sendself FALSE,
mtu 0, fwdchk FALSE
*Jun 8 09:09:37.779: IP: s=10.0.1.2 (local), d=10.0.4.6 (Ethernet0/1), len 196,
pre-encap feature, Crypto Engine(3), rtype 1, forus FALSE, sendself FALSE, mtu 0,
fwdchk FALSE
*Jun 8 09:09:37.779: IP: s=10.0.1.2 (local), d=10.0.4.6 (Ethernet0/1), len 196,
sending full packet
Con questa configurazione, è presente una ridondanza completa. La VPN utilizza il collegamento R4 e il resto del traffico viene instradato con R3. In caso di errore R4, il traffico VPN viene stabilito con il collegamento R3 (la route-map per PBR non corrisponde e viene utilizzato il routing predefinito).
Prima che l'ISP per R4 non sia attivo, R6 rileva il traffico dal peer 10.0.2.2:
R6#show crypto session
Crypto session current status
Interface: Ethernet0/0
Session status: UP-ACTIVE
Peer: 10.0.2.2 port 500
IKEv1 SA: local 10.0.4.6/500 remote 10.0.2.2/500 Active
IPSEC FLOW: permit ip 192.168.2.0/255.255.255.0 192.168.1.0/255.255.255.0
Active SAs: 2, origin: crypto map
Dopo che R2 utilizza ISP per R3 per il traffico VPN, R6 rileva il traffico dal peer 10.0.1.2:
R6#show crypto session
Crypto session current status
Interface: Ethernet0/0
Session status: UP-ACTIVE
Peer: 10.0.1.2 port 500
IKEv1 SA: local 10.0.4.6/500 remote 10.0.1.2/500 Active
IPSEC FLOW: permit ip 192.168.2.0/255.255.255.0 192.168.1.0/255.255.255.0
Active SAs: 2, origin: crypto map
Nello scenario opposto, quando il collegamento a R3 si interrompe, tutto funziona ancora bene. Il traffico VPN utilizza ancora il collegamento a R4. Network Address Translation (NAT) viene eseguito per il percorso 192.168.1.0/24 a PAT per l'impostazione dell'indirizzo esterno. Prima che R3 scenda, c'è una conversione a 10.0.1.2:
R2#show ip nat translations
Pro Inside global Inside local Outside local Outside global
icmp 10.0.1.2:1 192.168.1.1:1 10.0.4.6:1 10.0.4.6:1
Dopo che R3 è sceso, c'è ancora la vecchia traduzione insieme alla nuova traduzione (a 10.0.2.2) che utilizza il collegamento verso R4:
R2#show ip nat translations
Pro Inside global Inside local Outside local Outside global
icmp 10.0.2.2:0 192.168.1.1:0 10.0.4.6:0 10.0.4.6:0
icmp 10.0.1.2:1 192.168.1.1:1 10.0.4.6:1 10.0.4.6:1
Se tutto funziona bene, dove sono le trappole? Sono nei dettagli.
Di seguito è riportato uno scenario in cui è necessario avviare il traffico VPN dalla stessa R2. Per questo scenario è necessario configurare il PBR locale su R2 in modo da forzare R2 a inviare il traffico ISAKMP tramite R4 e da far salire il tunnel. Tuttavia, l'interfaccia in uscita viene determinata usando delle tabelle di routing, il cui valore predefinito è R3, e il pacchetto viene inviato a R3, anziché a R4, che viene usato per il transito sulla VPN. Per verificarlo, immettere:
ip access-list extended isakmp
permit udp any any eq isakmp
permit udp any eq isakmp any
permit icmp any any
route-map LOCAL-PBR permit 10
match ip address isakmp
set ip next-hop verify-availability 10.0.2.4 1 track 20
ip local policy route-map LOCAL-PBR
Nell'esempio, il protocollo ICMP (Internet Control Message Protocol) generato localmente viene forzato tramite R4. In caso contrario, il traffico generato localmente da 192.168.1.2 a 192.168.2.5 viene elaborato con l'uso di tabelle di routing e viene stabilito un tunnel con R3.
Cosa succede dopo aver applicato la configurazione? Il pacchetto ICMP da 192.168.1.2 a 192.168.2.5 viene indirizzato verso R4. Viene quindi avviato un tunnel con il collegamento a R4. Il tunnel è configurato:
R2#ping 192.168.2.6 source e0/0 repeat 10
Type escape sequence to abort.
Sending 10, 100-byte ICMP Echos to 192.168.2.6, timeout is 2 seconds:
Packet sent with a source address of 192.168.1.2
.!!!!!!!!!
Success rate is 90 percent (9/10), round-trip min/avg/max = 4/4/5 ms
R2#show crypto session detail
Crypto session current status
Code: C - IKE Configuration mode, D - Dead Peer Detection
K - Keepalives, N - NAT-traversal, T - cTCP encapsulation
X - IKE Extended Authentication, F - IKE Fragmentation
Interface: Ethernet0/1
Session status: DOWN
Peer: 10.0.4.6 port 500 fvrf: (none) ivrf: (none)
Desc: (none)
Phase1_id: (none)
IPSEC FLOW: permit ip 192.168.1.0/255.255.255.0 192.168.2.0/255.255.255.0
Active SAs: 0, origin: crypto map
Inbound: #pkts dec"ed 0 drop 0 life (KB/Sec) 0/0
Outbound: #pkts enc"ed 0 drop 0 life (KB/Sec) 0/0
Interface: Ethernet0/2
Uptime: 00:00:06
Session status: UP-ACTIVE
Peer: 10.0.4.6 port 500 fvrf: (none) ivrf: (none)
Phase1_id: 10.0.4.6
Desc: (none)
IKEv1 SA: local 10.0.2.2/500 remote 10.0.4.6/500 Active
Capabilities:(none) connid:1009 lifetime:23:59:53
IKEv1 SA: local 10.0.2.2/500 remote 10.0.4.6/500 Inactive
Capabilities:(none) connid:1008 lifetime:0
IPSEC FLOW: permit ip 192.168.1.0/255.255.255.0 192.168.2.0/255.255.255.0
Active SAs: 2, origin: crypto map
Inbound: #pkts dec"ed 9 drop 0 life (KB/Sec) 4298956/3593
Outbound: #pkts enc"ed 9 drop 0 life (KB/Sec) 4298956/3593
Sembra che tutto funzioni correttamente. Il traffico viene inviato con il collegamento corretto E0/2 verso R4. Anche R6 mostra che il traffico viene ricevuto da 10.2.2.2, che è l'indirizzo IP del collegamento di R4:
R6#show crypto session detail
Crypto session current status
Code: C - IKE Configuration mode, D - Dead Peer Detection
K - Keepalives, N - NAT-traversal, T - cTCP encapsulation
X - IKE Extended Authentication, F - IKE Fragmentation
Interface: Ethernet0/0
Uptime: 14:50:38
Session status: UP-ACTIVE
Peer: 10.0.2.2 port 500 fvrf: (none) ivrf: (none)
Phase1_id: 10.0.2.2
Desc: (none)
IKEv1 SA: local 10.0.4.6/500 remote 10.0.2.2/500 Active
Capabilities:(none) connid:1009 lifetime:23:57:13
IPSEC FLOW: permit ip 192.168.2.0/255.255.255.0 192.168.1.0/255.255.255.0
Active SAs: 2, origin: crypto map
Inbound: #pkts dec"ed 1034 drop 0 life (KB/Sec) 4360587/3433
Outbound: #pkts enc"ed 1029 drop 0 life (KB/Sec) 4360587/3433
Ma in realtà, c'è un routing asimmetrico per i pacchetti ESP qui. I pacchetti ESP vengono inviati con 10.0.2.2 come origine, ma vengono inseriti sul collegamento verso R3. Viene restituita una risposta crittografata tramite R4. È possibile verificare questa condizione controllando i contatori su R3 e R4:
Contatori R3 di E0/0 prima di inviare 100 pacchetti:
R3#show int e0/0 | i pack
5 minute input rate 0 bits/sec, 0 packets/sec
5 minute output rate 0 bits/sec, 0 packets/sec
739 packets input, 145041 bytes, 0 no buffer
0 input packets with dribble condition detected
1918 packets output, 243709 bytes, 0 underruns
E gli stessi contatori, dopo aver inviato 100 pacchetti:
R3#show int e0/0 | i pack
5 minute input rate 0 bits/sec, 0 packets/sec
5 minute output rate 0 bits/sec, 0 packets/sec
839 packets input, 163241 bytes, 0 no buffer
0 input packets with dribble condition detected
1920 packets output, 243859 bytes, 0 underruns
Il numero di pacchetti in arrivo è aumentato di 100 (sul collegamento verso R2), ma i pacchetti in uscita sono aumentati solo di 2. Quindi R3 vede solo l'eco ICMP criptato.
La risposta viene verificata su R4, prima di inviare 100 pacchetti:
R4#show int e0/0 | i packet
5 minute input rate 0 bits/sec, 0 packets/sec
5 minute output rate 1000 bits/sec, 1 packets/sec
793 packets input, 150793 bytes, 0 no buffer
0 input packets with dribble condition detected
1751 packets output, 209111 bytes, 0 underruns
Dopo l'invio di 100 pacchetti:
R4#show int e0/0 | i packet
5 minute input rate 0 bits/sec, 0 packets/sec
5 minute output rate 0 bits/sec, 0 packets/sec
793 packets input, 150793 bytes, 0 no buffer
0 input packets with dribble condition detected
1853 packets output, 227461 bytes, 0 underruns
Il numero di pacchetti inviati alla R2 è aumentato di 102 (risposta ICMP crittografata), mentre i pacchetti ricevuti sono aumentati di 0. Pertanto, R4 vede solo la risposta ICMP crittografata. Naturalmente, l'acquisizione di un pacchetto conferma questa condizione.
Perché questo accade? La risposta è nella prima parte dell'articolo.
Di seguito viene riportato il flusso di tali pacchetti ICMP:
Ecco perché è importante essere particolarmente cauti con il traffico generato localmente.
In molte reti viene utilizzato l'uRPF (Unicast Reverse Path Forwarding) e il traffico proveniente da 10.0.2.2 potrebbe essere interrotto sulla porta E0/0 di R3. In questo caso, il ping non funziona.
Esiste una soluzione per questo problema? È possibile forzare il router a trattare il traffico generato localmente come traffico di transito. Per questo motivo, il PBR locale deve indirizzare il traffico verso un'interfaccia loopback fittizia da cui viene indirizzato come traffico di transito.
Questa operazione non è consigliata.
C'è anche un'altra soluzione che è un compromesso. Con la stessa topologia dell'esempio precedente, è possibile soddisfare tutti i requisiti senza utilizzare il PBR o il PBR locale. Per questo scenario, viene utilizzato solo il routing. In R2 viene aggiunta un'unica voce di routing e vengono rimosse tutte le configurazioni PBR/PBR locale:
ip route 192.168.2.0 255.255.255.0 10.0.2.4 track 20
In totale, R2 presenta la seguente configurazione di routing:
ip route 0.0.0.0 0.0.0.0 10.0.1.3 track 10
ip route 0.0.0.0 0.0.0.0 10.0.2.4 100
ip route 192.168.2.0 255.255.255.0 10.0.2.4 track 20
La prima voce corrisponde a un percorso predefinito verso R3, quando il collegamento a R3 è attivo. La seconda voce di routing è un percorso di backup predefinito verso R4, quando il collegamento a R3 è inattivo. La terza voce decide come inviare il traffico alla rete VPN remota, a seconda dello stato del collegamento R4 (se il collegamento R4 è attivo, il traffico alla rete VPN remota viene inviato tramite R4). Con questa configurazione, non è necessario eseguire il routing delle policy.
Qual è lo svantaggio? Non esiste più alcun controllo granulare che utilizzi il PBR. Impossibile determinare l'indirizzo di origine. In questo caso, tutto il traffico diretto a 192.168.2.0/24 viene inviato in direzione R4 quando è attivo, a prescindere dall'origine. Nell'esempio precedente, controllato dal PBR e dall'origine specifica: 192.168.1.0/24.
A quale scenario si riferisce questa soluzione troppo semplice? Per reti LAN multiple (dietro R2). Quando alcune di queste reti devono raggiungere il sito 192.168.2.0/24 in modo sicuro (crittografato) e altri modi non sicuri (non crittografato), il traffico proveniente da reti non sicure viene ancora inserito nell'interfaccia E0/2 di R2 e non colpisce la mappa crittografica. Quindi viene inviato non crittografato tramite un collegamento a R4 (e il requisito principale era usare R4 solo per il traffico crittografato).
Questo tipo di scenario e i suoi requisiti sono rari, motivo per cui questa soluzione viene utilizzata abbastanza spesso.
L'uso del PBR e delle funzionalità PBR locali insieme alle VPN e al NAT può essere complesso e richiede una comprensione approfondita del flusso dei pacchetti.
In scenari come quelli illustrati di seguito, si consiglia di utilizzare due router separati, ciascuno con un collegamento ISP. In caso di guasto di un ISP, il traffico può essere reindirizzato facilmente. Non c'è bisogno di PBR, e il design generale è molto più semplice.
Esiste inoltre una soluzione di compromesso che non richiede l'utilizzo del PBR, ma utilizza invece il routing mobile statico.
Attualmente non è disponibile una procedura di verifica per questa configurazione.
Al momento non sono disponibili informazioni specifiche per la risoluzione dei problemi di questa configurazione.
Revisione | Data di pubblicazione | Commenti |
---|---|---|
1.0 |
30-Oct-2013 |
Versione iniziale |