
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.com
Mein Setup hat 2 Paare aus öffentlichen und privaten Schlüsseln, die beispielsweise unterschiedliche CNs verwenden vpn-liv.mycom.com
. Die verwendeten ipsec.conf
sehen 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-dev
wird 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:
rightca
Beide 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 CA
In diesem Setup wählt der Client mit ausgestellten Zertifikaten die Konfigurationdev-network_ikev2-cert
direkt aus.Wenn der Client von ausgestellte Zertifikate verwendet
Testing CA
, wählt Strongswan zuerst die Konfigurationdev-network_ikev2-cert
, dann die Ausgabeconstraint check failed: peer not authenticated by CA 'C=CN, O=Sample, CN=Develop CA'
und das nächste austest-network_ikev2-cert
.
- Beide rechten Seiten verwenden eap-mschapv2, wir können
eap_identity
als 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 ausdev-network_ikev2-eap
, sucht dann diesesconstraint check failed: EAP identity '*@dev.com' required
und wählt das nächste austest-network_ikev2-eap
.
Hoffe, das hilft.