Strongswan / Ipsec mehrere Roadwarrior-Verbindungen verschiedene Subnetze

Strongswan / Ipsec mehrere Roadwarrior-Verbindungen verschiedene Subnetze

Ich versuche, einen StrongSwan VPN-Server einzurichten, der mehrere (Windows 10 – interner VPN-Client) Roadwarrior-Verbindungen, aber unterschiedliche Subnetze, abhängig vom Client-Zertifikat, hosten soll.

root@VPN:/# ipsec version

Linux strongSwan U5.8.2/K5.4.0-26-generic

vpn-dev.mycom.comMein Setup hat 2 Paare aus öffentlichen und privaten Schlüsseln, die beispielsweise unterschiedliche CNs verwenden vpn-liv.mycom.com. Die verwendeten ipsec.confsehen ungefähr so ​​aus:

conn vpn-dev
    auto=add
    compress=no
    type=tunnel
    keyexchange=ikev2
    fragmentation=yes
    forceencaps=yes
    dpdaction=clear
    dpddelay=300s
    rekey=no
    ikelifetime=25200s
    leftid=vpn-dev.mycom.com
    leftcert=server-cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=10.100.0.0/16-10.100.254.254/16
    rightdns=8.8.8.8,8.8.4.4
    rightsendcert=never
    rightcert=ca-cert.pem
    eap_identity=%identity
    ike=aes128-sha1-modp1024


conn vpn-liv
    also=vpn-dev
    leftid=vpn-liv.mycom.com
    leftcert=liv-server-cert.pem
    rightsourceip=10.200.0.0/16-10.200.254.254/16
    rightcert=liv-ca-cert.pem

beide Zertifikatsschlüssel werden auch imipsec.secrets

vpn-dev.mycom.com : RSA "server-key.pem"
vpn-liv.mycom.com : RSA "liv-server-key.pem"

someuser : EAP "somepassword"

Sobald ich jedoch versuche, eine Verbindung zur Strongswan-Instanz herzustellen, vpn-devwird die Verbindung verwendet und Strongswan wechselt nicht zur Verbindungvpn-liv

hier sind die Protokolle während eines Versuchs:

Mar 30 08:47:48 VPN charon: 16[NET] received packet: from X.X.X.X[64558] to X.X.X.X[500] (1084 bytes)
Mar 30 08:47:48 VPN charon: 16[IKE] received MS NT5 ISAKMPOAKLEY v9 vendor ID
Mar 30 08:47:48 VPN charon: 16[IKE] received MS-Negotiation Discovery Capable vendor ID
Mar 30 08:47:48 VPN charon: 16[IKE] X.X.X.X is initiating an IKE_SA
Mar 30 08:47:48 VPN charon: 16[CFG] selected proposal: IKE:AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
Mar 30 08:47:48 VPN charon: 16[IKE] local host is behind NAT, sending keep alives
Mar 30 08:47:48 VPN charon: 16[IKE] remote host is behind NAT
Mar 30 08:47:48 VPN charon: 16[NET] sending packet: from X.X.X.X[500] to X.X.X.X[64558] (328 bytes)
Mar 30 08:47:48 VPN charon: 06[NET] received packet: from X.X.X.X[64596] to X.X.X.X[4500] (576 bytes)
Mar 30 08:47:48 VPN charon: 10[NET] received packet: from X.X.X.X[64596] to X.X.X.X[4500] (576 bytes)
Mar 30 08:47:48 VPN charon: 05[NET] received packet: from X.X.X.X[64596] to X.X.X.X[4500] (576 bytes)
Mar 30 08:47:48 VPN charon: 14[NET] received packet: from X.X.X.X[64596] to X.X.X.X[4500] (368 bytes)
Mar 30 08:47:48 VPN charon: 14[IKE] received cert request for "CN=PRIV VPN LIV CA"
Mar 30 08:47:48 VPN charon: 14[IKE] received 69 cert requests for an unknown ca
Mar 30 08:47:48 VPN charon: 14[CFG] looking for peer configs matching X.X.X.X[%any]...X.X.X.X[192.168.0.117]

Mar 30 08:47:48 VPN charon: 14[CFG] selected peer config 'vpn-dev' # << here it has not selected vpn-live, even if the earlier provided private key is only matching vpn-live

Mar 30 08:47:48 VPN charon: 14[IKE] initiating EAP_IDENTITY method (id 0x00)
Mar 30 08:47:48 VPN charon: 14[IKE] peer supports MOBIKE
Mar 30 08:47:48 VPN charon: 14[IKE] authentication of 'vpn-dev.mycom.com' (myself) with RSA     signature successful
Mar 30 08:47:48 VPN charon: 14[IKE] sending end entity cert "CN=vpn-dev.mycom.com"
Mar 30 08:47:49 VPN charon: 14[IKE] sending cert request for "CN=PRIV VPN DEV CA"
Mar 30 08:47:49 VPN charon: 14[IKE] sending cert request for "CN=PRIV VPN LIV CA"
Mar 30 08:47:49 VPN charon: 14[NET] sending packet: from X.X.X.X[500] to X.X.X.X[64548] (364 bytes)
Mar 30 08:47:49 VPN charon: 06[NET] received packet: from X.X.X.X[64618] to X.X.X.X[4500] (92 bytes)
Mar 30 08:47:49 VPN charon: 06[IKE] received (28) error notify

Das Ziel besteht grundsätzlich darin, zwei VPN-Endpunkte auf einer Maschine zu hosten, aber je nach Anmeldung/verwendetem Zertifikat unterschiedliche IP-Bereiche bereitzustellen.

Die lokale Konfiguration erfolgt mit (PowerShell)

Import-Certificate -FilePath liv-ca-cert.pem -CertStoreLocation 'Cert:\LocalMachine\Root'
Add-VpnConnection -Name 'LIV VPN' -ServerAddress 'vpn-live.mycom.com' -AuthenticationMethod Eap -IdleDisconnectSeconds 43200

Übersehe ich etwas? Ist mein Setup falsch konfiguriert? Oder ist das mit Strongswan und dem internen VPN-Client von Windows 10 einfach nicht möglich?

Antwort1

Es ist nur möglich, Verbindungen basierend auf der Serveridentität/dem Serverzertifikat zu wechseln, wenn entweder

  • Die Clients senden in ihrer IKE_AUTH-Anforderung eine Remote-Identität (IDr), was viele Clients nicht tun (insbesondere Windows). Andernfalls gibt es keine passende Identität, sodass die erste Verbindung verwendet wird.

oder

  • wenn die FQDNs unterschiedlichen IP-Adressen zugeordnet sind, die als lokale Adressen für die Verbindungen konfiguriert werden können, sodass frühzeitig die richtige Verbindung ausgewählt wird

Antwort2

Es stellte sich heraus, dass dies mithilfe des Zertifikats nicht möglich ist, da es nicht zur Identifizierung von Benutzern auf dem Server verwendet wird.

Ich habe also einen Workaround verwendet, der beschrieben wird indiese Antwortwas bei der Auswertung hilft eap_identiy.

Jetzt verwenden meine Clients dasselbe Zertifikat, aber basierend auf den Anmeldungen kann ich entscheiden, welches Subnetz sie verwenden werden.

Meine ipsec.conf sieht jetzt ungefähr so ​​aus:

conn eap-shared
   type=tunnel
   ike=aes128-sha1-modp1024
   rightauth=eap-mschapv2
   leftcert=server-cert.pem

conn eap-init
   also=eap-shared
   # this config is used to do the EAP-Identity exchange and the
   # authentication of client and server
   eap_identity=%identity
   # the following is used to force a connection switch after
   # the authentication completed
   rightgroups=thisseemsirrelevant
   auto=add

conn eap-liv
   also=eap-shared
   eap_identity=*@liv-some-domain.com
   rightsourceip=10.200.0.0/16-10.200.254.254/16
   auto=add

conn eap-dev
   also=eap-shared
   eap_identity=*@dev-some-domain.com
   rightsourceip=10.100.0.0/16-10.100.254.254/16
   auto=add

ist vielleicht nicht die eleganteste Lösung, funktioniert aber in meinem Fall.

Antwort3

Bei mehreren Verbindungskonfigurationen mit derselben Authentifizierungsmethode kann Strongswan basierend auf der Identität des Clients die richtige auswählen.

Verwenden Sie beispielsweise zwei Verbindungskonfigurationen:

  1. rightcaBeide rechten Seiten verwenden den öffentlichen Schlüssel, den wir als Einschränkung verwenden können :
    conn dev-network_ikev2-cert
        rightauth=pubkey
        rightca="C=CN, O=Sample, CN=Develop CA"
        rightsourceip=10.100.0.0/16
        rightdns=8.8.8.8
    
    conn test-network_ikev2-cert
        rightauth=pubkey
        rightca="C=CN, O=Sample, CN=Testing CA"
        rightsourceip=10.200.0.0/16
        rightdns=8.8.8.8
  • Develop CAIn diesem Setup wählt der Client mit ausgestellten Zertifikaten die Konfiguration dev-network_ikev2-certdirekt aus.

  • Wenn der Client von ausgestellte Zertifikate verwendet Testing CA, wählt Strongswan zuerst die Konfiguration dev-network_ikev2-cert, dann die Ausgabe constraint check failed: peer not authenticated by CA 'C=CN, O=Sample, CN=Develop CA'und das nächste aus test-network_ikev2-cert.

  1. Beide rechten Seiten verwenden eap-mschapv2, wir können eap_identityals Einschränkung verwenden:
    conn dev-network_ikev2-eap
        rightauth=eap-mschapv2
        eap_identity=*@dev.com
        rightsourceip=10.100.0.0/16
        rightdns=8.8.8.8
    
    conn test-network_ikev2-eap
        rightauth=eap-mschapv2
        eap_identity=*@test.com
        rightsourceip=10.200.0.0/16
        rightdns=8.8.8.8

Dies ist die von Flo verwendete Methode. Strongswan führt eine ähnliche Prüflogik aus wie bei Verwendung von Pubkey.

  • Wenn der Client die Identität in verwendet *@test.com, wählt Strongswan zuerst aus dev-network_ikev2-eap, sucht dann dieses constraint check failed: EAP identity '*@dev.com' requiredund wählt das nächste aus test-network_ikev2-eap.

Hoffe, das hilft.

verwandte Informationen