IPsec

IKEv2 Site-to-Site VPN with SVTI: The Config You Should Actually Deploy

IKEv2 SVTI: real show interface Tunnel1 showing IPSEC/IP transport and MTU 1446
In: IPsec, VPN, CCIE, Labs

If you are building a brand new site-to-site tunnel in 2026, this is the one you should build: IKEv2 for the control plane, AES-GCM-256 for the data plane, and a static VTI for the forwarding plane. No crypto ACL. No proxy-ID mismatch at 2am. No legacy cipher suite that a scanner will flag next quarter. Just a routable tunnel interface that happens to be encrypted. This article is part of the PingLabz IPsec VPN cluster, and it is the config we would hand someone on day one.

Everything below was captured on a real lab: a cat8000v HUB at 203.0.113.1 talking to a cat8000v SPOKE1 at 198.51.100.2, both on IOS XE 17.18.02, with an ISP router in between. Every line of CLI output on this page came off those boxes.

Why This Combination and Not Another

There are four moving decisions in a site-to-site build, and most of the bad tunnels in the world got at least one of them wrong.

Key exchange: IKEv2
Fewer messages, built-in DPD/liveness, a real config-exchange mechanism, and modern smart defaults. IKEv1 is legacy. See IKEv2 explained.
Cipher: AES-GCM-256
AEAD. Encryption and integrity in one pass, no separate HMAC, hardware-friendly, less per-packet overhead.
Encapsulation: static VTI
A real interface you can route out of, run an IGP over, apply QoS to, and put in a VRF. See SVTI.
Traffic selection: routing
A route, not an access list. The crypto ACL and its proxy-ID mismatches disappear entirely. See crypto maps vs VTI.

The alternative build, IKEv2 bolted onto a crypto map, still works and we lab it out here because you will meet it on brownfield gear. But if nothing is forcing you into a crypto map, do not choose one voluntarily.

The Complete Build, Bottom to Top

The whole config is five blocks. Read it once and it fits in your head.

1. The IKEv2 proposal and policy

The proposal is the cipher suite offered in IKE_SA_INIT. The policy is the container that decides which proposal applies to which peers.

crypto ikev2 proposal PLZ-IKEV2-PROP
 encryption aes-gcm-256
 prf sha256
 group 19
crypto ikev2 policy PLZ-IKEV2-POL
 proposal PLZ-IKEV2-PROP

Notice what is missing: there is no integrity line. With AES-GCM you configure a PRF and no integrity algorithm, because GCM does integrity itself. IOS XE will tell you this out loud while you are typing an incomplete proposal:

IKEv2 proposal MUST either have a set of an encryption algorithm other than aes-gcm, an
integrity algorithm and a DH group configured or
 encryption algorithm aes-gcm, a prf algorithm and a DH group configured

That is not an error, it is a hint, and it is the AEAD rule stated in the CLI. Group 19 is a 256-bit ECP curve (a sane 2026 floor).

2. The keyring

Where the pre-shared key lives, scoped to a peer address.

crypto ikev2 keyring PLZ-KEYRING
 peer SPOKE1
  address 198.51.100.2
  pre-shared-key PingLabz-IKEv2-PSK-01

3. The IKEv2 profile

The profile is the glue: it says which remote identities we accept, what identity we present, how both sides authenticate, and which keyring to use.

crypto ikev2 profile PLZ-IKEV2-PROF
 match identity remote address 198.51.100.2 255.255.255.255
 identity local address 203.0.113.1
 authentication local pre-share
 authentication remote pre-share
 keyring local PLZ-KEYRING

Both authentication local and authentication remote are required. IKEv2 authentication is asymmetric by design (each side independently states how it proves itself), which is exactly why you can later move one side to certificates without touching the other.

4. The IPsec profile (this is the line people miss)

The transform set defines the data-plane cipher. The IPsec profile binds that transform set and the IKEv2 profile together, and then the tunnel interface consumes the whole bundle.

crypto ipsec transform-set PLZ-TS-GCM esp-gcm 256
 mode tunnel
crypto ipsec profile PLZ-IPSEC-PROF
 set transform-set PLZ-TS-GCM
 set ikev2-profile PLZ-IKEV2-PROF

That set ikev2-profile PLZ-IKEV2-PROF line inside crypto ipsec profile is the single most commonly forgotten command in this entire build. Leave it out and IOS will happily accept the config, bring the tunnel interface to up/up (it is a tunnel, it does not need crypto to be line-protocol up), and then quietly fall back to whatever default IKEv2 profile logic it can find instead of the one you carefully wrote. If your proposal, keyring, or identity settings are not being honoured, check this line before you check anything else.

5. The tunnel interface

interface Tunnel1
 ip address 10.0.1.1 255.255.255.252
 tunnel source GigabitEthernet2
 tunnel mode ipsec ipv4
 tunnel destination 198.51.100.2
 tunnel protection ipsec profile PLZ-IPSEC-PROF

Two lines carry all the weight. tunnel mode ipsec ipv4 makes this an IPsec VTI rather than a GRE tunnel (get this wrong and you have built GRE-over-IPsec, which is a different thing with different overhead). tunnel protection ipsec profile attaches the crypto. That is it. There is no crypto map anywhere in this config, and no interface on the router has one applied.

Steering Traffic In: Routing, Not a Crypto ACL

With a crypto map, you tell the router what to encrypt by writing an access list, and the far end has to write the mirror image of it. Get the mask wrong on one side and you get a proxy-ID mismatch, which produces a tunnel that negotiates phase 1 beautifully and then refuses to pass a single packet.

With a VTI, you tell the router what to encrypt by routing it out the tunnel:

ip route 10.30.10.0 255.255.255.0 Tunnel1

That is the entire traffic-selection policy. Anything the routing table hands to Tunnel1 gets encrypted; anything it does not, does not. Because the VTI is a real Layer 3 interface, an IGP works exactly as well: run OSPF or EIGRP over the tunnel and let the far end advertise its own prefixes. You can also apply an output service policy, a QoS shaper, NetFlow, or an ACL to Tunnel1 like any other interface. None of that is possible on a crypto map, where the encryption is a property of the physical interface and the "tunnel" is not an object you can point at.

Verification: What Correct Looks Like

Bring the tunnel up with interesting traffic and check three things.

Does it pass traffic?

HUB#ping 10.30.10.1 source Loopback10 repeat 5
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 9/12/17 ms

Is the interface actually an IPsec tunnel?

HUB#show interface Tunnel1
Tunnel1 is up, line protocol is up
  Tunnel protocol/transport IPSEC/IP
  Tunnel transport MTU 1446 bytes

Tunnel protocol/transport IPSEC/IP confirms tunnel mode ipsec ipv4 took effect. If you see GRE/IP there, you built a GRE tunnel and wrapped it in IPsec, which is not what this article is about.

What is the crypto session actually protecting?

HUB#show crypto session detail
Session status: UP-ACTIVE
Peer: 198.51.100.2 port 500 fvrf: (none) ivrf: (none)
  IPSEC FLOW: permit ip   0.0.0.0/0.0.0.0 0.0.0.0/0.0.0.0
        Inbound:  #pkts dec'ed 5 drop 0 life (KB/Sec) 4607999/3576
        Outbound: #pkts enc'ed 5 drop 0 life (KB/Sec) 4607999/3576

Look at that IPSEC FLOW line. permit ip 0.0.0.0/0.0.0.0 0.0.0.0/0.0.0.0 is any-to-any. The VTI negotiates a wildcard traffic selector, which is precisely why there is no crypto ACL to mismatch. Both ends agree to protect "everything that arrives on this interface", and the routing table decides what arrives. If you have ever spent an afternoon diffing two crypto ACLs across a change window, that one line is the payoff for the whole design.

The MTU Detail Nobody Measures: 1446 vs 1438

Most articles hand-wave IPsec MTU with a vague "expect around 1400". We measured it, twice, on the same platform, and the number moved with the cipher.

SVTI with AES-GCM-256
Transport MTU: 1446 bytes
Integrity: inside the cipher (AEAD)
Separate HMAC: none
SVTI with AES-CBC-256 + SHA-256
Transport MTU: 1438 bytes
Integrity: separate HMAC field
Separate HMAC: yes, 8 more bytes of overhead

Same platform, same tunnel type, same physical MTU of 1500. The only variable is the cipher, and the difference is 8 bytes. A CBC + SHA-256 ESP packet has to carry a truncated HMAC field on top of the encrypted payload. A GCM packet does not: the authentication tag is part of the AEAD construction and the ESP overhead is smaller. Eight bytes will not save your network on its own, but it is a concrete, checkable demonstration that AEAD is not just a security argument, it is a wire-efficiency argument too. And it is a good sanity check: if your GCM VTI is not showing 1446 on IOS XE with a 1500-byte underlay, something in the stack is not what you think it is.

Why AES-GCM, Specifically

AES-GCM is an AEAD cipher: authenticated encryption with associated data. Confidentiality and integrity are produced by a single pass over the data instead of "encrypt, then compute a separate HMAC over the ciphertext". Three consequences you can see:

  • It shows up in the SA as an absence. The IKEv2 SA reads Encr: AES-GCM, keysize: 256, PRF: SHA256, Hash: None, and the child SA reads Encr: AES-GCM, keysize: 256, esp_hmac: None. Hash: None is not a misconfiguration, it is the point.
  • It is hardware-friendly. Modern CPUs and ASICs implement AES-GCM natively, and the single-pass design parallelises where encrypt-then-MAC does not.
  • It is smaller on the wire. See the 8 bytes above.

The one thing to respect: GCM is unforgiving about IV/nonce reuse. That is a job for the implementation, not for you, but it is the reason you should be running current code rather than an image from 2015.

Where This Design Stops Working

Be honest about the ceiling. A static VTI is one tunnel interface per peer. Every remote site needs its own Tunnel interface, its own tunnel destination, and its own routing. Add a keyring entry per peer, or accept a wildcard PSK you probably do not want.

At three sites, that is fine. It is explicit, greppable, and trivially troubleshootable, and you should not over-engineer it. At ten sites it is annoying. At thirty sites it is a config-management problem you have invented for yourself, and if you also want spoke-to-spoke traffic, static VTIs cannot give it to you without a full mesh (n(n-1)/2 tunnels, which is a number that stops being funny fast).

That is exactly the gap FlexVPN and DMVPN exist to fill. Both replace the per-peer static tunnel with a dynamic one: a single virtual-template or mGRE interface that spawns tunnels on demand, with hub-pushed routing (FlexVPN's IKEv2 authorization policy) or NHRP-driven spoke-to-spoke shortcuts (DMVPN Phase 3). The crypto you learned here does not change; the encapsulation and the tunnel lifecycle do.

Hardening Checklist

Pin an explicit proposal
IKEv2 smart defaults are genuinely modern (AES-CBC-256, SHA-512/384, DH 19/14/21) and they are great for a lab or a quick proof. In production, write the proposal yourself so you know exactly what you negotiated and so a code upgrade cannot silently change it.
DH group 19 or better
Group 19 (256-bit ECP) is the floor. Group 20 or 21 if the far end supports it. Anything in the single digits belongs in a museum.
AES-GCM-256 on the data plane
AEAD, no separate HMAC, less overhead. If a peer cannot do GCM, AES-CBC-256 with SHA-256 is the fallback, and you pay for it in bytes.
PSK for the lab, certificates for scale
A pre-shared key is fine for two peers you control. It does not scale, it cannot be revoked, and it ends up in a wiki. Move to certificate authentication before the peer count gets interesting.
Tighten the identity match
Match the remote identity on a /32 address (or an FQDN), not on a wildcard. A loose match identity remote plus a wildcard PSK is how you accidentally build an open VPN concentrator.
Mind the MTU
1446 with GCM on a 1500 underlay. Set ip tcp adjust-mss on the tunnel if you have TCP applications and a path that eats ICMP fragmentation-needed messages.

Key Takeaways

  • IKEv2 + AES-GCM-256 + static VTI is the default 2026 site-to-site build. Route-based, AEAD, and short enough to read on one screen.
  • The IPsec profile is the join. set transform-set gives it the cipher, set ikev2-profile gives it the IKEv2 policy. Forgetting the second line is the classic failure.
  • The tunnel interface needs two magic lines: tunnel mode ipsec ipv4 and tunnel protection ipsec profile. Verify with Tunnel protocol/transport IPSEC/IP.
  • There is no crypto ACL. show crypto session detail proves it: IPSEC FLOW: permit ip 0.0.0.0/0.0.0.0 0.0.0.0/0.0.0.0. Routing selects the traffic, and an IGP over the VTI works because the VTI is a real interface.
  • AEAD is measurable. GCM gave us a 1446-byte transport MTU where CBC + SHA-256 gave 1438 on the same platform. Eight bytes, because GCM carries no separate HMAC, which is also why the SA reads Hash: None.
  • One static VTI per peer. Fine at three sites, painful at thirty. That is what FlexVPN and DMVPN are for.

Build this one first, get comfortable with what a healthy show crypto session detail looks like, and then go read the rest of the IPsec VPN cluster to see how the same crypto gets reused underneath the dynamic designs.

Written by
More from Ping Labz
Great! You’ve successfully signed up.
Welcome back! You've successfully signed in.
You've successfully subscribed to Ping Labz.
Your link has expired.
Success! Check your email for magic link to sign-in.
Success! Your billing info has been updated.
Your billing was not updated.