Strongswan / Ipsec 다중 roadwarrior 연결 다양한 서브넷

Strongswan / Ipsec 다중 roadwarrior 연결 다양한 서브넷

여러(Windows 10 - 내부 VPN 클라이언트) roadwarrior 연결을 호스팅해야 하지만 클라이언트 인증서에 따라 다른 서브넷을 호스팅해야 하는 StrongSwan VPN 서버를 설정하려고 합니다.

root@VPN:/# ipsec version

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

내 설정에는 다른 CN을 사용하는 2쌍의 공개 키와 개인 키가 vpn-dev.mycom.com있습니다 vpn-liv.mycom.com. 중고는 ipsec.conf다음과 같습니다.

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

두 인증서 키 모두에도 저장됩니다.ipsec.secrets

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

someuser : EAP "somepassword"

그러나 Strongswan 인스턴스에 연결을 시도하자마자 vpn-dev연결이 사용되고 Strongswan이 conn으로 전환되지 않습니다.vpn-liv

시도 중 로그는 다음과 같습니다.

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

목표는 기본적으로 하나의 시스템에서 2개의 VPN 엔드포인트를 호스팅하지만 로그인/사용된 인증서에 따라 다른 IP 범위를 제공하는 것입니다.

로컬 구성은 (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

내가 뭔가를 놓치고 있는 걸까? 내 설정이 잘못 구성되었나요? 아니면 Strongswan 및 Windows 10 내부 VPN 클라이언트에서는 이것이 불가능합니까?

답변1

다음 중 하나에 해당하는 경우에만 서버 ID/인증서를 기반으로 연결을 전환할 수 있습니다.

  • 클라이언트는 IKE_AUTH 요청에 원격 ID(IDr)를 보내는데, 많은 클라이언트는 이를 보내지 않습니다(특히 Windows). 그렇지 않으면 일치하는 ID가 없으므로 첫 번째 연결이 사용됩니다.

또는

  • FQDN이 다른 IP 주소에 매핑되는 경우 연결에 대한 로컬 주소로 구성되어 올바른 연결이 조기에 선택될 수 있습니다.

답변2

인증서는 서버에서 사용자를 식별하는 데 사용되지 않으므로 인증서를 사용하는 것이 불가능하다는 것이 밝혀졌습니다.

그래서 나는 다음에 설명된 해결 방법을 사용하게 되었습니다.이 답변를 평가하는 데 도움이 됩니다 eap_identiy.

이제 내 클라이언트는 동일한 인증서를 사용하지만 로그인을 기반으로 클라이언트가 사용할 서브넷을 결정할 수 있습니다.

내 ipsec.conf는 이제 다음과 같습니다.

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

가장 우아한 솔루션은 아닐 수도 있지만 제 경우에는 작동합니다.

답변3

동일한 인증 방법을 사용하는 여러 연결 구성의 경우 Strongswan은 클라이언트의 신원을 기반으로 적절한 구성을 선택할 수 있습니다.

예를 들어 두 개의 conn 구성을 사용합니다.

  1. pubkey를 사용하는 양쪽 오른쪽 모두 rightca제약 조건으로 사용할 수 있습니다.
    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구성을 직접 선택합니다 dev-network_ikev2-cert.

  • 클라이언트가 에서 발행한 인증서를 사용하는 경우 Testing CAStrongswan은 먼저 구성을 선택한 dev-network_ikev2-cert후 출력 constraint check failed: peer not authenticated by CA 'C=CN, O=Sample, CN=Develop CA'하고 다음 항목을 선택합니다 test-network_ikev2-cert.

  1. eap-mschapv2를 사용하는 양쪽 오른쪽 모두 eap_identity제약 조건으로 사용할 수 있습니다.
    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

이것이 Flo가 사용하는 방법입니다. Strongswan은 pubkey를 사용하는 것과 유사한 검사 논리를 수행합니다.

  • 클라이언트가 에서 ID를 사용하는 경우 *@test.comStrongswan은 먼저 을 선택한 dev-network_ikev2-eap후 해당 항목을 찾아 constraint check failed: EAP identity '*@dev.com' required다음 항목을 선택합니다 test-network_ikev2-eap.

이것이 도움이 되기를 바랍니다.

관련 정보