背景:因公司业务逐渐迁移到阿里云上,所以有需求搭建一条从公司内容到阿里云的×××隧道,因环境限制并未有vpn设备可以使用,所以计划在linux上搭建ipsecvpn来实现该功能。拓扑图如下:

目的:在阿里云服务器172.16.0.11和公司服务器192.168.6.79之间建立一条ipsec vpn隧道。实现两端私网网段的互访。其中私网地址分别是:172.16.0.11/16和192.168.0.0/16。

服务器版本:CentOS release 6.5 (Final)

软件说明:

  1. Openswan简介

Openswan是Linux下IPsec的最佳实现方式,其功能强大,最大程度地保证了数据传输中的安全性、完整性问题。 Openswan支持2.0、2.2、2.4以及2.6内核,可以运行在不同的系统平台下,包括X86、X86_64、IA64、MIPS以及ARM。 Openswan是开源项目FreeS/WAN停止开发后的后继分支项目,其分裂为两个项目,Openswan与 Strongswan,Openswan由三个主要组件构成:配置工具(ipsec命令脚本)、Key管理工具(pluto)、内核组件(KLIPS/26sec) 26sec使用2.6内核内建模块Netkey,用来替代Openswan开发的KLIPS模块,2.4及以下版本内核无Netkey模块支持,只能使用KLIPS。如果你用的是2.6.9以上的内核,推荐使用26sec,可以不用给内核打Nat-T补丁就可以使用NAT,2.6.9以下版本内核的NETKEY存在Bug,推荐使用KLIPS。IPSec差不多是最老的×××标准了,她的依然很安全,当然是在配置好以后。言下之意,她的配置比较麻烦。本文下面将做说明。

因为FreeS/WAN已经在2004年三月停止开发,所以我们使用她的后继项目Openswan来做我们的IPSec实验。其相比FreeS/WAN有个好处,如果使用 26sec 的时候,Openswan不用打补丁,就可以用nat。

  1. Openswan的安装 因为IPSec工作在网络层,所以需要系统内核态的支持,上面说过,有两个选择,用自带(26sec)的或用Openswan(KLIPS)的,为了方便(如何打补丁和编译内核不是本文讨论的重点),本文使用CentOS源中编译好的Openswan来进行实验。现在的Openswan已经内建些个好用的补丁,比如x.509和NAT Traversal的支持,使用起来非常的方便。你也可以用下面的命令来检验你的安装。# ipsec verify

3、Openswan的认证方式

Openswan支持许多不同的认证方式,包括RSA keys、pre-shared keys、xauth或x.509证书方式。本文使用最简单的口令PSK认证。

4、Openswan的连接方式:

Network-To-Network方式 Network-To-Network方式是把两个网络连接成一个虚拟专用网络。当连接建立后,每个子网的主机都可透明地访问远程子网的主机。要实现此种连接方式,要满足以下两个条件: I. 每个子网各自拥有一台安装有OpenSWan的主机作为其子网的出口网关或者路由; II.每个子网的IP段不能有叠加

安装说明(其中任意一台服务器):

   1、开启数据转发

vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

net.ipv4.conf.default.rp_filter = 0

2、关闭icmp重定向

sysctl -a | egrep "ipv4.*(accept|send)_redirects" | awk -F "=" '{print$1"= 0"}' >> /etc/sysctl.conf

sysctl -p

3、关闭SELinux

setenforce 0

4、安装openswan

yum install openswan lsof -y

rpm -ql openswan //查看安装了那些文件。

ipsec --version //查看ipsec的版本

这里并没有加载任何的IPsec stack,当启动IPsec后悔自动加载系统自带的netkey。

service ipsec start

ipsec verify //对ipsec进行验证

wKiom1i2w1TAj4coAABpdBFJFWs798.png

#netstat -nplu //查看监听端口

wKioL1i2w7mCVyf-AABbAppC8Ww358.png

我们可以看到openswan监听在UDP的500和4500两个端口,其中500是用来IKE密钥交换协商,4500的NAT-T是nat穿透的。

Openswan配置(network-to-network):

version 2 config setup plutostderrlog=/var/log/pluto.log //指定vpn的日志生成文件 protostack=netkey nat_traversal=yes virtual_private= oe=off

conn net-to-net //指定该vpn连接的名字 authby=secret type=tunnel left=192.168.6.79 //left是指本地主机。 leftsubnet=192.168.0.0/16 leftid=@test2 leftnexthop=%defaultroute right=1.1.1.1 //right是指对端主机。 rightsubnet=172.16.0.0/16 rightid=@test1 rightnexthop=%defaultroute auto=start //start表示自动连接vpn,add代表需要手动连接

同样的另外一台vpnserver上面,信息和上面一样,只要注意到left和right即可。

vim /etc/ipsec.secrets

192.168.6.79 0.0.0.0 : PSK "**************"

重启两个vpn服务

service ipsec restart

启动我们创建的con名字

#ipsec auto --up net-to-net /当配置的auto=add 时,才需要手动启动,配置为start则不需要。

可以进入日志文件查看,连接日志

vim /var/log/pluto.log

Feb 23 20:11:44: "net-to-net" #1: transition from state STATE_MAIN_I2 to state STATE_MAIN_I3 Feb 23 20:11:44: "net-to-net" #1: STATE_MAIN_I3: sent MI3, expecting MR3 Feb 23 20:11:46: packet from 123.56.12.108:500: received Vendor ID payload [Dead Peer Detection] Feb 23 20:11:46: packet from 123.56.12.108:500: received Vendor ID payload [FRAGMENTATION] Feb 23 20:11:46: packet from 123.56.12.108:500: received Vendor ID payload [RFC 3947] Feb 23 20:11:46: packet from 123.56.12.108:500: ignoring Vendor ID payload [draft-ietf-ipsec-nat-t-ike-03] Feb 23 20:11:46: packet from 123.56.12.108:500: ignoring Vendor ID payload [draft-ietf-ipsec-nat-t-ike-02_n] Feb 23 20:11:46: packet from 123.56.12.108:500: ignoring Vendor ID payload [draft-ietf-ipsec-nat-t-ike-02] Feb 23 20:11:46: "net-to-net" #2: enabling possible NAT-traversal with method RFC 3947 (NAT-Traversal) Feb 23 20:11:46: "net-to-net" #2: responding to Main Mode Feb 23 20:11:46: "net-to-net" #2: transition from state STATE_MAIN_R0 to state STATE_MAIN_R1 Feb 23 20:11:46: "net-to-net" #2: STATE_MAIN_R1: sent MR1, expecting MI2 Feb 23 20:11:46: "net-to-net" #2: NAT-Traversal: Result using RFC 3947 (NAT-Traversal) sender port 500: I am behind NAT+peer behind NAT Feb 23 20:11:46: "net-to-net" #2: transition from state STATE_MAIN_R1 to state STATE_MAIN_R2 Feb 23 20:11:46: "net-to-net" #2: STATE_MAIN_R2: sent MR2, expecting MI3 Feb 23 20:11:46: "net-to-net" #2: Main mode peer ID is ID_FQDN: '@test1' Feb 23 20:11:46: "net-to-net" #2: transition from state STATE_MAIN_R2 to state STATE_MAIN_R3 Feb 23 20:11:46: "net-to-net" #2: new NAT mapping for #2, was 123.56.12.108:500, now 123.56.12.108:4500 Feb 23 20:11:46: "net-to-net" #2: STATE_MAIN_R3: sent MR3, ISAKMP SA established {auth=PRESHARED_KEY cipher=aes_256 integ=sha group=MODP2048} Feb 23 20:11:46: "net-to-net" #2: the peer proposed: 192.168.0.0/16:0/0 -> 172.16.0.0/16:0/0 Feb 23 20:11:46: "net-to-net" #3: responding to Quick Mode proposal {msgid:43be8e61} Feb 23 20:11:46: "net-to-net" #3: us: 192.168.0.0/16===192.168.6.79<192.168.6.79>[@test2] Feb 23 20:11:46: "net-to-net" #3: them: 123.56.12.108<123.56.12.108>[@test1]===172.16.0.0/16 Feb 23 20:11:46: "net-to-net" #3: transition from state STATE_QUICK_R0 to state STATE_QUICK_R1 Feb 23 20:11:46: "net-to-net" #3: STATE_QUICK_R1: sent QR1, inbound IPsec SA installed, expecting QI2 tunnel mode {ESP/NAT=>0xac8224cd <0x7f04b45c xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=123.56.12.108:4500 DPD=passive} Feb 23 20:11:46: "net-to-net" #3: transition from state STATE_QUICK_R1 to state STATE_QUICK_R2 Feb 23 20:11:46: "net-to-net" #3: STATE_QUICK_R2: IPsec SA established tunnel mode {ESP/NAT=>0xac8224cd <0x7f04b45c xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=123.56.12.108:4500 DPD=passive} Feb 23 20:12:48: "net-to-net" #1: max number of retransmissions (8) reached STATE_MAIN_I3. Possible authentication failure: no acceptable response to our first encrypted message Feb 23 20:12:48: "net-to-net" #1: deleting state #1 (STATE_MAIN_I3)

当我们看到ipsec sa estabilished,就证明我们连接成功了,也可以从中看到一些加密方法,密钥交换参数,我们也可以在配置文件里面添加如下信息进行修改。 ike=aes256-sha2_256;modp2048 phase2alg=aes256-sha2_256;modp2048 然后在clinet1上面去ping对端子网的设备,可以看到如下,但是×××Server是不能ping通对方子网的设备的。

openvpn搭建完成后,是不会生成虚拟网卡的,并且路由表也不需要指定。

wKiom1i2x1qQHIL-AABfxXd2RUg814.png

wKioL1i2x47RDwONAAAg-qhEODQ138.png

防火墙配置:

公司vpn服务器对外提供服务需要配置静态NAT,所以在防火墙上需要为服务器192.168.6.79设置对应的公网ip地址为2.2.2.2,并在策略中放行。

注:本次搭建vpn服务器总体上还算顺利,主要遇到的两个问题还是在阿里云上,由于对阿里云的网络结构不太熟悉,所以造成了问题。

阿里云给的公网地址1.1.1.1,实则是弹性IP,相当于公网IP并没有配置在虚拟云主机上,而是在阿里云的出口网关上(相当NAT),之前配置的时候,阿里云vpn服务器的left地址写成了公网地址1.1.1.1,造成连接失败。

阿里云提供的VPC实则是专有网络,内部网络间是做了二层隔离的,内部172.16.0.0/16网段的主机之间默认是可以互访的,但要访问192.168.0.0/16网段是不可以的,即使你在主机上添加了该路由,也是不能访问的。这也是我之前创建完vpn,连接也成功了,但就是不能访问对端子网的服务器地址。。。解决办法是:在VPC网络中的虚拟路由器的路由表中添加一条到192.168.0.0/24的路由,下一跳地址就写成阿里云的vpn服务器实例。