strongswan是一套完整的IPsec实现方案来提供服务端和客户端之间的加密和认证。
它能用来保证远端网络通信之间的安全,这样远端连接就跟本地连接一样。
图中名词解释
网关:网关通常是你的防火墙,但它也可能是你网络中的主机。网关通常用来为一个小型网络提供DHCP和DNS服务。
远程连接/访客:通常访客是笔记本和其他移动设备,通过网关来远程连接到你的网络。图中的carol代表了一个访客想要连接分别在两个网关后面的两个网络。
远端主机/主机到主机:主机可以是远端的网站服务或者备份系统。图中为“Webserver winnetou”和各个网关。两个网关之间的连接通常需要各自都初始化。
远端域/域到域:在不同地方的两个子网内的主机或者更多子网内的主机应该是可以相互通信的。又回到上图中,moon和sun两个网关后面的两个子网10.1.0.0/24和10.2.0.0/24,原则上是可以建立连接,然后主机alice和bob就可以彼此安全地通信了。
strongswan本质上是基于密钥的应用程序,使用互联网密钥交换协议(IKEv1和IKEv2)来建立两端之间的安全关联。IKE提供了端与端之间彼此的强认证并且获取唯一的加密会话密钥。像这样的一个IKE会话(IKE session)经常用 IKE_SA(Security Association) 来表示。
除了认证和密钥,IKE还提供了交换配置信息的方法(比如虚拟网络地址),提供了协商IPsec SAs(也被称作CHILD_SAs)的方法。IPses SAs定义了哪些网络传输是安全的,并且定义了它是怎样加密和认证的。
一个CHILD_SA包含两个重要的组成部分:
1、实际的IPsec SAs(有两个,每个方向一个)描述了用来加密和认证的算法和密钥。
2、策略(至少两条)定义了哪种网络传输可以使用这样的SA。
策略工作在两个方向上,也就是说,解密后的数据包只有符合入口策略才允许被传输。当在建立一个CHILD_SA时,策略就可以从传输选择器(Transfer Selector: TS)里获取,TS是通过IKE协商出来的。
内核收到的未受保护的数据包且能匹配到IpSec的入口策略,将会被丢弃。这是安全特点。
实际的IPsec网络传输并不是由strongswan掌握,而是由实际网络和操作系统的IPsec协议栈传输(XFRM)。
strongswan使用平台依赖的内核接口来下发协商好的IPsec SAs(Security Association)和SPs(Security Policy)。IPsec中有两个重要概念:安全关联(Security Association)和安全策略(Security Policy),这两类信息都需要存放在内核XFRM。核XFRM使用netns_xfrm这个结构来组织这些信息,它也被称为xfrm instance(实例)。
上述提到的策略和SAs之间的区别,经常导致误解。 例如,在上图中所示,如果主机moon与主机sun之间有site-site类型的隧道连接(连接两个网段10.1.0.0./24和10.2.0.0/24),主机carol有个远程私有连接到主机sun(carol的虚拟IP地址是10.3.0.10),然而carol并不能与alice通信,尽管在主机sun上转发是可以的。这是因为在carol和alice之间没有IPsec策略允许他们通信。建立另一条在moon和sun之间的SA来连接虚拟子网10.3.0.0/24与10.1.0.0/24之间的通信,将是一个可行的方案。
《XFRM – IPsec协议的内核实现框架 》中有提到SA与SP更详细底层的解释。
一般来说,IPsec处理事务与路由是两个不同的主题。
有个例外就是route based ipsec
Route based IPsec比Policy based IPsec更简单。
为了确保每一个端的IKE_SA能够生成,每个端就已经声明自己是被认证过的。
strongswan提供了几种方式来实现这一点:
1、公钥认证:
(1)它使用RSA,ECDSA或者EdDSA X.509证书体系来验证对方的身份。
(2)证书能够被自签(证书必须被各终端安装),或者被CA系统签发。
(3)Certificate Revocation Lists(CRLs) 或Online Cerificate Status Protocal(OCSP)可以用来验证证书的有效性。
(3)用来存储私钥的智能卡将以PKCS#11 plugin方式使用。
(4)为了防止中间人攻击,证书里的subject或subjectAltName字段必须被核实。
2、预共享密钥认证:
预共享密钥是种简单的方式,不适合拥有大量用户的场景。
3、可扩展认证协议(EAP)
4、扩展认证(XAuth)
如果使用IKEv2,它就可能使用多个认证回合,例如,第一次用证书认证设备,然后用基于用户名/密码的认证(EAP-MSCHAPv2)来认证用户。也可以使用非对称的认证方式,例如,网关用证书认证,而用户用基于EAP的用户名/密码方式认证。请明白并不是所有的IKEv2实现都支持这一拓展。
配置strongswan的时候建议通过强大的vici接口和swanctl命令行工具。swanctl.conf配置文件是被swanctl用来存储证书和相应的私有密钥的地方。全局的strongswan设置信息被定义在strongswan.conf里。例外,ipsec stroke接口和它的ipsec.conf和ipsec.secrets配置文件都是可以被使用的。
strongswan通常是被swanctl命令管理的,而IKE进程charon是被systemd控制的。
因为历史原因,strongswan可以被ipsec命令控制,ipsec start将启动开始进程依次启动并配置密钥进程charon。
连接和CHILD_SAs在swanctl.conf里被定义(或者定义在ipsec.conf的conn章节)
连接和CHILD_SAs能以三种场景启动:
1、传输时建立:如果用了start_action=trap/auto=route,IPsec里针对配置好的传输的捕获策略将被安装,匹配这些策略的传输将会触发acquire事件,导致进程建立被请求的IKE/IPSec SAs。
2、启动时建立:CHILD_SAs被配置成start_action=start(或auot=start),当程序启动时将自动建立CHILD_SAs。
当CHILD_SAs下线时不会自动重启。你需要指定其他的配置项(dpd_action/dpdaction 或 close_action/closeaction)来自动重启他们,但即使这样,这项设置也不是安全可靠的,将存在潜在的丢包。你应大胆使用捕获策略,并阅读安全建议来避免这些问题。
3、手动建立:一条连接没有使用关键字start_action(在ipsec.conf里是auto=add)将不得不使用命令 swanctl --initiate(或ipsec up)来手动启动。
根据配置为文件,可以使用swanctl --install(或ipsec route)来为那些连接手动安装策略,就像启动时配置start_action=trap/auto=route。
在一个SA被建立后,就可通过swanctl --terminate(或ipsec down)命令来关闭IKE_SA或个人的CHILD_SAs。
只要swanctl.conf文件或者证书被改变就要被相应的–load命令重新加载下(ipsec update或ipsec reload*将重新加载ipsec.conf配置文件),已经建立的连接不会被这些重新加载命令所影响,因而要求SAs甚至进程重启启动。
为了兼容传统配置,ipsec.secrets或者ipsec.d目录下的文件被改变,那么可以执行ipsec reread命令来重新加载这些文件。
使用不同的**swanctl --list* (或ipsec list)**命令将提供查询已加载的或取消的证书信息,支持的算法和加载的插件等。
当你运行出错,提高日志等级可能帮助立找到哪里出错了。不同的日志参数信息被描述在我们的WiKi上和strongswan.conf的帮助页。
生成证书的最简单方式之一是使用ipsec pki工具。因为搭建一整套PKI是相当复杂的,我们只提供了些指导让你开始。
openssl也是一个广泛使用,可选择的工具来生成证书。
证书要求:
1、生成的叶子节点证书需要对对端的IKE ID认证成功。
2、换句话说,你能使用完整的DN或者所有的SAN域值作为一个ID.
3、此外,这个证书必须是Bob信任的,例如,这个证书之前就被Bob认证过,或是由Bob信任的作者颁发的。
4、为了认证成功,对端必须进行完整的证书链验证。
在Linux系统上,strongswan默认安装路由到路由表220,并且要求内核支持基于策略的路由(XFRM)。
你能用进程安装路由到任何的路由表,或者你完全可以关闭它。
基于这些原因,在strongswan.conf里的charon.install_routes, charon.routing_table和charon.routing_table_prio这些设置将会被使用。当一个隧道被两个子网建立,charon会尝试在本地子网内找到本地的IP地址。因此子网内的IP地址应该被配置为可查找的。如果一个有效的IP地址被找到,charon将添加一条路由条目指向远端子网,路由结果会像下面这样
10.1.0.0/24 via 10.2.0.1 src 10.2.0.2
参考:
IPsec文章
IPsec系列