0x01 前言

上周我在知乎专栏编写了我博客的服务架构,其中介绍到数据库master-master同步以实现高可用的内容。该服务需要用到2个端口,若SSH隧道则很复杂,此时我选择ipsec服务建立安全隧道,供数据库集群使用。

该知乎专栏请留意以下链接:

数据库集群的相关文章请留意以下链接:

因为我家里用的是电信家庭宽带,虽然有公网IP,但有时候会被屏蔽所有端口的入展数据,所以我选择腾讯云作为服务端,而我家里的服务器作为客户端。

因为只需要给数据库使用,因此不需要配置iptables NAT,只需要制定ipsec两侧的IP即可;

不同于我常用的IKEv2协议,ipsec不需要准备数字证书,但需要准备预共享密钥;不需要配置左右两侧的id等信息。

0x02 安装服务端

首先在腾讯云上安装服务端,为了使用最新版的软件,我一般会到官网下载最新版并自行编译安装。

编译过程可以参考以下文章:

首先在strongswan官网下载最新版源代码:

然后解压、编译和安装即可:

至此已完成软件的编译安装,过程极其简单,因为这款软件的难点在配置与调试。

0x03 配置服务端

首先进入软件的配置文件目录:

该目录下有以下文件与文件夹:

  • ipsec.conf:定义连接规范的配置文件;
  • ipsec.d:放置各类数字证书的文件夹
  • ipsec.secrets:记录用户名、密码与预共享密钥等信息的文件,主要用于本地验证;
  • strongswan.conf:strongswan:配置文件,配置验证服务器与DNS等信息;
  • strongswan.d:strongswan各模块配置文件的目录;
  • swanctl:strongswan认证类型配置文件的目录。

在本文的使用环境中,需要编辑ipsec.conf、ipsec.secrets与strongswan.conf这三个文件。

0x03.1 ipsec.conf

这个文件主要定义连接规范,常用的有ipsec与IKEv2,在本文的需求中,只需要使用psk的ipsec即可,因此配置文件如下:

以上配置文件中有几项较为重要的:

  • 连接存活检测相关的配置:因家庭宽带会自动断开,也有可能因为网络抖动引起连接失败,因此需要根据网络延迟进行调试与配置;
  • margintime:建议将重新协商的时间设置为超时前10至20分钟之间;
  • 加密算法:因为新版的strongswan中移除了老旧的加密算法,因此需要手动指定,提高协商的成功率;
  • rightsourceip:为客户端分配一个固定IP,若使用自带的DHCP则很难知道具体是哪一个。

0x03.2 ipsec.secrets

这个文件的内容比较少,在IKEv1_Psk连接规范中有以下参数:

  • 服务端认证方式:leftauth = psk
  • 客户端认证方式:rightauth = psk
  • 客户端认证方式2:rightauth2 = xauth

xauth在这里是用户名与密码的验证,而psk就是预共享密钥,因此,该文件的全部内容为:

PSK冒号左侧留空,代表此为默认的psk;如果加上用户名,则该用户一定要填写该psk。

0x03.3 strongswan.conf

因为我的环境不需要radius,因此该文件的内容比较简单:

因为主动模式存在安全隐患,因此配置文件的第二行有一句非常明显的信息,需要设为yes才能启用主动模式。

其实DNS也是不需要的,毕竟不需要连接公网。

0x03.4 启用与检查

因为我的软件是自行编译的,因此需要将二进制文件链接到sbin目录中,具体请参考本文的“0x02 安装服务端”部分。

然后通过以下命令启动ipsec服务:

如果需要查看连接情况,则需要使用以下命令:

当然,还可以通过以下命令实时查看日志:

0x04 配置客户端

客户端就没服务端那么多配置项了,同时客户端也可以通过yum安装:

然后进入配置文件目录:

客户端只需要配置ipsec.conf与ipsec.secrets即可。

0x04.1 ipsec.conf

配置文件比较简单:

首先还是重要的存活检测,客户端也要配置,发现连接异常时需要尝试重新连接;然后需要配置服务端的IP地址:

  • right:腾讯云的公网IP或域名,用于连接;
  • rightid:腾讯云主机的内网IP,用于识别id;
  • rightsubnet:定义ipsec私有网络的子网。

最后还有一个很重要的:

  • auto:当ipsec启动时的动作,设为add代表自动拉起“cn1”并尝试连接。

如果将strongswan设为开机启动,并且希望自动连接,则需要进行以上配置;如果需要手动连接,则配置为start即可。

0x04.2 ipsec.secrets

该配置文件与服务端的一致即可。

需要注意ipsec.conf中xauth_identity的值需要与该文件中“XAUTH”的用于名一致。

0x04.3 启动

strongswan自身会以一个守护程序存在系统中,如果在ipsec.conf中定义了多个连接规范,那么将会有多个连接。

因为客户端是通过yum安装的,在centos7中需要通过systemctl启动:

如果在连接规范中设定了自动连接,那么通过以下命令将可以看到连接的session:

如果需要关闭连接,则使用以下命令:

如果需要拉起连接,则使用以下命令:

0x05 测试与使用

在服务端与客户端中并没有配置路由或NAT,因此只支持访问对方的网关。

再次查看以下信息:

注意最后一行,等号左侧为本地的IP,如果在客户端上执行该命令,则为ipsec分配的私有IP地址,如果在服务端上运行该命令,则为服务器网卡IP。因为腾讯云用的是NAT,因此显示为一个内网IP。

等号右侧为对端IP。

此时在客户端与服务端上分别ping对端,如果网络可达则完成配置:

我在深圳,而腾讯云我选择了广州的数据中心,因此延迟在10ms以内,这有非常利于数据库集群的组建。

数据库集群中位于我家中的节点的配置文件如下:

腾讯云中的数据库节点的配置文件如下:

0x06 结语

腾讯云和别的大型云服务商一样,服务器上的IP为内网IP,而公网IP支持动态分配,这时候就需要NAT。因此在配置ipsec服务,在建立配置文件时需要注意IP地址的填写。