最近使用strongswan搭建ipsec环境,遇到了很多问题,查阅了大量资料和文档,做了大量尝试,将一些细节整理出来。本文假设读者有一定的基础知识,也清楚strongswan怎么安装和配置。
1. 证书部署或更新后,必须重启strongswan服务
使用证书进行身份验证是搭建Ipsec环境时最常用的一种技术,证书的生成可以向第三方CA机构申请,也可以自己使用自签名CA根证书来签发。本文采用后一种方式。strongswan使用pki工具来创建证书,
1)创建CA自签名根证书及私钥文件:
#ipsec pki --gen --outform pem > ca.key.pem
#ipsec pki --self --in ca.key.pem --dn "C=CN, O=StrongSwan, CN=StrongSwan CA" --ca --outform pem > ca.cert.pem
2)生成用户私钥文件,并用上面生成的根证书签发用户证书,假设两端的IP分别是192.168.171.129(作为client)、192.168.171.131(作为server),
sudo ipsec pki --gen --size 4096 --type rsa --outform pem > server.key.pem
sudo ipsec pki --pub --in server.key.pem --type rsa | ipsec pki --issue --lifetime 3650 --cacert ca.cert.pem --cakey ca.key.pem --dn "CN=192.168.171.131" --san="192.168.171.131" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem
sudo ipsec pki --gen --size 4096 --type rsa --outform pem > client.key.pem
sudo ipsec pki --pub --in client.key.pem --type rsa | sudo ipsec pki --issue --lifetime 3650 --cacert ca.cert.pem --cakey ca.key.pem --dn "CN=192.168.171.129" --san="192.168.171.129" --flag serverAuth --flag ikeIntermediate --outform pem > client.cert.pem
3)将生成的证书分别拷贝到ipsec的证书存放目录,需要拷贝的文件如下:
对192.168.171.129这个client
# cp ca.cert.pem /etc/ipsec.d/cacerts/ca.cert.pem
# cp client.key.pem /etc/ipsec.d/private/client.key.pem
# cp client.cert.pem /etc/ipsec.d/certs/client.cert.pem
对192.168.171.131这个server
# cp ca.cert.pem /etc/ipsec.d/cacerts/ca.cert.pem
# cp server.key.pem /etc/ipsec.d/private/server.key.pem
# cp server.cert.pem /etc/ipsec.d/certs/server.cert.pem
拷贝完成后,双方就能通过证书建立ipsec通道,但需要注意一个问题,证书部署完成后,或者更新过,并不会立即生效,必须重启strongswan服务(strongswan-starter)才能生效。
# systemctl restart strongswan-starter.service
你也可以通过 ipsec restart来实现重启服务。另外,为了确保证书已经部署到位,你可以使用ipsec listcerts命令来查看已经部署好的证书:
图中圈出来的地方,尤为重要,如果证书没有部署好,或私钥文件与证书不匹配,这里是没有这句话的。证书部署后没有重启服务,或者证书部署错误,都会为后面的建立连接带来不可预料的问题,所以强烈建议大家通过ipsec listcerts命令检查自己部署的证书。
2.证书中的CN字段非常重要
创建证书时,我们会通过参数设定CN字段的值,这个值可以算作证书的一个标识,通常我们可以设置为IP地址、域名、甚至email、随便一个唯一字符串。但这里设置的内容,一定要对应到ipsec.conf文件中的leftid(或rightid)。strongswan会通过leftid(或rightid)来匹配证书,如果不一致,就会出错,无法通过验证。例如,按上面生成的证书,ipsec.conf文件正确的配置如下:
对192.168.171.129这个client
# ipsec.conf - strongSwan IPsec configuration file
# basic configuration
config setup
# strictcrlpolicy=yes
# uniqueids = no
conn %default
ikelifetime=60m
keylife=20m
rekeymargin=3m
keyingtries=1
keyexchange=ikev2
auto=add
conn host-host
left=192.168.171.129
leftid=192.168.171.129
leftcert=client.cert.pem
right=192.168.171.131
rightid=192.168.171.131
对192.168.171.131这个server
# ipsec.conf - strongSwan IPsec configuration file
# basic configuration
config setup
charondebug="ike 1, knl 1, cfg 0, net 1"
strictcrlpolicy=no
uniqueids=no
cachecrls=no
conn %default
ikelifetime=60m
keylife=20m
rekeymargin=3m
keyingtries=1
keyexchange=ikev2
auto=add
conn ipsec-ikev2-vpn
left=192.168.171.131
leftid=192.168.171.131
leftcert=server.cert.pem
right=192.168.171.129
rightid=192.168.171.129
rightauth=pubkey
其中leftcert就是证书的名称,leftid就是证书的标识,这个标识一定要和创建证书时设定的CN一致。
当然CN也不一定设置为IP,也可以设置为域名、email等,甚至一个特殊字符串都可以,只要不重复即可。
3. ipsec与 swanctl
The stroke utility is a small helper tool invoked by the ipsec command to control and monitor IPsec connections.
ipsec命令是stroke插件提供的管理ipsec连接的工具。目前已经被swanctl替代。但大量的资料和demo是使用这种方式。它使用的配置文件是:
/etc/ipsec.conf
swanctl
is a command line utility to configure, control and monitor the IKE charon daemon via the vici interface plugin.
swanctl是vici插件提供的新一代的strongswan的管理控制工具,它使用的配置文件是:
/etc/swanctl/swanctl.conf
这两个命令互不相干,配置文件也各自独立,互不相关。你可以选择只用一种,或两种都使用也没关系。也就是说,如果使用ipsec来控制strongswan,你就需要配置/etc/ipsec.conf文件,并将证书、私钥等文件拷贝到/etc/ipsec.d/目录下的对应位置; 如果你使用swanctl命令来控制strongswan,你就需要配置/etc/swanctl/swanct.conf文件,并将证书、私钥等文件拷贝到/etc/swanctl/目录下的对应位置。如果你修改了ipsec.conf文件,然后用swanctl命令来操作,就完全在做无用功。
4. 修改配置文件后必须reload
修改了ipsec.conf文件后,必须使用 ipsec reload命令来重新加载配置文件。
修改了ipsec.secrets文件后,必须使用ipsec rereadsecrets来加载。
修改了swanctl.conf文件后,必须使用 swanctl --load-all来加载。
否则,不起作用!