> On May 9, 2020, at 7:23 AM, Neale Ranns via lists.fd.io 
> <nranns=cisco....@lists.fd.io> wrote:
> 
>
> 
> Hi Chris,
> 
> 
> > Are there other properties of a tunnel mode SA that you need that are lost 
> > with this approach?
> 
> I need to use tunnel mode SAs provided by IKEv2. Transport mode is an 
> optional (normally on-the-wire IKEv2 negotiated) feature of IPsec. These 
> tunnel mode SAs will have IPTFS enabled on them, and that functionality is 
> only defined for IPsec tunnel mode SAs.
> 
> 
> The only difference in VPP between a transport and tunnel mode SA is the 
> presence of the encap. So I think it’s fair to say that what you need is an 
> interface to interact with the L[23] system, ‘encap’ to describe how to 
> encap/decap packets (i.e. what to copy from overlay/underlay (DSCP, ECN, etc) 
> and an SA (for the algo set);
> 
>   Interface + encap + SA
> 
> VPP doesn’t model encap separately. So it’s a question of where you add the 
> parenthesis.
> 
>   (interface + encap) + SA = ipip tunnel + transport mode SA
> 
> Or
> 
>   Interface + (encap + SA) = ipsec dedicated interface + tunnel mode SA
> 
> In both cases the same information is available, it’s just modelled 
> differently. The first model is used since it reuses the types/functionality 
> that VPP already has to support other use case, without the need for a 
> dedicated interface type. Is it not possible for you to work with the first 
> model, or is it less convenient?

SO, I have implemented https://tools.ietf.org/html/draft-ietf-ipsecme-iptfs-01 
in VPP 19.08. The functionality is working as specified in the draft using 
tunnel mode SAs.

Conceptually what happens (commonly) is this:


Pkt   Pkt                                                     Single IPsec 
Tunnel Pkt
---   ---                                             
--------------------------------------
[UA]..[Un] ---> user-intf [ VPP ] sa-tunnel-intf ---> [IP(SATunnel) + ESP + 
[UA]..[Un][Pad]]


The encpasulation *has* to occur at the SA tunnel point, not pre-encapsulated 
by a generic IP-IP interface with a transport mode SA attached to it downstream.

The key here is that there is not a 1-1 mapping of user IP packets to IPsec 
packets. FWIW, this isn't just a problem for this particular IPTFS technology, 
there are other simple cases (e.g., sending only pad IPsec packets for limited 
traffic flow confidentiality) where there is not a 1-1 mapping between user IP 
packets and SA tunnel mode packets.

Now, re-architecting IPTFS to exist outside of IPsec so that it could be a new 
generic IP tunnel technology is certainly a fun idea (topic for another 
thread), it's just not an option, or relevant to the functionality that appears 
to have been lost in VPP.

Here's a packet trace for how this works (incoming ping):

USER-SIDE:

00:00:08:845351: dpdk-input
  ...
  ICMP echo_request checksum 0xaea9
00:00:08:845366: ethernet-input
00:00:08:845382: ip4-input-no-checksum
  ICMP: 11.11.11.253 -> 12.12.12.12
  ICMP echo_request checksum 0xaea9
00:00:08:845389: ip4-lookup
  ICMP: 11.11.11.253 -> 12.12.12.12
  ICMP echo_request checksum 0xaea9
00:00:08:845396: ip4-midchain
    ICMP: 11.11.11.253 -> 12.12.12.12
    ICMP echo_request checksum 0xaea9
00:00:08:845402: iptfs-encap4-tun
  sa_index: 1


AGGREGATING AND QUEUEING OCCURS - The packet is encapsulated (along with any 
others currently waiting) into the next-to-be-sent IPTFS packet, which is 
queued to be sent on a timer from another thread, that output thread follows:


SEUCRE-SIDE:

Packet 1

This is the next IPTFS packet to send (in this case it just has the 1 ping 
packet inside but usually has multiple when there's real traffic):

 00:00:08:851581: handoff_trace
   HANDED-OFF: from thread 1 trace index 0
 00:00:08:851581: iptfs-output
     IPTFS Basic Header: flags: 0 resv 0 offset 0:[output gen: 526 pkt 0 of 1]:
     datablock  0: type: IPv4 offset:    4 pktlen:   84
     datablock  1: type: Pad  offset:   88 pktlen: 1382
 00:00:08:851622: dpdk-esp4-encrypt
   spi 1112 seq 1 seq_hi 0 iv_size 0 trunc_size 0
   pad_bytes 0 next_header 143
   cipher none auth none
     IPTFS Basic Header: flags: 0 resv 0 offset 0

This is the output from the DPDK encryption offload (same packet as above but 
encrypted)

 Packet 2

 00:00:08:851659: dpdk-crypto-input
   cryptodev-id 0 next-index 1
 00:00:08:851663: ip4-lookup
   fib 0 dpo-idx 3 flow hash: 0x00000000
   IPSEC_ESP: 13.13.13.11 -> 13.13.13.12
 00:00:08:851671: ip4-rewrite
 00:00:08:851676: TenGigabitEthernet65/0/1-output
   TenGigabitEthernet65/0/1
   IP4: f8:f2:1e:3c:08:29 -> f8:f2:1e:3c:09:b1
   IPSEC_ESP: 13.13.13.11 -> 13.13.13.12
 00:00:08:851682: TenGigabitEthernet65/0/1-tx
   TenGigabitEthernet65/0/1 tx queue 5
   buffer 0x3feb11e: current data -32, length 1514, buffer-pool 0, ref-count 1, 
totlen-nifb 0, trace handle 0x5000001


To arrive at this setup the code I add myself as a feature.

  VNET_FEATURE_INIT (iptfs_encap4_tun_feat_node, static) = {
    .arc_name = "ip4-output",
    .node_name = "iptfs-encap4-tun",
    .runs_before = VNET_FEATURES ("esp4-encrypt-tun", "dpdk-esp4-encrypt-tun"),
  };

  ipsec_add_feature ("ip4-output", "iptfs-encap4-tun",
                     &tfsm->encap4_tun_feature_index);
 
then inside ipsec_tunnel_feature_set I do (in a callback, but whatever):

  vnet_feature_enable_disable_with_index (
      arc, tfsm->encap4_tun_feature_index, t->sw_if_index, enable,
      &t->output_sa_index, sizeof (t->output_sa_index));

To enable the IPTFS feature on the ipsec* interface arc.

If I have missed a simple way to do this with the new code, I'm all ears and 
thankful for help. :)

Thanks,
Chris.


> 
> /neale
> 
>
> 
> 
> There will be future work in IETF/ipsecme to enable a form of transport mode 
> support in IPTFS to handle the Cisco-preferred GRE with transport mode IPsec 
> configuration, but that is not available today, and obviously won't be the 
> only option standardized.
> 
> Thanks,
> Chris.
> 
> 
> > /neale
> > 
> >
> > 
> >
> > 
> > 
> > Thanks,
> > Chris.
> > 
> > 
> > > 
> > >    I did read through the Wiki and it seems that this change was 
> > > motivated by wanting to cleanup the IPsec API, but that hardly seems like 
> > > justification to eliminate the efficient use of an entire variant of 
> > > commonly used IPsec functionality.
> > > 
> > > Cleaning up the API was one motivation. It was a pain that each time we 
> > > added new attributes to SA creation (like ESN, UDP, algo=foo) (for use 
> > > with the SPD) we had to make similar changes to both the ipsec and 
> > > ipsec_gre create APIs. The other motivation was removing 2 interface 
> > > types that did exactly the same as the existing ipip and gre tunnels (and 
> > > the same goes for their APIs too, like how do I configure what DCSP, ECN, 
> > > DF to copy on encap/decap).
> > > 
> > > /neale
> > > 
> > > 
> > > 
> > >    Could we bring back the functionality using more "acceptable to the 
> > > project" APIs or something?
> > > 
> > >    Thanks,
> > >    Chris.
> > > 
> > >> 
> > >> /neale
> > >> 
> > >> 
> > >> From: <vpp-dev@lists.fd.io> on behalf of Christian Hopps 
> > >> <cho...@chopps.org>
> > >> Date: Wednesday 6 May 2020 at 14:32
> > >> To: vpp-dev <vpp-dev@lists.fd.io>
> > >> Cc: Christian Hopps <cho...@chopps.org>
> > >> Subject: [vpp-dev] IPsec tunnel interfaces?
> > >> 
> > >> Hi, vpp-dev,
> > >> 
> > >> Post 19.08 seems to have removed IPsec logical interfaces.
> > >> 
> > >> One cannot always use transport mode IPsec.
> > >> 
> > >> How can I get the efficiency of route based (FIB) IPsec w/o transport 
> > >> mode? Adding superfluous encapsulations (wasting bandwidth) to replace 
> > >> this (seemingly lost, hope not) functionality is not an option.
> > >> 
> > >> Thanks,
> > >> Chris.
> > >> 
> > 
> > 
> 
> 

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#16297): https://lists.fd.io/g/vpp-dev/message/16297
Mute This Topic: https://lists.fd.io/mt/74027328/21656
Group Owner: vpp-dev+ow...@lists.fd.io
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to