Strongswan Linux host-to-host 配置

1. 背景介绍

实验室的网络拓扑大致如图1-1

  • 红色为服务器区,IP地址段为172.18.0.0/16
  • 绿色的办公区,IP地址段为10.30.0.0/19
  • 黄色区域用为终端服务器区,同时接入服务器区网络和办公区网络

访问策略为

  • 办公区不能直接访问服务器区办公区终端需以远程桌面的方式登录终端服务器区Windows服务器,然后在远程桌面中访问服务器区,远程桌面登录凭据为非Administrator账户,登录平局需要申请。
  • 终端服务器区的Windows服务器不配置任何网络转发服务
  • 终端服务器区的防火墙控制服务器区对外部网络的访问,默认情况下,防火墙不转发任何服务器区的请求
  • 服务器区的某些服务器需要访问外部网络,在终端服务器区的防火墙上配置服务器白名单,以NAT的方式转发服务器的流量,鉴于是NAT方式访问外部网络,所以办公区仍然无法访问这些服务器区中的服务器
1-1
图1-1 实验室网络拓扑

办公区连接Windows远程桌面,在远程桌面中访问服务器区是为了保障服务安全,因为远程桌面的体验确实不尽人意,因此在办公区可以直接访问服务器区的服务器,可以提高用户体验!


2. 理论基础

  • 终端服务器区的防火墙允许服务器区的服务器访问外部网络,也允许其访问办公区,也没有访问端口限制
  • 办公区服务器区之间的两台主机之间搭建一条VPN链路,逻辑上,使得服务器区的服务器和办公区同在一个局域网IP地址段,如图2-1所示,绿色虚线为VPN链路
  • 办公区可以直接访问服务器区连接VPN链路的服务器,通过访问该服务器,也可以间接地访问其他服务器区的服务器
2-1
图2-1 实验室网络拓扑

3. 实现步骤

实验环境

假设服务器区的服务器为Carol,办公区的服务器为Moon

服务器 所在区域 IP地址 操作系统 VPN角色
Moon 办公区 10.30.8.8 CentOS 6 服务器
Carol 服务器区 172.18.31.13 CentOS 7 客户端

软件安装

在Moon和Carol之间搭建IKEv2 VPN,因此需要在Moon和Carol上均编译安装Strongswan,其中Moon(服务器)的Strongswan需要编译farp插件,farp插件可以让Carol获取10.30.0.0/19地址段的虚拟IP,这样Carol相当于办公区的完全网络成员了,如图3-1所示。Carol(客户端)不需要编译安装farp插件,具体如何编译安装以及配置Strongswan,具体参见

Moon同样需要安装并配置Freeradius用于VPN验证,具体参见

3-1
图3-1 逻辑拓扑

Moon(服务器)配置

IKEv2 VPN基础配置
  • 生成自签名CA证书
  • 利用自签名CA签发服务器证书
  • 配置Freeradius服务验证
  • 开放防火墙UDP的500、4500端口
  • 开启Linux转发
ipsec.conf配置

ipsec.conf配置如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
config setup
strictcrlpolicy = no #不验证CA是否为自签名
uniqueids = no

conn %default #默认设置
ikelifetime=60m
keylife=20m
rekeymargin=3m
keyingtries=1
keyexchange=ikev2

conn rw-eap
left=10.30.8.8 #服务器地址
leftid="C=CN, O=ACS, CN=10.30.8.8"
#验证ID,用于标识这个连接,接入客户端根据这个ID匹配该连接,该ID也是服务器证书信息
leftsubnet=10.30.0.0/19 #只访问10.30.0.0这段地址,其他流量仍然走默认网关
leftcert=server.cert.pem #服务器证书
leftauth=pubkey
leftfirewall=no
rightauth=eap-radius #验证方式
rightsendcert=never
right=%any #客户端匹配任何地址
auto=add

conn carol
also=rw-eap
rightid=carol@10.30.8.8 #客户端验证ID以及域
rightsourceip=10.30.30.13 #客户端配分的IP地址,固定了连接方便,DHCP每次IP地址可能不一样,也可以使用%dhcp字段
Freeradius验证条目添加

Freeradius插入验证条目,其中`carol@10.30.8.8为用户@域验证,Cleartext-Password为属性,这里为密码,:=为属性赋值,rootroot`具体的值

1
carol@10.30.8.8	Cleartext-Password	:=	rootroot
服务启动

配置完毕后,启动ipsec服务

1
ipsec start

Carol(客户端)配置

CA证书安装

因为Moon(服务器)的服务器证书是自签名CA签发的,所以客户端要手动信任这个自签名CA,将服务器CA证书拷贝到/usr/local/etc/ipsec.d/cacerts/目录下,启动ipsec服务后会自动加载该CA证书

ipsec.conf

客户端ipsec.conf的配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
config setup
strictcrlpolicy=no
uniqueids = no

conn %default
ikelifetime=60m
keylife=20m
rekeymargin=3m
keyingtries=1
keyexchange=ikev2

conn home
left=%defaultroute #因为客户端为nat网络,所以使用defaultroute字段
leftsourceip=%config #服务器使用farp插件,所以用%config字段
leftid=carol@10.30.8.8 #客户端验证ID,与Freeradius中的验证条目用户名一致
leftauth=eap
right=10.30.8.8 #服务器IP地址
rightid="C=CN, O=ACS, CN=10.30.8.8"
rightsubnet=10.30.0.0/19 #可以访问服务器端的IP地址段
rightauth=pubkey
auto=add
ipsec.secret

这里存放客户端所使用用户名和密码,用于登录时进行验证

1
carol@10.30.8.8 : EAP "rootroot"
服务启动

启动ipsec服务器,然后启动home连接

1
2
ipsec start
ipsec up home

最后出现如下提示信息,说明连接成功,客户端的虚拟IP地址为10.30.30.13,为办公区的IP地址范围

1
2
3
4
5
6
7
8
……
authentication of 'C=CN, O=ACS, CN=10.30.8.8' with EAP successful
IKE_SA home[1] established between 172.18.31.13[carol@10.30.8.8]...10.30.8.8[C=CN, O=ACS, CN=10.30.8.8]
scheduling reauthentication in 3311s
maximum IKE_SA lifetime 3491s
installing new virtual IP 10.30.30.13
CHILD_SA home{1} established with SPIs c88917d1_i c895cb68_o and TS 10.30.30.13/32 === 10.30.0.0/19
connection 'home' established successfully

路由信息查看

连接成功建立后,在Carol上使用ifconfig命令并不能看任何VPN虚拟适配器的信息,但是可以看到路由信息

1
2
[root@localhost ~]# ip route list table 220
10.30.0.0/19 via 172.18.31.254 dev ens2f0 proto static src 10.30.30.13

办公区连接

  • 办公区的任何终端上,可以通过IP地址10.30.30.13SSH登录位于服务器区的Carol
  • 若想登录服务器区其他服务器,可以先SSH登录Carol,再SSH登录其他服务器

4. 实验总结

重要的前提条件

  • 终端服务器区的防火墙只针对服务器区的服务器以IP地址形式进行过滤,而没有具体到服务以及端口
  • 服务器区之间都属于一个大局域网,没有做任何VLAN以及访问控制

配置过程中碰到的一些问题

  • 最开始不知道怎么在CentOS上以客户端的形式连接IKEv2 VPN,经过调研,Strongswan可以作为服务端,同时也可以完美地作为客户端
  • 知道以Strongswan作为客户端之后,不知道怎么启动客户端进行连接服务器,经过调研,获悉在ipsec服务启动后,使用命令ipsec up xxx启动连接,xxx为在ipsec.conf中配置连接的名称。ipsec down xxx为关闭连接命令
  • Freeradius问题,因为验证的用户名为`carol@10.30.8.8,其中carol为用户名,10.30.8.8为域(realm),但是在Freeradius配置域失败,索性就在用户名中直接填入carol@10.30.8.8,没想到这样可以验证成功,具体查看Freeradius的验证过程,使用radius -X查看输出的debug信息。另外一个思路是在ipsec.conf以及ipsec.secret`中去掉域信息,可以验证成功,但是IKEv2的SA建立会有问题
  • NAT问题,因为客户端是NAT网络,carol的ipsec.confleft字段填写错误,查看过官方文档后,正确的字段为left= %defaultroute
  • farp插件问题,carol的ipsec.confleftsourceip字段填写错误,仔细查看官方文档之后,正确的字段为leftsourceip=%config
  • Moon的ipsec.confleftid字段问题,该字段填写IP地址等,例如10.30.8.8,客户端的rightid也填写10.30.8.8,Moon端日志提示无法找到IKEv2 peer,如果把leftid改为服务器证书信息,例如leftid="C=CN, O=ACS, CN=10.30.8.8" ,则可以
  • 查看Strongswan的日志信息很重要,同时仔细参考官方给出的配置样例

5. 参考