strongSwan IKEv2服务器配置

文章目录

strongSwan IKEv2服务器配置

资料来源 https://www.cl.cam.ac.uk/~mas90/resources/strongswan/

经过大量的反复试验,我配置了一个strongSwan VPN服务器,主要用于Windows客户端。本页面解释了我的配置以及导致各种选择的一些原因。希望对某人有用!

我的配置最初基于多个Windows 7客户端的strongSwan示例EAP配置,并进行了一些修改。

我在Ubuntu 14.04上使用strongSwan 5.1.2。在strongSwan 5中,IKE发生了很大变化,我不希望这种配置能够在早期版本上运行。

目标

提供至少具有以下属性的面向终端用户的VPN服务:

  • 至少“中等”安全
  • 支持运行Windows 7及更高版本的客户端,以及尽可能多的其他操作系统
  • 为VPN客户端提供IPv4和IPv6地址
  • 服务器使用由公共CA签署的SSL证书链
  • 从平面文件“数据库”(ipsec.secrets)验证用户和密码
    • 不幸的是,为大多数EAP认证协议存储明文密码是必要的 – 尤其是对于大多数客户端支持的EAP协议子集,这几乎意味着EAP-MSCHAPv2。见下面,以及这个方便的协议和密码兼容表
    • 将来我可能会切换到RADIUS或LDAP身份验证,但这对另一天来说是一个挑战……

简要介绍IKEv2

IKEv2是我选择的VPN协议(或者更严格地说,是为我配置IPsec隧道的密钥交换协议)。它建立了如下连接:

  1. 身份验证阶段1:通过UDP调用SSL连接(端口500)
  2. 身份验证阶段2:通过SSL连接中的各种EAP(可扩展身份验证协议)机制对用户进行身份验证以进行保护
  3. 加密ESP(封装安全有效负载)隧道,使用以下任一项:
    • 纯本地ESP:将加密的IP数据包直接封装在另一个IP数据包中(使用IP协议50,而不是UDP或TCP!
    • NAT Traversal:UDP内部的ESP(端口4500),以避免转发不能轻松通过NAT路由器的IP协议50的问题

IKEv2在几个方面改进了IKEv1; 特别是在客户端进行配置(不管信不信),因为它不需要客户端提供SSL证书。IKEv2相对较新,但获得了对现代操作系统的支持。

要安装的软件包

您可能需要安装以下某些或全部软件包(在此使用Ubuntu软件包名称):

  • strongswan-ike – strongSwan IKEv2(和IKEv1)守护程序,charon
  • strongswan-starter – 配置和包装charon的实用程序(因为直接与charon交互是不愉快的)
  • strongswan-plugin-eap-mschapv2 – EAP-MSCHAPv2身份验证插件(我们的“选择”身份验证协议)
  • (strongswan-plugin-openssl – 一个SSL实现将被strongswan-ike引入,但有几个选择;我只测试了OpenSSL)

如果您使用Debian,您可能需要:

  • strongswan,卡戎
  • libstrongswan-标准插件
  • libcharon-额外的插件

但请注意,在Debian上,libcharon-extra-plugins包含并将自动启用许多您不需要的插件。考虑禁用/etc/strongswan.d/charon/*.conf中的不需要的插件。

主要的配置文件是:/etc/ipsec.conf

主要的配置文件是/etc/ipsec.conf,我将在这里给出完整的内容,然后逐行介绍。不幸的是,ipsec.conf的语法限制了空白和注释的位置。

还有一些辅助配置文件和脚本,我稍后会提供。

原始配置

config setup
charondebug=”cfg 2″  # log proposals
uniqueids=no  # allow multiple connections from a given user
conn myvpn
keyexchange=ikev2
auto=add
left=%any
leftsubnet=::/0,0.0.0.0/0
leftauth=pubkey
leftcert=/etc/ssl/private/vpn-server.crt
leftsendcert=always
right=%any
rightsourceip=192.0.2.0/25,2001:db8::/96
rightauth=eap-mschapv2
rightsendcert=never
rightdns=192.0.2.200,192.0.2.201,2001:db8:8000::53:1,2001:db8:8000::53:2
eap_identity=%any
leftupdown=/etc/strongswan.d/proxyndp.updown
dpdaction=clear
dpddelay=2400s
rekey=no
fragmentation=yes
ike=aes256-aes192-aes128-sha384-sha256-sha1-modp3072-modp2048-modp1536-modp1024!
esp=aes256-aes192-aes128-sha384-sha256-sha1!

逐行解释

config setup

启动全局配置部分。大多数VPN配置都附加到下面的特定连接块,但全局设置了一些事情。

     charondebug=”cfg 2″

为了便于调试断开的连接设置,我记录了客户端提出的一组加密和身份验证算法,以及客户端和服务器最终达成的协议。

     uniqueids=no

允许来自给定用户的多个连接(默认情况下,如果他们启动后续连接,则会断开用户的早期连接 – 一般而言,strongSwan的默认值针对固定点对点链接进行了优化,而不是客户端到服务器。

conn myvpn
keyexchange=ikev2
auto=add

开始使用IKEv2定义特定的VPN连接类型。在strongSwan启动时,加载此连接,然后等待客户端连接到它(auto = add)。

     left=%any

strongSwan基于“左侧”和“右侧”来定义VPN隧道(其中一个可能是本地网络,其中一个可能是远程的,但是它是按照左侧和右侧定义的,以便可以使用相同的配置点对点链接的两端;该功能对于客户端 – 服务器关系不太有用)。

在这种情况下,“左侧”是服务器端,“左侧”网络是整个互联网。

left=%any表示我们应该监听所有网络接口上的连接。

     leftsubnet=::/0,0.0.0.0/0

定义将在“右侧”提供给客户端的默认IPv4和IPv6路由。

不幸的是,Windows(至少7和10)忽略了提供的路线。它使用本地配置而不是来自服务器的报价来配置默认路由。即使配置为这样下面的解决方法),它也通常无法设置默认的IPv6路由。

     leftauth=pubkey
leftcert=/etc/ssl/private/vpn-server.crt

我们使用存储在证书中的公钥来验证自己。

该文件/etc/ssl/private/vpn-server.crt必须包含我们的公钥,而不是完整的证书链。

您应该在/etc/ipsec.d/cacerts中放入中间证书; strongSwan似乎自动从该目录中填入中间证书,前提是您不要更改leftid设置 – SSL证书链的生成依赖于leftid作为证书的DN,如果您不指定其他内容,则这是默认设置。 您可能会在大多数示例配置中找到指定的leftid ; 这会导致此设置上的错误行为!

您可能会注意到我们没有在该文件中配置私钥。strongSwan的一个怪癖是你必须ipsec.secrets中配置私钥

注意:一些流行的客户端不支持通配符证书。

     leftsendcert=always

即使客户没有明确要求,我们也会将我们的证书发送给客户。客户端应该询问它,但我观察到客户端未能向服务器请求证书并且因服务器未提供证书而感到不安的情况。

right=%any

定义连接的另一端(远端)。允许客户端从任何IP地址进行连接。

     rightsourceip=192.0.2.0/25,2001:db8::/96

分配来自IPv4和IPv6池的每个客户端动态地址。每个子网中的第一个和最后一个地址都不会被使用(即这里的客户端将分配以192.0.2.1和2001开头的地址2001:db8::1)。

请注意,尽管有名称, 但是 rightsourceip并未定义VPN连接的源IP地址 – 它定义了要 VPN隧道分配的地址。

如果你有strongSwan 5.2.2或更新的版本,你可以使用IP地址范围而不是子网(未经测试)。

     rightauth=eap-mschapv2

要求客户端使用EAP-MSCHAPv2进行身份验证。

有几种可能的EAP(身份验证)协议,许多人可能比EAP-MSCHAPv2更好,但我们的手是捆绑在一起的,如果我们希望支持各种各样的客户端,我们必须使用EAP-MSCHAPv2。特别是,strongSwan本地Mac OS X客户端仅支持EAP-MSCHAPv2和EAP-MD5。微软在Windows中已经弃用了EAP-MD5

不过不用担心,虽然MSCHAPv2本身就是一个高度可疑的身份验证协议,容易受到多种攻击的攻击,包括相当容易的离线攻击,但在IKEv2在SSL隧道内运行时,它在此设置中很安全。

不幸的是,EAP-MSCHAPv2确实需要将密码存储为明文或NTLM哈希(不比明文更好)。小心保护您的ipsec.secrets文件。

rightsendcert=never

不要求客户端发送SSL证书。

     rightdns=192.0.2.200,192.0.2.201,2001:db8:8000::53:1,2001:db8:8000::53:2

为客户提供递归DNS服务器。

eap_identity=%any

允许任何已定义的用户连接(只要它们存在于ipsec.secrets中)。

     leftupdown=/etc/strongswan.d/proxyndp.updown

当连接出现时,运行定义的脚本(见下文),该脚本设置代理ARP和代理NDP,允许IPv4和IPv6流量进出VPN,而无需在上游设置显式路由。

     dpdaction=clear
dpddelay=2400s

启用失效对等检测(DPD),定期检查客户端是否仍在响应,如果不是,则清除IKEv2会话和IPsec隧道。

我故意设置一个很长的DPD延迟(2400秒= 40分钟),以便MOBIKE(IKEv2移动性和多宿主)有机会工作。MOBIKE允许客户在维持其VPN连接的同时更改他们的(外部)IP地址 – 这对移动客户来说是非常方便的功能。

rekey=no

由于客户端错误,请勿在连接建立之后重新键入连接(而不是定期重新键入其他安全措施)。正如strongSwan wiki所言:“Windows 7不像VPN网关那样主动。”

     fragmentation=yes

使IKEv2发送更小的数据包(执行自己的应用程序层分段) – 它很容易发送非常大的UDP数据报(例如,在单个数据包中包含SSL证书链)并依靠IP分段来提供这些数据报。IP分段通常不起作用,IPv6根本不存在。

     ike=aes256-aes192-aes128-sha384-sha256-sha1-modp3072-modp2048-modp1536-modp1024!

列出我们可接受的加密和消息完整性算法,用于身份验证和密钥交换过程。

客户端和服务器必须根据来自客户端和服务器的有序列表建议,达成一套相互可接受的算法。最终,所使用的算法是来自客户端的第一个与我们的建议相匹配的建议,即客户端的优先顺序事项和服务器的顺序不一致。

但不幸的是,窗口(7和10至少)列出了它在提案中增加安全性的顺序,从最低的最高优先位置的安全。

确切顺序取决于客户端配置中加密强度的选择,如下所示(Windows 10):

  • “可选加密”意味着Windows将提出(按优先级降序):
    3des-sha1,3des-sha256,3des-sha384,aes128-sha1,aes128-sha256,aes128-sha384,aes192-sha1,aes192-sha256,aes192 -sha384,aes256-sha1,aes256-sha256,aes256-sha384
  • “要求加密”或“最大强度加密”意味着Windows将提出:
    3des-sha1,aes256-sha1,3des-sha256,aes256-sha256,3des-sha384,aes256-sha384

Windows 7提供了这些的更小的子集(值得注意的是,没有aes256)。

换句话说,如果服务器完全允许使用triple-DES,则连接将优先于AES使用它。

我的IKE提案是允许来自旧客户端的连接和强制Windows不选择不良协议(即3DES)之间的妥协。它导致Windows 10客户端使用aes256-sha1,Windows 7客户端使用aes128-sha1(不管在客户端是否指定了“可选”/“需要”/“最大强度”加密)。

据称,某些配置中的Mac OS X可能支持3DES。您可能需要将此添加到ike =行,但这样做也会导致Windows客户端也使用3DES。

所述MODP东西指的Diffie-Hellman(DH)参数的长度。不幸的是,很少有客户端支持比1024位DH更好的支持,这种支持被称为穷人(Logjam攻击)。目前,这可能是该设置中最大的加密漏洞,但在客户修复之前是不可避免的。

某些客户端(例如Android上的strongSwan)将使用最长的提供的DH参数。但是,Android设备似乎使用更长的参数连接速度非常慢。所提供的最大3072位DH是一种妥协方案,可以提供合理的安全性和合理的快速连接。

     esp=aes256-aes192-aes128-sha384-sha256-sha1!

加密和消息完整性算法必须分别为ESP(在认证和密钥交换完成后建立的加密隧道)配置,因为它们在不同的地方实施:strongSwan处理IKE,而Linux内核本身处理ESP加密。

我使用ESP的一组类似于IKE的协议。

对于ESP,与IKE不同,Windows按照安全性的降序提出算法,喜欢使用最安全的算法,如下所示(Windows 10):

  • “可选加密”:aes256-sha1,aes128-sha1,3des-sha1,随后是各种完全不安全的提议(单个DES,NULL密码)
  • “需要加密”或“最大强度加密”:aes256-sha1,3des-sha1

(同样,Windows 7不支持aes256。)

选项我想启用但不能:forceencaps

IP协议50(本地ESP隧道流量)不能通过大多数NAT路由器。通常,IKEv2将尝试检测NAT的存在并将切换到UDP封装的ESP。但是,IP协议50也可能不通过一些非NAT防火墙,这将不会被这种方式检测到。

从表面上看,启用forceencaps=yes似乎是一个好主意,不管NAT检测的结果如何,对所有隧道流量都使用UDP封装。

但是,Linux内核不会(当前)对IPv6 ESP实施UDP封装,因此如果您的VPN服务器发布IPv6地址,则在设置此选项时,IPv6客户端将无法连接。

因此我们不得不依靠NAT检测来适当地启用UDP封装。NAT后面的IPv4客户端将自动使用UDP; 没有NAT的IPv4客户端将使用IP协议50. IPv6客户端只能使用IP协议50(但是,幸运的是,IPv6 NAT不是我们可能遇到的事情)。

(如果您不使用IPv6,请考虑启用此选项。)

辅助配置文件和脚本

strongSwan在/etc/strongswan.d/etc/ipsec.d中安装了大量的配置文件,其中大部分可以保留默认值。

但是,改变一些事情很有用:

/etc/strongswan.d/proxyndp.updown

这是一个自定义脚本,用于设置代理ARP和代理NDP,以便我们从本地网络捕获VPN客户端IP地址的流量并将其路由到VPN。另一种方法是在您的上游路由器上配置一个路由,以指导VPN服务器上的VPN客户端地址池。

#!/bin/bash
IFACE=eth0  # configure me
ADDR=${PLUTO_PEER_CLIENT%/*}
case $PLUTO_VERB in
up-client-v6)
echo “Adding proxy NDP for $ADDR via $IFACE”
ip -6 neigh add proxy $ADDR dev $IFACE
;;
down-client-v6)
echo “Removing proxy NDP for $ADDR via $IFACE”
ip -6 neigh delete proxy $ADDR dev $IFACE
;;
up-client)
echo “Adding proxy ARP for $ADDR via $IFACE”
ip neigh add proxy $ADDR dev $IFACE
;;
down-client)
echo “Removing proxy ARP for $ADDR via $IFACE”
ip neigh delete proxy $ADDR dev $IFACE
;;
esac 2>&1 | logger -t proxyndp.updown

将脚本第二行的“eth0”替换为外部网络接口。

(还记得要chmod + x这个文件。)

/etc/ipsec.secrets

这是认证机密的存储库 – 主要是客户的密码,也是您的SSL证书的秘密(私钥)。

该文件应该看起来像这样:

### SSL private key
: RSA /etc/ssl/private/vpn-server.key

### Clients’ credentials (plaintext)
user1 : EAP “password1”
user2 : EAP “password2”
# …etc.  Note that the presence of whitespace either side of the ‘:’ is significant.

# You could also tell strongSwan to include secrets from elsewhere,
# for example an auto-generated file:
include ipsec.d/secrets/myvpn

/etc/ipsec.d/cacerts

请记住将证书颁发机构要求的任何中间证书放在目录/etc/ipsec.d/cacerts(每个文件一个中间证书)中。

不要包含根证书。

客户端配置

我相信下列客户应该能够连接,并列出一些注意事项:

  • Windows 7或更高版本内置的VPN支持
  • OS X 10.11“El Capitan”或更高版本(未经测试)内置VPN支持
  • OS X 10.7或以上版本的strongSwan应用程序(未经测试)
  • iOS 9或更高版本内置的VPN支持(未经测试)
  • Android上的strongSwan VPN客户端应用程序
  • Ubuntu和其他Linux发行版上的网络管理器
    • 确保你已经安装了network-manager-strongswanstrongswan-plugin-eap-mschapv2
    • 确保在创建连接时勾选请求内部IP地址
    • 目前在network-manager-strongswan中似乎没有IPv6支持
  • strongSwan 5.x套件在各种联合国
    • 除了上面链接的Android和OS X应用程序之外,没有GUI
    • 客户端配置作为读者的练习

一般来说,除非指明,否则这些客户端的默认选项应该可以工作 – 只需指定服务器名称,用户名和密码即可。

针对Windows IPv6错误的解决方法

Windows有一种不正确设置VPN路由的趋势。特别是在编写本文时,大多数版本都不会设置IPv6默认路由(即使明确选择了该选项)。我知道两种可能的解决方法:

IPv6解决方法选项1:对路由表进行持久性添加

这应该适用于大多数Windows版本(当然也可能是Windows 7),但需要管理权限

  1. 从网络和共享中心设置VPN连接,记下您为VPN连接指定的名称(例如“我的VPN”)。
  2. 打开管理员命令提示符:
    1. 点击开始;
    2. 键入“cmd”,但不要按Enter键(或找到命令提示符的快捷方式,但不要点击它);
    3. 右键单击显示的快捷方式到“cmd”或“命令提示符”;
    4. 点击“以管理员身份运行”。
  3. 输入netsh interface ipv6 add route ::/0 "My VPN"(用客户端配置的VPN连接的名称替换“My VPN”)。
  4. 此新路由表条目将始终显示在路由打印的输出中,但仅在VPN连接处于活动状态时才会生效。

IPv6解决方案选项2:通过PowerShell将两条静态路由添加到VPN属性

此选项需要Windows 8.1或2012 R2或更高版本以及PowerShell – 但即使您没有管理权限也可以使用。

  1. 从(新的,Metro)网络设置应用程序或(旧的,Windows-7类似的)网络和共享中心设置VPN连接,记下您为VPN连接指定的名称(例如“我的VPN “)。
  2. 打开PowerShell。
  3. 输入以下两个命令:
    • Add-VpnConnectionRoute "My VPN" ::/1
    • Add-VpnConnectionRoute "My VPN" 8000::/1

    用客户端上配置的VPN连接的名称替换“我的VPN”。(因为PowerShell cmdlet拒绝添加默认路由,所以需要两个命令,即使IPv6默认路由在其他地方没有正确处理也是如此,这两条添加的路由一起相当于默认路由。)

致谢

感谢Daniel Thomas和Chris分享他们的反馈和建议。

原文链接:,转发请注明来源!
评论已关闭。