![Strongswan / Ipsec 多个 roadwarrior 连接不同的子网](https://linux22.com/image/776094/Strongswan%20%2F%20Ipsec%20%E5%A4%9A%E4%B8%AA%20roadwarrior%20%E8%BF%9E%E6%8E%A5%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AD%90%E7%BD%91.png)
我正在尝试设置一个 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.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 不会切换到 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),许多客户端不会这样做(特别是 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
对于具有相同身份验证方法的多个连接配置,Strongswan 能够根据客户端的身份选择适当的配置。
例如使用两个 conn 配置:
- 右边都使用公钥,我们可以用它
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 CA
,strongswan 将首先选择配置dev-network_ikev2-cert
,然后输出constraint check failed: peer not authenticated by CA 'C=CN, O=Sample, CN=Develop CA'
,然后选择下一个test-network_ikev2-cert
。
- 右侧均采用 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将执行与使用公钥类似的检查逻辑。
- 如果客户端使用身份
*@test.com
,strongswan 将首先选择dev-network_ikev2-eap
,然后找到constraint check failed: EAP identity '*@dev.com' required
并选择下一个test-network_ikev2-eap
。
希望这会有所帮助。