Strongswan / Ipsec 多個roadwarrior連接不同子網

Strongswan / Ipsec 多個roadwarrior連接不同子網

我正在嘗試設定一個 StrongSwan VPN 伺服器,它應該託管多個(Windows 10 - 內部 VPN 用戶端)roadwarrior 連接,但不同的子網,具體取決於客戶端憑證。

root@VPN:/# ipsec version

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

我的設定有 2 對公鑰和私鑰,使用不同的 CN,比如說vpn-dev.mycom.comvpn-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 不會切換到 connvpn-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

只有在以下情況下才可以根據伺服器身分/憑證切換連接

  • 客戶端在 IKE_AUTH 請求中發送遠端身份 (IDr),許多客戶端不會發送遠端身份 (IDr)(特別是 Windows),否則,沒有可匹配的身份,因此將使用第一個連接

或者

  • 如果 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

對於具有相同身份驗證方法的多個 conn 配置,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

  • 如果客戶端使用strongswan頒發的證書Testing CA,strongswan會先選擇config 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 類似的檢查邏輯。

  • 如果客戶端使用身份*@test.com,strongswan將首先選擇dev-network_ikev2-eap,然後找到該constraint check failed: EAP identity '*@dev.com' required,並選擇下一個test-network_ikev2-eap

希望這會有所幫助。

相關內容