LINUX.ORG.RU
ФорумAdmin

CentOS + strongswan + iOS VPN API

 , , , ,


0

2

Здравствуйте. Пытаюсь настроить работу strongswan для подключения из VPN API в iOS девайсах, но подключение стопорится. Ниже представлен лог подключения и конфиг. Сам уже неделю бьюсь, все вроде сделано по мануалам, но ничего не пашет.К серверу подключаюсь из iOS VPN API, он работает в режиме IKE2, сертификат с сервера успешно устанавливается и виден в профиле. Если у кого-то есть опыт успешной настройки strongswan + ios vpn api готов даже оплатить консультацию.

2015-09-16T14:20:13.881974+00:00  charon: 02[NET] received packet: from 178.159.28.49[4500] to 94.242.232.178[4500]
2015-09-16T14:20:13.881977+00:00  charon: 02[NET] waiting for data on sockets
2015-09-16T14:20:13.881980+00:00  charon: 06[NET] received packet: from 178.159.28.49[4500] to 94.242.232.178[4500] (316 bytes)
2015-09-16T14:20:13.882095+00:00  charon: 06[ENC] parsed IKE_AUTH request 1 [ IDi N(INIT_CONTACT) IDr CPRQ(ADDR DHCP DNS MASK ADDR6 DHCP6 DNS6) N(ESP_TFC_PAD_N) N(NON_FIRST_FRAG) SA TSi TSr ]
2015-09-16T14:20:13.882106+00:00  charon: 06[CFG] looking for peer configs matching 94.242.232.178[lu135.example.net]...178.159.28.49[VPN]
2015-09-16T14:20:13.882111+00:00  charon: 06[CFG] peer config match local: 20 (ID_FQDN -> 6c:75:31:33:35:2e:68:6d:6e:2e:6d:65)
2015-09-16T14:20:13.882115+00:00  charon: 06[CFG] peer config match remote: 1 (ID_FQDN -> 56:50:4e)
2015-09-16T14:20:13.882121+00:00  charon: 06[CFG] ike config match: 1052 (94.242.232.178 178.159.28.49 IKEv2)
2015-09-16T14:20:13.882127+00:00  charon: 06[CFG]   candidate "ikev2", match: 20/1/1052 (me/other/ike)
2015-09-16T14:20:13.882134+00:00  charon: 06[CFG] selected peer config 'ikev2'
2015-09-16T14:20:13.882153+00:00  charon: 06[IKE] initiating EAP_IDENTITY method (id 0x00)
2015-09-16T14:20:13.882166+00:00  charon: 06[IKE] processing INTERNAL_IP4_ADDRESS attribute
2015-09-16T14:20:13.882171+00:00  charon: 06[IKE] processing INTERNAL_IP4_DHCP attribute
2015-09-16T14:20:13.882180+00:00  charon: 06[IKE] processing INTERNAL_IP4_DNS attribute
2015-09-16T14:20:13.882183+00:00  charon: 06[IKE] processing INTERNAL_IP4_NETMASK attribute
2015-09-16T14:20:13.882187+00:00  charon: 06[IKE] processing INTERNAL_IP6_ADDRESS attribute
2015-09-16T14:20:13.882196+00:00  charon: 06[IKE] processing INTERNAL_IP6_DHCP attribute
2015-09-16T14:20:13.882202+00:00  charon: 06[IKE] processing INTERNAL_IP6_DNS attribute
2015-09-16T14:20:13.882214+00:00  charon: 06[IKE] received ESP_TFC_PADDING_NOT_SUPPORTED, not using ESPv3 TFC padding
2015-09-16T14:20:13.882266+00:00  charon: 06[IKE] IDx' => 16 bytes @ 0x7fa281236940
2015-09-16T14:20:13.882273+00:00  charon: 06[IKE]    0: 02 00 00 00 6C 75 31 33 35 2E 68 6D 6E 2E 6D 65  ....lu135.example.net
2015-09-16T14:20:13.882277+00:00  charon: 06[IKE] SK_p => 20 bytes @ 0x7fa24c003430
2015-09-16T14:20:13.882282+00:00  charon: 06[IKE]    0: 45 A5 6E C1 FA 17 82 BF 81 13 71 3A 94 EC 46 A1  E.n.......q:..F.
2015-09-16T14:20:13.882288+00:00  charon: 06[IKE]   16: 73 A6 F7 47                                      s..G
2015-09-16T14:20:13.882318+00:00  charon: 06[IKE] octets = message + nonce + prf(Sk_px, IDx') => 344 bytes 
…. SOME BYTES HERE ….
2015-09-16T14:20:13.884696+00:00  charon: 06[IKE] authentication of 'lu135.example.net' (myself) with RSA signature successful
2015-09-16T14:20:13.884706+00:00  charon: 06[IKE] sending end entity cert "C=GB, O=COMPANY, CN=lu135.example.net"
2015-09-16T14:20:13.884718+00:00  charon: 06[ENC] generating IKE_AUTH response 1 [ IDr CERT AUTH EAP/REQ/ID ]
2015-09-16T14:20:13.884897+00:00  charon: 06[NET] sending packet: from 94.242.232.178[4500] to 178.159.28.49[4500] (1220 bytes)
2015-09-16T14:20:13.884924+00:00  charon: 03[NET] sending packet: from 94.242.232.178[4500] to 178.159.28.49[4500]
2015-09-16T14:20:43.786966+00:00  charon: 09[JOB] deleting half open IKE_SA after timeout
2015-09-16T14:20:43.786983+00:00 charon: 09[IKE] IKE_SA ikev2[2] state change: CONNECTING => DESTROYING
============= Server cert =================
Certificate:
   Data:
       Version: 3 (0x2)
       Serial Number: 6619988021187675067 (0x5bdeec07f43b83bb)
   Signature Algorithm: sha256WithRSAEncryption
       Issuer: C=GB, O=COMPANY, CN=CERTROOT
       Validity
           Not Before: Sep 16 13:57:53 2015 GMT
           Not After : Sep 15 13:57:53 2018 GMT
       Subject: C=GB, O=COMPANY, CN=lu135.example.net
       Subject Public Key Info:
           Public Key Algorithm: rsaEncryption
               Public-Key: (2048 bit)
               Modulus:
                     … BYTES …

   Exponent: 65537 (0x10001)
       X509v3 extensions:
           X509v3 Authority Key Identifier:
               keyid:8B:88:DA:1A:76:18:F4:F8:64:51:9C:BB:54:48:C6:3C:2E:5B:E9:8C

           X509v3 Subject Alternative Name:
               DNS:lu135.example.net, IP Address:94.242.232.178, DNS:94.242.232.178
           X509v3 Extended Key Usage:
               TLS Web Server Authentication, 1.3.6.1.5.5.8.2.2
   Signature Algorithm: sha256WithRSAEncryption
                    … BYTES ….

=============== Server cert end ==============
============= CONFIG  ipsec.conf ===========
  config setup
          charondebug="cfg 7, dmn 7, ike 7, net 7"
          uniqueids=no

  conn %default
          left=%defaultroute
          leftsubnet=0.0.0.0/0
          right=%any
          auto=add
         dpdaction=clear
         dpddelay=300s

  conn ikev2
          keyexchange=ikev2
          fragmentation = yes
          forceencaps = yes
          ike=aes256-sha1-modp1024,aes256-sha1-modp2048
         esp=aes256-sha1,aes128-sha1
         left={{ ansible_default_ipv4.address }}
         leftid={{ dnsname }}
         leftcert=server_cert.pem
         leftsendcert=always
         leftauth=pubkey
         mobike=yes
         right=%any
         rightid=%any
         rightsendcert=never
         rightauth=eap-radius
         rightsourceip=172.16.198.0/24
         rightfirewall=yes
         eap_identity=%identity
         rightdns=8.8.8.8,8.8.4.4
         dpaction=clear
         auto=add
============= CONFIG END ================
============= Ansible variables ==============
cakey:   /etc/strongswan/ipsec.d/private/ios.pem
cacert:  /etc/strongswan/ipsec.d/cacerts/ios.pem
srvkey:  /etc/strongswan/ipsec.d/private/server.pem
srvcert: /etc/strongswan/ipsec.d/certs/server_cert.pem
clnkey:  /etc/strongswan/ipsec.d/private/client.pem
clncert: /etc/strongswan/ipsec.d/certs/client.pem
p12:     /etc/strongswan/ipsec.d/private/client.p12
issuer: CERTROOT
org: COMPANY
============ Ansible Variables End ===========
============ Playbook role =================
---
- name: Installing strongswan config
 template: src=ipsec.conf dest=/etc/strongswan/ipsec.conf

- name: Ipsec secrets
 template: src=ipsec.secrets dest=/etc/strongswan/ipsec.secrets

- name: Generating CA KEY
 shell: strongswan pki --gen --outform pem > {{ cakey }} creates={{ cakey }}

- name: Generate CA Cert
 shell: strongswan pki --self --in {{ cakey }} --dn "C=GB, O={{ org }}, CN={{ issuer }}" --ca --outform pem > {{ cacert }} creates={{ cacert }}

- name: Generate server key
 shell: strongswan pki --gen --outform pem > {{ srvkey }} creates={{ srvkey }}

- name: Create server cert
 shell: strongswan pki --pub --in {{ srvkey }} | strongswan pki --issue --cacert {{ cacert }} --cakey {{ cakey }} --dn "C=GB, O={{ org }}, CN={{ dnsname }}" --san="{{ dnsname }}" --san {{ ansible_default_ipv4.address }} --san @{{ ansible_default_ipv4.address }} --flag serverAuth --flag ikeIntermediate --outform pem > {{ srvcert }} creates={{ srvcert }}

- name: Generating client key
 shell: strongswan pki --gen --outform pem > {{ clnkey }} creates={{ clnkey }}

- name: Create client cert
 shell: strongswan pki --pub --in {{ clnkey }} | strongswan pki --issue --cacert {{ cacert }} --cakey {{ cakey }} --dn "C=GB, O={{ org }}, CN=demo" --outform pem > {{ clncert }} creates={{ clncert }}

- name: Generate p12 file for client
 shell: openssl pkcs12 -export -inkey {{ clnkey }} -in {{ clncert }} -name "demo" -certfile {{ cacert }}  -caname "{{ issuer }}" -out {{ p12 }} -password pass:hello creates={{ p12 }}

- name: Restarart strongswan
 service: name=strongswan state=restarted
============== Playbook role end ==============

А другие устройства с этим же сервером и такими же настройками работают нормально?

thesis ★★★★★
()

И оттуда же кометарий

Как и хабраюзер vsb, я ушёл со StrongSWAN на OpenVPN (вот сегодня как раз закончил миграцию). StrongSWAN у меня прожил добрых два года и вот месяц назад я принял волевое решение поиска альтернативы.

Какие уроки я выучил:

  • StrongSWAN очень гибок — просто масса вариантов выстрелить себе в ногу.
  • Клиенты для StrongSWAN есть большие и разные и у каждого свои тараканы
  • iOS поддерживает только IKEv1
    Кометнарий автора: iOS 8 поддерживает IKEv2, но только через провизинг, через интерфейс нельзя настроить.
  • Android и iOS не поддерживают ECDSA и прочие радости жизни (только RSA), поэтому уже было настроив всё я был вынужден пересоздавать PKI ибо у меня даже CA был на ECDSA
  • iOS поддерживает только SHA1 в качестве хеш-функции (и снова я пересоздавал PKI...) для iOS пришлось всё равно пересобрать сервер StrongSWAN с патчем xauth-noauth (как описано в статье) и снова iOS — несмотря на то, что я собрал CA сертификат, сертификат пользователя и ключ пользователя в .p12 — сертификат СА пришлось импортировать отдельно...
  • Дальше я нашёл себе другую проблему — чтобы была возможность подключиться нескольким клиентам за одним NAT нужно сделать локальную ноду, к которой будут подключаться клиенты локальной сети, или станцевать вокруг роутера, а именно, отключить VPN passthrough (этот способ я не испытал на себе). По большому счёту — это не вина StrongSWAN или протокола, просто у него другие задачи.
  • И последнее — 500 UDP, 4500 UDP — эти два порта нельзя (можно, но с перекомпиляцией) сконфигурировать и как-то у меня так по жизни сожилось, что я попадал в сети, где по каким-либо причинам, но хотябы один порт, да был закрыт. И тут я тоже не обошёл грабли — сначала я пересобрал StrongSWAN с другими портами, а потом понял, что для Android прийдётся клиента тоже пересобирать… (а для iOS и вообще ничего позитивного не обещили в этом плане).
Disova
()
Ответ на: комментарий от thesis

сервер будет только для клиентов на iOS, на других устройствах подключение не проверялось так как смысла нет.

aalexhm
() автор топика
Ответ на: комментарий от aalexhm

я не использую интерфейс, настройка идет через VPN API в swift приложении

Пардон, проглядел. В любом случае у автора статьи на хабре в профиле есть скайп.

Disova
()
Ответ на: комментарий от aalexhm

Смысл - в дебаге.

sending packet: from 94.242.232.178[4500] to 178.159.28.49[4500] (1220 bytes)

Возможно, этот пакет не доходит до клиента. Например, фрагментируется и режется промежуточным роутером. Самый тупой способ проверки: пересоздать ключ длиной 1024 и серфтикаты с минимумом полей, т.е. уменьшить пакет.

thesis ★★★★★
()
Ответ на: комментарий от thesis

сейчас я конечно попробую, но тут еще вопрос в том что iOS показывает что процесс подключения завершился еще до того как пройдет таймаут на откром соединении. есть подозрения что ему не нравится сертификат или еще что, но определить это из-за отсутствия отладки не представляется возможным.

aalexhm
() автор топика
Ответ на: комментарий от aalexhm

А. Ну тогда еще, конечно, стоит перепроверить список требуемых иосом EKU и прочих атрибутов сервера.

thesis ★★★★★
()
Ответ на: комментарий от Disova

Да автор и тут есть.

aalexhm, если проблема в ключах, то используйте https://github.com/ValdikSS/easy-rsa-ipsec/tree/ipsec-without-nonRepudiation

Но, похоже, что-то IKEv2 сломан в iOS 9. У меня нет устройство на iOS, но мои друзья настроить не могут, только IKEv1 пока работает. Напишите мне куда-нибудь, попробуем разобраться.

ValdikSS ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.