背景:因公司业务逐渐迁移到阿里云上,所以有需求搭建一条从公司内容到阿里云的VPN隧道,因环境限制并未有vpn设备可以使用,所以计划在linux上搭建ipsecvpn来实现该功能。拓扑图如下:
目的:在阿里云服务器172.16.0.11和公司服务器192.168.6.79之间建立一条ipsec vpn隧道。实现两端私网网段的互访。其中私网地址分别是:172.16.0.11/16和192.168.0.0/16。
服务器版本:CentOS release6.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差不多是最老的VPN标准了,她的依然很安全,当然是在配置好以后。言下之意,她的配置比较麻烦。本文下面将做说明。
因为FreeS/WAN已经在2004年三月停止开发,所以我们使用她的后继项目Openswan来做我们的IPSec实验。其相比FreeS/WAN有个好处,如果使用 26sec 的时候,Openswan不用打补丁,就可以用nat。
2. 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
# 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进行验证
#netstat -nplu //查看监听端口
我们可以看到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对端子网的设备,可以看到如下,但是VPNServer是不能ping通对方子网的设备的。
openvpn搭建完成后,是不会生成虚拟网卡的,并且路由表也不需要指定。
防火墙配置:
公司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服务器实例。具体阿里云VPC的知识可以看一下上一篇在网上转载的博文。