安全协议系列(五)---- IKE 与 IPSec(上)
IKE/IPSec 属于网络层安全协议,保护 IP 及上层的协议安全。自上个世纪末面世以来,关于这两个协议的研究、应用,已经非常成熟。协议本身,也在不断地进化。仅以 IKE 为例,其对应的 RFC 编号从 RFC 2407/2408/2409 演化成 RFC 4306,再演化为 RFC 5996,最新版本是 RFC 7296。
为什么要分成两个协议呢?这两个协议有什么区别?从密码学角度看,IKE 用于密钥交换,IPSec 用于保护后续的通信。而保护通信的密钥,就来自 IKE 协议运行的结果。(在 SSL/TLS 协议中,密钥生成和加密保护都是在单独一个协议中完成的,在这一点上,两者各有千秋)
本篇仍采用庖丁解牛的思路:进行一次实验,抓一次报文,用密码学验算一次。文中采用 python 作为验证工具。
实验环境搭建
服务器采用 Linux 上著名的开源实现 strongSwan(版本 4.4.0),操作系统为 Ubuntu Server 12.10(VMware 虚拟环境)。
客户端采用 Windows 7 内置的 IPSec VPN 客户端。
虚拟机运行在 Windows 7 上,配置双网卡,分别使用 NAT 和 Host-only 工作模式。两块网卡映射 Linux 中对应为 eth0 和 eth1。
IKE 与 IPSec 框架十分复杂,仅协议的使用就有多种选择。
比如 IKE 分为 IKEv1/IKEv2 两个版本,认证方式也有多种。IPSec 工作模式又分为 Tunnel 和 Transport 两种,具体实现协议又有 AH 和 ESP 之分。
考虑实际的测试环境和应用场景,本文中 IKE 协议使用 IKEv2/证书认证。IPSec 使用 Tunnel/ESP 模式。
网络拓扑如下

下载、编译、安装 strongSwan 4.4.0。一句话,就是 ./configure && make && make install 三步曲。
过程就不多说,唯一需要说明:strongSwan 要求 gmp 库支持。为简单起见,所有命令行操作均使用 root 身份。
生成 CA 证书(下面使用 OpenSSL,也可以使用 strongSwan 自带的 pki 命令)
root@ubuntu:~# openssl genrsa -des3 -out cakey.pem -passout pass:
root@ubuntu:~# openssl req -sha1 -days -new -key cakey.pem -out cacertreq.pem -passin pass: -subj "/C=CN/ST=HZ/O=VPN/CN=strongSwan CA"
root@ubuntu:~# mkdir -p demoCA/newcerts # 创建 CA 目录
root@ubuntu:~# touch demoCA/index.txt
root@ubuntu:~# echo > demoCA/serial
root@ubuntu:~# openssl ca -batch -selfsign -extensions v3_ca -days -in cacertreq.pem -keyfile cakey.pem -passin pass: -out ca.cer
临时修改 OpenSSL 配置文件
root@ubuntu:~# cp /etc/ssl/openssl.cnf ./
修改文件 openssl.cnf:
[ v3_ca ]
authorityKeyIdentifier = keyid,issuer
extendedKeyUsage = serverAuth
之所以这样(加上红色这一行),是因为 Windows 7 要求对端服务器证书具有【服务器身份验证】扩展属性,见下图

生成服务器证书
root@ubuntu:~# openssl genrsa -des3 -out serverkey.pem -passout pass:
root@ubuntu:~# openssl req -sha1 -new -key serverkey.pem -out servercertreq.pem -passin pass: -subj "/C=CN/ST=HZ/O=VPN/CN=server.vpn.cn"
root@ubuntu:~# openssl ca -batch -config ./openssl.cnf -extensions v3_ca -days -in servercertreq.pem -cert ca.cer -keyfile cakey.pem -passin pass: -out server.cer
安装 CA 及服务器证书到 strongSwan
root@ubuntu:~# cp ca.cer /usr/local/etc/ipsec.d/cacerts/
root@ubuntu:~# cp server.cer /usr/local/etc/ipsec.d/certs/
root@ubuntu:~# cp serverkey.pem /usr/local/etc/ipsec.d/private/
配置 strongSwan
root@ubuntu:~# cat /usr/local/etc/ipsec.conf
# ipsec.conf - strongSwan IPsec configuration file # basic configuration
config setup
charondebug="cfg 4, chd 4, dmn 4, enc 4, ike 4, job 4, knl 4, lib 4, mgr 4, net 4"
charonstart=yes
plutostart=no # Add connections here.
conn linux-vs-win7
authby=pubkey
left=%defaultroute
right=%any
keyexchange=ikev2
compress=no
auto=add
pfs=no
leftauth=pubkey
rightauth=pubkey
rightid=%any
leftsubnet=1.2.3.0/
leftsourceip=1.2.3.123
rightsourceip=1.2.3.0/
leftcert=server.cer
leftfirewall=yes root@ubuntu:~# cat /usr/local/etc/ipsec.secrets
: RSA serverkey.pem ""
生成客户端证书并打包成 PKCS12 格式
root@ubuntu:~# openssl genrsa -des3 -out clientkey.pem -passout pass:
root@ubuntu:~# openssl req -sha1 -new -key clientkey.pem -out clientcertreq.pem -passin pass: -subj "/C=CN/ST=HZ/O=VPN/CN=VPN Client"
root@ubuntu:~# openssl ca -batch -days -in clientcertreq.pem -cert ca.cer -keyfile cakey.pem -passin pass: -out client.cer
root@ubuntu:~# openssl pkcs12 -export -passin pass: -passout pass: -in client.cer -inkey clientkey.pem -out client.p12
将 PKCS12 及 CA 证书复制到 Windows 7 并安装到计算机帐户,点击【开始菜单】->【运行】->【mmc】,按下图所示,添加证书管理单元

导入客户端及 CA 证书

新建 VPN 连接

配置 VPN 连接属性:IKEv2 接入 VPN 网关

配置本地 DNS,在文件 c:\windows\system32\drivers\etc\hosts 最后一行加上
192.168.203.129 server.vpn.cn
配置结束,启动连接
root@ubuntu:~# ipsec start --nofork
Windows 7 下双击新建的 VPN 连接

下面是成功后的连接状态(已经获得服务器端分配的 IP 地址

连接过程中,Linux 命令行将输出一连串调试信息,这些信息在后面的计算验证中将用到
Python 环境准备
下载 Python 密码库 PyCrypto 的最新版本文件 pycrypto-2.6.1.tar.gz,解压到 C:\Python27\Lib
C:\Python27\Lib\pycrypto-2.6.1>python setup.py install
说明:安装过程中需要 Visual Studio 环境,用于编译源文件
安全协议系列(五)---- IKE 与 IPSec(上)的更多相关文章
- Netty4.x中文教程系列(五)编解码器Codec
Netty4.x中文教程系列(五)编解码器Codec 上一篇文章详细解释了ChannelHandler的相关构架设计,版本和设计逻辑变更等等. 这篇文章主要在于讲述Handler里面的Codec,也就 ...
- bt协议详解 DHT篇(上)
bt协议详解 DHT篇(上) 最近开发了一个免费教程的网站,突然产生了仔细了解bt协议的想法,这篇文章是bt协议详解系列的第三篇,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的 ...
- VPN 隧道协议PPTP、L2TP、IPSec和SSLVPN的区别
最近软矿频繁地介绍了各种VPN,有免费的PacketiX.NET和Hotspot Shield,有付费的Astrill VPN,iVPN和PureVPN.在介绍这些VPN的时候,常常会说到PPTP.L ...
- WCF编程系列(五)元数据
WCF编程系列(五)元数据 示例一中我们使用了scvutil命令自动生成了服务的客户端代理类: svcutil http://localhost:8000/?wsdl /o:FirstServic ...
- JVM系列五:JVM监测&工具
JVM系列五:JVM监测&工具[整理中] http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介 ...
- 协议系列之HTTP协议
什么是HTTP\HTTPS HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.HTTP协议用于从WWWserver传输超文本到本地浏览器的传输协议,它能使浏览 ...
- SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型
原文:SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测 ...
- VSTO之旅系列(五):创建Outlook解决方案
原文:VSTO之旅系列(五):创建Outlook解决方案 本专题概要 引言 Outlook对象模型 自定义Outlook窗体 小结 一.引言 在上一个专题中,为大家简单介绍了下如何创建Word解决方案 ...
- java多线程系列(五)---synchronized ReentrantLock volatile Atomic 原理分析
java多线程系列(五)---synchronized ReentrantLock volatile Atomic 原理分析 前言:如有不正确的地方,还望指正. 目录 认识cpu.核心与线程 java ...
随机推荐
- plist基本操作
重要概念:某些路径下“只能读,不能写”的原因 iPhone.ipad真机上 Resouces文件夹:是只读的,无法写入. document 和temp文件夹:可读,可写. 一.工程结构
- Linux FTP的安装与配置
Linux FTP的安装与配置 ftp安装部分,操作步骤如下: 可以使用yum命令直接安装ftp # yum install vsftpd ftp服务的开启与关闭命令: 开启:# service ...
- 我需要在Web上完成一个图片上传的功能(+2)
增加一个页面,用于判断传参是否正确. @{ //判断是否具备会员参数 if (UrlData.Count > 0) { Session["Arg ...
- checkbox的check事件
<input type="checkbox" id="NameFlag" name="originalName" onClick=&q ...
- canvas绘图
1.//获取canvas容器var can = document.getElementById('canvas');//创建一个画布var ctx = can.getContext('2d');2.绘 ...
- PDF 补丁丁 0.5.0.2713 发布(替换字库功能修正字符宽度问题)
新版本替换字库后,采用新字库的字符宽度.基本上可以满足一般的字库替换需求.请下载新版本测试.
- C#中REF和OUT的区别
在C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值,并保持该更改.若要通过引用传递参数, 可使用ref或out关键字.ref和out这两个关键字都能够提供相似的功 ...
- spark发行版笔记13
本期概览: ReceiverTracker架构设计 消息循环系统 ReceiverTracker具体的实现 Spark Streaming作为Spark Core基础 架构之上的一个应用程序,其中的R ...
- linux环境下安装oracle数据库 原文在卡卡100http://www.cnblogs.com/kaka100
centos55_oracle11gr2_install 第一个阶段:安装centos55 a:安装centos5.5 用图形界面安装 硬盘 16G 注意:用图形界面安装.. 第二个阶段:配 ...
- C# 中 多线程同步退出方案 CancellationTokenSource
C# 中提供多线程同步退出机制,详参对象: CancellationTokenSource CancellationTokenSource 中暂未提供复位操作,因此当调用Cancle 之后,若再次调用 ...