Hi! I tried to complie strongswan with "kernel-libipsec" plugin fro the same reason....
https://wiki.strongswan.org/projects/strongswan/wiki/Kernel-libipsec The *kernel-libipsec* plugin provides an IPsec backend that works entirely in userland, using TUN devices My experience is that there is some work to be done to use, but my C fu isnt strong enough to finish..... I made a simple patch, for the tun handling: --- src/libstrongswan/networking/tun_device.c.orig Fri Feb 23 10:10:34 2018 +++ src/libstrongswan/networking/tun_device.c Fri Feb 23 10:43:38 2018 @@ -62,6 +62,10 @@ #include <net/if_tun.h> #include <net/if_var.h> #include <netinet/in_var.h> +#elif __OpenBSD__ +#include <net/if_tun.h> +#include <net/if_var.h> +#include <netinet/in_var.h> #else #include <net/if_tun.h> #endif @@ -338,6 +342,12 @@ uint32_t proto = htonl(AF_INET); packet = chunk_cata("cc", chunk_from_thing(proto), packet); #endif +#ifdef __OpenBSD__ + /* OpenBSD tun expect the packets to be prepended by a 32-bit protocol number + * instead of parsing the packet again, we assume IPv4 for now */ + uint32_t proto = htonl(AF_INET); + packet = chunk_cata("cc", chunk_from_thing(proto), packet); +#endif s = write(this->tunfd, packet.ptr, packet.len); if (s < 0) { @@ -374,6 +384,10 @@ #ifdef __APPLE__ /* UTUN's prepend packets with a 32-bit protocol number */ data = chunk_skip(data, sizeof(uint32_t)); +#endif +#ifdef __OpenBSD__ + /* OpenBSD tun prepend packets with a 32-bit protocol number */ + data = chunk_skip(data, sizeof(uint32_t)); #endif *packet = chunk_clone(data); return TRUE; I compile Strongswan 5.6.2 with the following options: CC=clang ./configure --disable-kernel-netlink --enable-kernel-pfroute --enable-kernel-libipsec --disable-scripts --enable-eap-mschapv2 --enable-md4 --enable-eap-tls --enable-eap-ttls --enable-eap-peap --enable-eap-radius --enable-eap-identity --enable-aesni --enable-gcm make make install openbsdvm1# ipsec start Starting strongSwan 5.6.2 IPsec [starter]... no netkey IPsec stack detected no KLIPS IPsec stack detected no known IPsec stack detected, ignoring! I"m using EAP-MSCHAPv2 client config with virtual IP address request , and the IKE part is working out of the box: conn vpn.csszep.net left=192.168.56.11 leftsourceip=%config leftauth=eap eap_identity=carol right=vpn.csszep.net rightauth=pubkey #rightid=@vpn.csszep.net rightid="C=HU O=Strongswan CN=vpn.csszep.net" rightsubnet=192.0.2.0/24 auto=add openbsdvm1# ipsec up vpn.csszep.net initiating IKE_SA vpn.csszep.net[1] to 192.168.56.16 generating IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) ] sending packet: from 192.168.56.11[500] to 192.168.56.16[500] (748 bytes) received packet: from 192.168.56.16[500] to 192.168.56.11[500] (38 bytes) parsed IKE_SA_INIT response 0 [ N(INVAL_KE) ] peer didn't accept DH group CURVE_25519, it requested MODP_3072 initiating IKE_SA vpn.csszep.net[1] to 192.168.56.16 generating IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) ] sending packet: from 192.168.56.11[500] to 192.168.56.16[500] (1100 bytes) received packet: from 192.168.56.16[500] to 192.168.56.11[500] (592 bytes) parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(MULT_AUTH) ] faking NAT situation to enforce UDP encapsulation sending cert request for "C=HU O=Strongswan CN=Strongswan CA" establishing CHILD_SA vpn.csszep.net{1} generating IKE_AUTH request 1 [ IDi N(INIT_CONTACT) CERTREQ IDr CPRQ(ADDR DNS) SA TSi TSr N(MOBIKE_SUP) N(ADD_4_ADDR) N(MULT_AUTH) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ] sending packet: from 192.168.56.11[4500] to 192.168.56.16[4500] (384 bytes) received packet: from 192.168.56.16[4500] to 192.168.56.11[4500] (1184 bytes) parsed IKE_AUTH response 1 [ IDr CERT AUTH EAP/REQ/ID ] received end entity cert "C=HU O=Strongswan CN=vpn.csszep.net" using certificate "C=HU O=Strongswan CN=vpn.csszep.net" using trusted ca certificate "C=HU O=Strongswan CN=Strongswan CA" checking certificate status of "C=HU O=Strongswan CN=vpn.csszep.net" certificate status is not available reached self-signed root ca with a path length of 0 authentication of 'C=HU O=Strongswan CN=vpn.csszep.net' with RSA_EMSA_PKCS1_SHA2_256 successful server requested EAP_IDENTITY (id 0x00), sending 'carol' generating IKE_AUTH request 2 [ EAP/RES/ID ] sending packet: from 192.168.56.11[4500] to 192.168.56.16[4500] (80 bytes) received packet: from 192.168.56.16[4500] to 192.168.56.11[4500] (112 bytes) parsed IKE_AUTH response 2 [ EAP/REQ/MSCHAPV2 ] server requested EAP_MSCHAPV2 authentication (id 0x42) generating IKE_AUTH request 3 [ EAP/RES/MSCHAPV2 ] sending packet: from 192.168.56.11[4500] to 192.168.56.16[4500] (144 bytes) received packet: from 192.168.56.16[4500] to 192.168.56.11[4500] (144 bytes) parsed IKE_AUTH response 3 [ EAP/REQ/MSCHAPV2 ] EAP-MS-CHAPv2 succeeded: 'Welcome2strongSwan' generating IKE_AUTH request 4 [ EAP/RES/MSCHAPV2 ] sending packet: from 192.168.56.11[4500] to 192.168.56.16[4500] (80 bytes) received packet: from 192.168.56.16[4500] to 192.168.56.11[4500] (80 bytes) parsed IKE_AUTH response 4 [ EAP/SUCC ] EAP method EAP_MSCHAPV2 succeeded, MSK established authentication of '192.168.56.11' (myself) with EAP generating IKE_AUTH request 5 [ AUTH ] sending packet: from 192.168.56.11[4500] to 192.168.56.16[4500] (112 bytes) received packet: from 192.168.56.16[4500] to 192.168.56.11[4500] (288 bytes) parsed IKE_AUTH response 5 [ AUTH CPRP(ADDR) SA TSi TSr N(AUTH_LFT) N(MOBIKE_SUP) N(ADD_4_ADDR) N(ADD_4_ADDR) N(ADD_6_ADDR) ] authentication of 'C=HU O=Strongswan CN=vpn.csszep.net' with EAP successful IKE_SA vpn.csszep.net[1] established between 192.168.56.11[192.168.56.11]...192.168.56.16[C=HU O=Strongswan CN= vpn.csszep.net] scheduling reauthentication in 3306s maximum IKE_SA lifetime 3486s installing new virtual IP 100.64.0.1 created TUN device: tun1 CHILD_SA vpn.csszep.net{1} established with SPIs dfb653d8_i c4694ca1_o and TS 100.64.0.1/32 === 192.0.2.0/24 received AUTH_LIFETIME of 3305s, scheduling reauthentication in 3125s connection 'vpn.csszep.net' established successfully vpn.csszep.net{2}: 100.64.0.1/32 === 192.0.2.0/24 openbsdvm1# ipsec statusall Status of IKE charon daemon (strongSwan 5.6.2, OpenBSD 6.2, amd64): uptime: 2 minutes, since Feb 23 11:10:00 2018 worker threads: 7 of 16 idle, 5/0/4/0 working, job queue: 0/0/0/0, scheduled: 5 loaded plugins: charon aesni aes des rc2 sha2 sha1 md4 md5 mgf1 random nonce x509 revocation constraints pubkey pkcs1 pkcs7 pkcs8 pkcs12 pgp dnskey sshkey pem fips-prf gmp curve25519 xcbc cmac hmac gcm attr kernel-libipsec kernel-pfroute resolve socket-default stroke vici updown eap-identity eap-mschapv2 eap-radius eap-tls eap-ttls eap-peap xauth-generic counters Listening IP addresses: 10.0.2.7 192.168.56.11 100.64.0.1 Connections: vpn.csszep.net: 192.168.56.11...vpn.csszep.net IKEv2 vpn.csszep.net: local: [192.168.56.11] uses EAP authentication with EAP identity 'carol' vpn.csszep.net: remote: [C=HU O=Strongswan CN=vpn.csszep.net] uses public key authentication vpn.csszep.net: child: dynamic === 192.0.2.0/24 TUNNEL Security Associations (1 up, 0 connecting): vpn.csszep.net[1]: ESTABLISHED 33 seconds ago, 192.168.56.11[192.168.56.11]...192.168.56.16[C=HU O=Strongswan CN= vpn.csszep.net] vpn.csszep.net[1]: IKEv2 SPIs: 40308e6851944359_i* 1b483d60e9c79442_r, EAP reauthentication in 51 minutes vpn.csszep.net[1]: IKE proposal: AES_CBC_128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_3072 vpn.csszep.net{1}: INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: dfb653d8_i c4694ca1_o vpn.csszep.net{1}: AES_CBC_128/HMAC_SHA2_256_128, 0 bytes_i, 0 bytes_o, rekeying in 13 minutes vpn.csszep.net{1}: 100.64.0.1/32 === 192.0.2.0/24 Strongswan brings up the tun device with the proper IP address: openbsdvm1# ifconfig tun1 tun1: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500 index 13 priority 0 llprio 3 groups: tun status: active inet 100.64.0.1 --> 0.0.0.0 netmask 0xffffffff But Strongswan installs the 192.0.2.0/24 route to the worng interface. But its easy to correct.. openbsdvm1# route -n show | grep 192.0.2 192.0.2/24 192.168.56.16 US 0 0 - 8 em1 openbsdvm1# route del 192.0.2.0/24 del net 192.0.2.0/24 openbsdvm1# route add 192.0.2.0/24 100.64.0.1 add net 192.0.2.0/24: gateway 100.64.0.1 Now comes the wrong part... If i ping 192.0.2.1 packet leaves the box, and the answer is coming back, but Strongswan somehow not inject back the cleartext packet to the tun interface. openbsdvm1# tcpdump -vpni em1 not port 22 tcpdump: listening on em1, link-type EN10MB 11:19:37.366124 192.168.56.11.4500 > 192.168.56.16.4500: udpencap: esp 192.168.56.11 > 192.168.56.16 spi 0xc4694ca1 seq 4 len 136 (ttl 64, id 39109, len 164) 11:19:37.366384 192.168.56.16.4500 > 192.168.56.11.4500: [no udp cksum] udpencap: esp 192.168.56.16 > 192.168.56.11 spi 0xdfb653d8 seq 4 len 136 (ttl 64, id 8729, len 164) 11:19:38.371977 192.168.56.11.4500 > 192.168.56.16.4500: udpencap: esp 192.168.56.11 > 192.168.56.16 spi 0xc4694ca1 seq 5 len 136 (ttl 64, id 17022, len 164) 11:19:38.372571 192.168.56.16.4500 > 192.168.56.11.4500: [no udp cksum] udpencap: esp 192.168.56.16 > 192.168.56.11 spi 0xdfb653d8 seq 5 len 136 (ttl 64, id 8940, len 164) 11:19:39.360772 192.168.56.11.4500 > 192.168.56.16.4500: udpencap: esp 192.168.56.11 > 192.168.56.16 spi 0xc4694ca1 seq 6 len 136 (ttl 64, id 20110, len 164) 11:19:39.361398 192.168.56.16.4500 > 192.168.56.11.4500: [no udp cksum] udpencap: esp 192.168.56.16 > 192.168.56.11 spi 0xdfb653d8 seq 6 len 136 (ttl 64, id 8959, len 164) openbsdvm1# tcpdump -vpni tun1 tcpdump: listening on tun1, link-type LOOP 11:18:23.270727 100.64.0.1 > 192.0.2.1: icmp: echo request (id:d966 seq:0) [icmp cksum ok] (ttl 255, id 53428, len 84) 11:18:24.279648 100.64.0.1 > 192.0.2.1: icmp: echo request (id:d966 seq:1) [icmp cksum ok] (ttl 255, id 4228, len 84) 11:18:25.270434 100.64.0.1 > 192.0.2.1: icmp: echo request (id:d966 seq:2) [icmp cksum ok] (ttl 255, id 46403, len 84) openbsdvm1# /usr/local/libexec/ipsec/stroke loglevel any 4 openbsdvm1# tail -f /var/log/daemon | grep charon Feb 23 11:25:57 openbsdvm1 charon: 05[ESP] ESP packet: Feb 23 11:25:57 openbsdvm1 charon: 05[ESP] SPI c4694ca1 [seq 384] Feb 23 11:25:57 openbsdvm1 charon: 05[ESP] IV => 16 bytes @ 0x00000811d9ce4208 Feb 23 11:25:57 openbsdvm1 charon: 05[ESP] 0: D4 02 D1 2F CF BB A8 88 99 DD 4C 24 BE 64 6A 64 .../......L$.djd Feb 23 11:25:57 openbsdvm1 charon: 05[ESP] encrypted => 96 bytes @ 0x00000811d9ce4218 Feb 23 11:25:57 openbsdvm1 charon: 05[ESP] 0: 05 78 18 91 2A E1 12 88 33 B3 2B 6C 94 E8 90 01 .x..*...3.+l.... Feb 23 11:25:57 openbsdvm1 charon: 05[ESP] 16: EC 9B 0E 44 94 48 C2 D4 95 8C 0B 8D 0B 61 CA 4B ...D.H.......a.K Feb 23 11:25:57 openbsdvm1 charon: 05[ESP] 32: BE 0E 16 09 6C EB C5 CC B9 01 E3 45 85 C1 D0 13 ....l......E.... Feb 23 11:25:57 openbsdvm1 charon: 05[ESP] 48: 61 4C 5E AA F6 65 42 1B 0E 67 21 ED DB 96 03 87 aL^..eB..g!..... Feb 23 11:25:57 openbsdvm1 charon: 05[ESP] 64: 39 29 1A 0A 52 8E D8 EB 75 F8 D6 1C 83 00 29 0F 9)..R...u.....). Feb 23 11:25:57 openbsdvm1 charon: 05[ESP] 80: 93 06 49 05 34 F1 DF 08 2A 05 CB 39 48 70 3E D9 ..I.4...*..9Hp>. Feb 23 11:25:57 openbsdvm1 charon: 05[ESP] ICV => 16 bytes @ 0x00000811d9ce4278 Feb 23 11:25:57 openbsdvm1 charon: 05[ESP] 0: 75 77 36 C9 3F 2D 35 6F 57 50 A2 58 1F FC 53 5A uw6.?-5oWP.X..SZ Feb 23 11:25:57 openbsdvm1 charon: 02[NET] sending packet: from 192.168.56.11[4500] to 192.168.56.16[4500] Feb 23 11:25:58 openbsdvm1 charon: 05[ESP] ESP before encryption: Feb 23 11:25:58 openbsdvm1 charon: 05[ESP] payload = => 84 bytes @ 0x00000810fd997380 Feb 23 11:25:58 openbsdvm1 charon: 05[ESP] 0: 45 00 00 54 CF B9 00 00 FF 01 C5 AC 64 40 00 01 E..T........d@.. Feb 23 11:25:58 openbsdvm1 charon: 05[ESP] 16: C0 00 02 01 08 00 F1 6D 0A B2 01 7D 2A 4B 07 39 .......m...}*K.9 Feb 23 11:25:58 openbsdvm1 charon: 05[ESP] 32: E3 76 80 73 54 C7 CF D2 E5 F2 19 3A B3 28 07 F2 .v.sT......:.(.. Feb 23 11:25:58 openbsdvm1 charon: 05[ESP] 48: C0 DA 52 B5 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 ..R......... !"# Feb 23 11:25:58 openbsdvm1 charon: 05[ESP] 64: 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 $%&'()*+,-./0123 Feb 23 11:25:58 openbsdvm1 charon: 05[ESP] 80: 34 35 36 37 4567 Feb 23 11:25:58 openbsdvm1 charon: 05[ESP] padding = => 10 bytes @ 0x000008113230b16c Feb 23 11:25:58 openbsdvm1 charon: 05[ESP] 0: 01 02 03 04 05 06 07 08 09 0A .......... Feb 23 11:25:58 openbsdvm1 charon: 05[ESP] padding length = 10, next header = 4 I'm here now.... Thx csszep 2018-02-22 12:50 GMT+01:00 Stuart Henderson <s...@spacehopper.org>: > On 2018/02/22 09:51, Joel Carnat wrote: > > Hi, > > > > Le 22/02/2018 09:35, Stuart Henderson a écrit : > > > On 2018-02-22, Igor V. Gubenko <i...@gubenko.com> wrote: > > > > I am far from an expert; having issues myself at the moment, but > maybe > > > > if we get all of the iked experimenters together, we can figure it > out > > > > :) > > > > > > This definitely isn't going to work, iked only supports > > > username/password > > > authentication as a responder. not initiator. > > > > Is there any software that enables openbsd to be an ipsec initiator using > > user/pass ? > > Not for IKEv2. OpenBSD iked as client supports psk but not EAP for > user/password. afaik no other implementations have been ported. > > By far the simplest way which doesn't rely on psk, if the other side > supports it, is to use iked with public keys (without using x509 pki) > - just copy local.pub from one side to the appropriate subdirectory of > pubkeys/ on the other. > > It *may* be possible for IKEv1 with xauth using vpnc, but it's old > all-userland software, not using the standard OpenBSD IPsec stack, the > port (and probably upstream software) are not really maintained. > No modern crypto. > >