1.. SPDX-License-Identifier: BSD-3-Clause 2 Copyright(c) 2016-2017 Intel Corporation. 3 4IPsec Security Gateway Sample Application 5========================================= 6 7The IPsec Security Gateway application is an example of a "real world" 8application using DPDK cryptodev framework. 9 10Overview 11-------- 12 13The application demonstrates the implementation of a Security Gateway 14(not IPsec compliant, see the Constraints section below) using DPDK based on RFC4301, 15RFC4303, RFC3602 and RFC2404. 16 17Internet Key Exchange (IKE) is not implemented, so only manual setting of 18Security Policies and Security Associations is supported. 19 20The Security Policies (SP) are implemented as ACL rules, the Security 21Associations (SA) are stored in a table and the routing is implemented 22using LPM. 23 24The application classifies the ports as *Protected* and *Unprotected*. 25Thus, traffic received on an Unprotected or Protected port is consider 26Inbound or Outbound respectively. 27 28The application also supports complete IPSec protocol offload to hardware 29(Look aside crypto accelarator or using ethernet device). It also support 30inline ipsec processing by the supported ethernet device during transmission. 31These modes can be selected during the SA creation configuration. 32 33In case of complete protocol offload, the processing of headers(ESP and outer 34IP header) is done by the hardware and the application does not need to 35add/remove them during outbound/inbound processing. 36 37For inline offloaded outbound traffic, the application will not do the LPM 38lookup for routing, as the port on which the packet has to be forwarded will be 39part of the SA. Security parameters will be configured on that port only, and 40sending the packet on other ports could result in unencrypted packets being 41sent out. 42 43The Path for IPsec Inbound traffic is: 44 45* Read packets from the port. 46* Classify packets between IPv4 and ESP. 47* Perform Inbound SA lookup for ESP packets based on their SPI. 48* Perform Verification/Decryption (Not needed in case of inline ipsec). 49* Remove ESP and outer IP header (Not needed in case of protocol offload). 50* Inbound SP check using ACL of decrypted packets and any other IPv4 packets. 51* Routing. 52* Write packet to port. 53 54The Path for the IPsec Outbound traffic is: 55 56* Read packets from the port. 57* Perform Outbound SP check using ACL of all IPv4 traffic. 58* Perform Outbound SA lookup for packets that need IPsec protection. 59* Add ESP and outer IP header (Not needed in case protocol offload). 60* Perform Encryption/Digest (Not needed in case of inline ipsec). 61* Routing. 62* Write packet to port. 63 64 65Constraints 66----------- 67 68* No IPv6 options headers. 69* No AH mode. 70* Supported algorithms: AES-CBC, AES-CTR, AES-GCM, HMAC-SHA1 and NULL. 71* Each SA must be handle by a unique lcore (*1 RX queue per port*). 72* No chained mbufs. 73 74Compiling the Application 75------------------------- 76 77To compile the sample application see :doc:`compiling`. 78 79The application is located in the ``rpsec-secgw`` sub-directory. 80 81#. [Optional] Build the application for debugging: 82 This option adds some extra flags, disables compiler optimizations and 83 is verbose:: 84 85 make DEBUG=1 86 87 88Running the Application 89----------------------- 90 91The application has a number of command line options:: 92 93 94 ./build/ipsec-secgw [EAL options] -- 95 -p PORTMASK -P -u PORTMASK -j FRAMESIZE 96 --config (port,queue,lcore)[,(port,queue,lcore] 97 --single-sa SAIDX 98 -f CONFIG_FILE_PATH 99 100Where: 101 102* ``-p PORTMASK``: Hexadecimal bitmask of ports to configure. 103 104* ``-P``: *optional*. Sets all ports to promiscuous mode so that packets are 105 accepted regardless of the packet's Ethernet MAC destination address. 106 Without this option, only packets with the Ethernet MAC destination address 107 set to the Ethernet address of the port are accepted (default is enabled). 108 109* ``-u PORTMASK``: hexadecimal bitmask of unprotected ports 110 111* ``-j FRAMESIZE``: *optional*. Enables jumbo frames with the maximum size 112 specified as FRAMESIZE. If an invalid value is provided as FRAMESIZE 113 then the default value 9000 is used. 114 115* ``--config (port,queue,lcore)[,(port,queue,lcore)]``: determines which queues 116 from which ports are mapped to which cores. 117 118* ``--single-sa SAIDX``: use a single SA for outbound traffic, bypassing the SP 119 on both Inbound and Outbound. This option is meant for debugging/performance 120 purposes. 121 122* ``-f CONFIG_FILE_PATH``: the full path of text-based file containing all 123 configuration items for running the application (See Configuration file 124 syntax section below). ``-f CONFIG_FILE_PATH`` **must** be specified. 125 **ONLY** the UNIX format configuration file is accepted. 126 127 128The mapping of lcores to port/queues is similar to other l3fwd applications. 129 130For example, given the following command line:: 131 132 ./build/ipsec-secgw -l 20,21 -n 4 --socket-mem 0,2048 \ 133 --vdev "crypto_null" -- -p 0xf -P -u 0x3 \ 134 --config="(0,0,20),(1,0,20),(2,0,21),(3,0,21)" \ 135 -f /path/to/config_file \ 136 137where each options means: 138 139* The ``-l`` option enables cores 20 and 21. 140 141* The ``-n`` option sets memory 4 channels. 142 143* The ``--socket-mem`` to use 2GB on socket 1. 144 145* The ``--vdev "crypto_null"`` option creates virtual NULL cryptodev PMD. 146 147* The ``-p`` option enables ports (detected) 0, 1, 2 and 3. 148 149* The ``-P`` option enables promiscuous mode. 150 151* The ``-u`` option sets ports 1 and 2 as unprotected, leaving 2 and 3 as protected. 152 153* The ``--config`` option enables one queue per port with the following mapping: 154 155 +----------+-----------+-----------+---------------------------------------+ 156 | **Port** | **Queue** | **lcore** | **Description** | 157 | | | | | 158 +----------+-----------+-----------+---------------------------------------+ 159 | 0 | 0 | 20 | Map queue 0 from port 0 to lcore 20. | 160 | | | | | 161 +----------+-----------+-----------+---------------------------------------+ 162 | 1 | 0 | 20 | Map queue 0 from port 1 to lcore 20. | 163 | | | | | 164 +----------+-----------+-----------+---------------------------------------+ 165 | 2 | 0 | 21 | Map queue 0 from port 2 to lcore 21. | 166 | | | | | 167 +----------+-----------+-----------+---------------------------------------+ 168 | 3 | 0 | 21 | Map queue 0 from port 3 to lcore 21. | 169 | | | | | 170 +----------+-----------+-----------+---------------------------------------+ 171 172* The ``-f /path/to/config_file`` option enables the application read and 173 parse the configuration file specified, and configures the application 174 with a given set of SP, SA and Routing entries accordingly. The syntax of 175 the configuration file will be explained below in more detail. Please 176 **note** the parser only accepts UNIX format text file. Other formats 177 such as DOS/MAC format will cause a parse error. 178 179Refer to the *DPDK Getting Started Guide* for general information on running 180applications and the Environment Abstraction Layer (EAL) options. 181 182The application would do a best effort to "map" crypto devices to cores, with 183hardware devices having priority. Basically, hardware devices if present would 184be assigned to a core before software ones. 185This means that if the application is using a single core and both hardware 186and software crypto devices are detected, hardware devices will be used. 187 188A way to achieve the case where you want to force the use of virtual crypto 189devices is to whitelist the Ethernet devices needed and therefore implicitly 190blacklisting all hardware crypto devices. 191 192For example, something like the following command line: 193 194.. code-block:: console 195 196 ./build/ipsec-secgw -l 20,21 -n 4 --socket-mem 0,2048 \ 197 -w 81:00.0 -w 81:00.1 -w 81:00.2 -w 81:00.3 \ 198 --vdev "crypto_aesni_mb" --vdev "crypto_null" \ 199 -- \ 200 -p 0xf -P -u 0x3 --config="(0,0,20),(1,0,20),(2,0,21),(3,0,21)" \ 201 -f sample.cfg 202 203 204Configurations 205-------------- 206 207The following sections provide the syntax of configurations to initialize 208your SP, SA and Routing tables. 209Configurations shall be specified in the configuration file to be passed to 210the application. The file is then parsed by the application. The successful 211parsing will result in the appropriate rules being applied to the tables 212accordingly. 213 214 215Configuration File Syntax 216~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 217 218As mention in the overview, the Security Policies are ACL rules. 219The application parsers the rules specified in the configuration file and 220passes them to the ACL table, and replicates them per socket in use. 221 222Following are the configuration file syntax. 223 224General rule syntax 225^^^^^^^^^^^^^^^^^^^ 226 227The parse treats one line in the configuration file as one configuration 228item (unless the line concatenation symbol exists). Every configuration 229item shall follow the syntax of either SP, SA, or Routing rules specified 230below. 231 232The configuration parser supports the following special symbols: 233 234 * Comment symbol **#**. Any character from this symbol to the end of 235 line is treated as comment and will not be parsed. 236 237 * Line concatenation symbol **\\**. This symbol shall be placed in the end 238 of the line to be concatenated to the line below. Multiple lines' 239 concatenation is supported. 240 241 242SP rule syntax 243^^^^^^^^^^^^^^ 244 245The SP rule syntax is shown as follows: 246 247.. code-block:: console 248 249 sp <ip_ver> <dir> esp <action> <priority> <src_ip> <dst_ip> 250 <proto> <sport> <dport> 251 252 253where each options means: 254 255``<ip_ver>`` 256 257 * IP protocol version 258 259 * Optional: No 260 261 * Available options: 262 263 * *ipv4*: IP protocol version 4 264 * *ipv6*: IP protocol version 6 265 266``<dir>`` 267 268 * The traffic direction 269 270 * Optional: No 271 272 * Available options: 273 274 * *in*: inbound traffic 275 * *out*: outbound traffic 276 277``<action>`` 278 279 * IPsec action 280 281 * Optional: No 282 283 * Available options: 284 285 * *protect <SA_idx>*: the specified traffic is protected by SA rule 286 with id SA_idx 287 * *bypass*: the specified traffic traffic is bypassed 288 * *discard*: the specified traffic is discarded 289 290``<priority>`` 291 292 * Rule priority 293 294 * Optional: Yes, default priority 0 will be used 295 296 * Syntax: *pri <id>* 297 298``<src_ip>`` 299 300 * The source IP address and mask 301 302 * Optional: Yes, default address 0.0.0.0 and mask of 0 will be used 303 304 * Syntax: 305 306 * *src X.X.X.X/Y* for IPv4 307 * *src XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX/Y* for IPv6 308 309``<dst_ip>`` 310 311 * The destination IP address and mask 312 313 * Optional: Yes, default address 0.0.0.0 and mask of 0 will be used 314 315 * Syntax: 316 317 * *dst X.X.X.X/Y* for IPv4 318 * *dst XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX/Y* for IPv6 319 320``<proto>`` 321 322 * The protocol start and end range 323 324 * Optional: yes, default range of 0 to 0 will be used 325 326 * Syntax: *proto X:Y* 327 328``<sport>`` 329 330 * The source port start and end range 331 332 * Optional: yes, default range of 0 to 0 will be used 333 334 * Syntax: *sport X:Y* 335 336``<dport>`` 337 338 * The destination port start and end range 339 340 * Optional: yes, default range of 0 to 0 will be used 341 342 * Syntax: *dport X:Y* 343 344Example SP rules: 345 346.. code-block:: console 347 348 sp ipv4 out esp protect 105 pri 1 dst 192.168.115.0/24 sport 0:65535 \ 349 dport 0:65535 350 351 sp ipv6 in esp bypass pri 1 dst 0000:0000:0000:0000:5555:5555:\ 352 0000:0000/96 sport 0:65535 dport 0:65535 353 354 355SA rule syntax 356^^^^^^^^^^^^^^ 357 358The successfully parsed SA rules will be stored in an array table. 359 360The SA rule syntax is shown as follows: 361 362.. code-block:: console 363 364 sa <dir> <spi> <cipher_algo> <cipher_key> <auth_algo> <auth_key> 365 <mode> <src_ip> <dst_ip> <action_type> <port_id> 366 367where each options means: 368 369``<dir>`` 370 371 * The traffic direction 372 373 * Optional: No 374 375 * Available options: 376 377 * *in*: inbound traffic 378 * *out*: outbound traffic 379 380``<spi>`` 381 382 * The SPI number 383 384 * Optional: No 385 386 * Syntax: unsigned integer number 387 388``<cipher_algo>`` 389 390 * Cipher algorithm 391 392 * Optional: Yes, unless <aead_algo> is not used 393 394 * Available options: 395 396 * *null*: NULL algorithm 397 * *aes-128-cbc*: AES-CBC 128-bit algorithm 398 * *aes-256-cbc*: AES-CBC 256-bit algorithm 399 * *aes-128-ctr*: AES-CTR 128-bit algorithm 400 401 * Syntax: *cipher_algo <your algorithm>* 402 403``<cipher_key>`` 404 405 * Cipher key, NOT available when 'null' algorithm is used 406 407 * Optional: Yes, unless <aead_algo> is not used. 408 Must be followed by <cipher_algo> option 409 410 * Syntax: Hexadecimal bytes (0x0-0xFF) concatenate by colon symbol ':'. 411 The number of bytes should be as same as the specified cipher algorithm 412 key size. 413 414 For example: *cipher_key A1:B2:C3:D4:A1:B2:C3:D4:A1:B2:C3:D4: 415 A1:B2:C3:D4* 416 417``<auth_algo>`` 418 419 * Authentication algorithm 420 421 * Optional: Yes, unless <aead_algo> is not used 422 423 * Available options: 424 425 * *null*: NULL algorithm 426 * *sha1-hmac*: HMAC SHA1 algorithm 427 428``<auth_key>`` 429 430 * Authentication key, NOT available when 'null' or 'aes-128-gcm' algorithm 431 is used. 432 433 * Optional: Yes, unless <aead_algo> is not used. 434 Must be followed by <auth_algo> option 435 436 * Syntax: Hexadecimal bytes (0x0-0xFF) concatenate by colon symbol ':'. 437 The number of bytes should be as same as the specified authentication 438 algorithm key size. 439 440 For example: *auth_key A1:B2:C3:D4:A1:B2:C3:D4:A1:B2:C3:D4:A1:B2:C3:D4: 441 A1:B2:C3:D4* 442 443``<aead_algo>`` 444 445 * AEAD algorithm 446 447 * Optional: Yes, unless <cipher_algo> and <auth_algo> are not used 448 449 * Available options: 450 451 * *aes-128-gcm*: AES-GCM 128-bit algorithm 452 453 * Syntax: *cipher_algo <your algorithm>* 454 455``<aead_key>`` 456 457 * Cipher key, NOT available when 'null' algorithm is used 458 459 * Optional: Yes, unless <cipher_algo> and <auth_algo> are not used. 460 Must be followed by <aead_algo> option 461 462 * Syntax: Hexadecimal bytes (0x0-0xFF) concatenate by colon symbol ':'. 463 The number of bytes should be as same as the specified AEAD algorithm 464 key size. 465 466 For example: *aead_key A1:B2:C3:D4:A1:B2:C3:D4:A1:B2:C3:D4: 467 A1:B2:C3:D4* 468 469``<mode>`` 470 471 * The operation mode 472 473 * Optional: No 474 475 * Available options: 476 477 * *ipv4-tunnel*: Tunnel mode for IPv4 packets 478 * *ipv6-tunnel*: Tunnel mode for IPv6 packets 479 * *transport*: transport mode 480 481 * Syntax: mode XXX 482 483``<src_ip>`` 484 485 * The source IP address. This option is not available when 486 transport mode is used 487 488 * Optional: Yes, default address 0.0.0.0 will be used 489 490 * Syntax: 491 492 * *src X.X.X.X* for IPv4 493 * *src XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX* for IPv6 494 495``<dst_ip>`` 496 497 * The destination IP address. This option is not available when 498 transport mode is used 499 500 * Optional: Yes, default address 0.0.0.0 will be used 501 502 * Syntax: 503 504 * *dst X.X.X.X* for IPv4 505 * *dst XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX* for IPv6 506 507``<type>`` 508 509 * Action type to specify the security action. This option specify 510 the SA to be performed with look aside protocol offload to HW 511 accelerator or protocol offload on ethernet device or inline 512 crypto processing on the ethernet device during transmission. 513 514 * Optional: Yes, default type *no-offload* 515 516 * Available options: 517 518 * *lookaside-protocol-offload*: look aside protocol offload to HW accelerator 519 * *inline-protocol-offload*: inline protocol offload on ethernet device 520 * *inline-crypto-offload*: inline crypto processing on ethernet device 521 * *no-offload*: no offloading to hardware 522 523 ``<port_id>`` 524 525 * Port/device ID of the ethernet/crypto accelerator for which the SA is 526 configured. For *inline-crypto-offload* and *inline-protocol-offload*, this 527 port will be used for routing. The routing table will not be referred in 528 this case. 529 530 * Optional: No, if *type* is not *no-offload* 531 532 * Syntax: 533 534 * *port_id X* X is a valid device number in decimal 535 536 537Example SA rules: 538 539.. code-block:: console 540 541 sa out 5 cipher_algo null auth_algo null mode ipv4-tunnel \ 542 src 172.16.1.5 dst 172.16.2.5 543 544 sa out 25 cipher_algo aes-128-cbc \ 545 cipher_key c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3 \ 546 auth_algo sha1-hmac \ 547 auth_key c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3:c3 \ 548 mode ipv6-tunnel \ 549 src 1111:1111:1111:1111:1111:1111:1111:5555 \ 550 dst 2222:2222:2222:2222:2222:2222:2222:5555 551 552 sa in 105 aead_algo aes-128-gcm \ 553 aead_key de:ad:be:ef:de:ad:be:ef:de:ad:be:ef:de:ad:be:ef:de:ad:be:ef \ 554 mode ipv4-tunnel src 172.16.2.5 dst 172.16.1.5 555 556 sa out 5 cipher_algo aes-128-cbc cipher_key 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 \ 557 auth_algo sha1-hmac auth_key 0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 \ 558 mode ipv4-tunnel src 172.16.1.5 dst 172.16.2.5 \ 559 type lookaside-protocol-offload port_id 4 560 561Routing rule syntax 562^^^^^^^^^^^^^^^^^^^ 563 564The Routing rule syntax is shown as follows: 565 566.. code-block:: console 567 568 rt <ip_ver> <src_ip> <dst_ip> <port> 569 570 571where each options means: 572 573``<ip_ver>`` 574 575 * IP protocol version 576 577 * Optional: No 578 579 * Available options: 580 581 * *ipv4*: IP protocol version 4 582 * *ipv6*: IP protocol version 6 583 584``<src_ip>`` 585 586 * The source IP address and mask 587 588 * Optional: Yes, default address 0.0.0.0 and mask of 0 will be used 589 590 * Syntax: 591 592 * *src X.X.X.X/Y* for IPv4 593 * *src XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX/Y* for IPv6 594 595``<dst_ip>`` 596 597 * The destination IP address and mask 598 599 * Optional: Yes, default address 0.0.0.0 and mask of 0 will be used 600 601 * Syntax: 602 603 * *dst X.X.X.X/Y* for IPv4 604 * *dst XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX/Y* for IPv6 605 606``<port>`` 607 608 * The traffic output port id 609 610 * Optional: yes, default output port 0 will be used 611 612 * Syntax: *port X* 613 614Example SP rules: 615 616.. code-block:: console 617 618 rt ipv4 dst 172.16.1.5/32 port 0 619 620 rt ipv6 dst 1111:1111:1111:1111:1111:1111:1111:5555/116 port 0 621