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(上)的更多相关文章

  1. Netty4.x中文教程系列(五)编解码器Codec

    Netty4.x中文教程系列(五)编解码器Codec 上一篇文章详细解释了ChannelHandler的相关构架设计,版本和设计逻辑变更等等. 这篇文章主要在于讲述Handler里面的Codec,也就 ...

  2. bt协议详解 DHT篇(上)

    bt协议详解 DHT篇(上) 最近开发了一个免费教程的网站,突然产生了仔细了解bt协议的想法,这篇文章是bt协议详解系列的第三篇,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的 ...

  3. VPN 隧道协议PPTP、L2TP、IPSec和SSLVPN的区别

    最近软矿频繁地介绍了各种VPN,有免费的PacketiX.NET和Hotspot Shield,有付费的Astrill VPN,iVPN和PureVPN.在介绍这些VPN的时候,常常会说到PPTP.L ...

  4. WCF编程系列(五)元数据

    WCF编程系列(五)元数据   示例一中我们使用了scvutil命令自动生成了服务的客户端代理类: svcutil http://localhost:8000/?wsdl /o:FirstServic ...

  5. JVM系列五:JVM监测&工具

    JVM系列五:JVM监测&工具[整理中]  http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介 ...

  6. 协议系列之HTTP协议

    什么是HTTP\HTTPS HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.HTTP协议用于从WWWserver传输超文本到本地浏览器的传输协议,它能使浏览 ...

  7. SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型

    原文:SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测 ...

  8. VSTO之旅系列(五):创建Outlook解决方案

    原文:VSTO之旅系列(五):创建Outlook解决方案 本专题概要 引言 Outlook对象模型 自定义Outlook窗体 小结 一.引言 在上一个专题中,为大家简单介绍了下如何创建Word解决方案 ...

  9. java多线程系列(五)---synchronized ReentrantLock volatile Atomic 原理分析

    java多线程系列(五)---synchronized ReentrantLock volatile Atomic 原理分析 前言:如有不正确的地方,还望指正. 目录 认识cpu.核心与线程 java ...

随机推荐

  1. CentOS 配置防火墙操作实例(启、停、开、闭端口):

    CentOS 配置防火墙操作实例(启.停.开.闭端口): 注:防火墙的基本操作命令: 查询防火墙状态: [root@localhost ~]# service   iptables status< ...

  2. mysql-5.7.9安装

    版本:mysql-5.7.9-linux-glibc2.5-x86_64.tar.gz(编译版本) 解压: tar -zxvf mysql-5.7.9-linux-glibc2.5-x86_64.ta ...

  3. AndroidStudio NDK配置使用以及错误集合

    Error:Execution failed for task ':app:transformNative_libsWithStripDebugSymbolForDebug'. > java.l ...

  4. svn-多个项目版本库和自动同步更新post-commit

    由于项目测试需求,需要远程服务器上使用svn做版本控制. 需求: 1,项目test1,项目test2,各自独立版本库,各自独立用户权限,便于项目管理 2,同步提交,本地svn提交至版本库后,服务器上的 ...

  5. Python unittest appium

    import unittest from appium import webdriver from appium.common.exceptions import NoSuchContextExcep ...

  6. 3个sprint的团队贡献分

    第一次冲刺贡献分   成员名字 贡献分 101丘娟 23 108周诗琦 26 107杨晓霞 24 124陈程 27     第二次冲刺贡献分   成员名字 贡献分 101丘娟 23 108周诗琦 27 ...

  7. javascript中this指针

    看完此片文章豁然开朗,非常感谢.javascript技术难点(三)之this.new.apply和call详解 下面说一说自己的理解: this指针总是指向调用他的对象,其实我更愿意理解为:this指 ...

  8. Discuz! X3搬家后UCenter出现UCenter info: MySQL Query Error解决方案

    Discuz! X3 X2.5论坛搬家后 登录UCenter出现报错:UCenter info: MySQL Query ErrorSQL:SELECT value FROM [Table]vars ...

  9. Calculator(补)

    MyGitHub 刚刚开始时确实是连题目都看不懂= =,从第二行的新建类开始,就不知题目所云.所以我的困难比很多同学都要 开始得早一些--从题目第二行开始. 准确的说,当我按照题目要求新建了一个sca ...

  10. db2命令

    把远程的数据库信息加载到本地 第一步,catalog server端的node ,命令如下: db2 catalog tcpip node db2node remote hostname server ...