利用OpenVPN实现在系统中的多种安全访问

来源:互联网 发布:365桌面提醒器源码 编辑:程序博客网 时间:2024/06/05 21:59

 

 

利用OpenVPN实现在系统中的多种安全访问

 

 

 

   OpenVPN利用虚拟卡,以一种全新的方式实现了SSL VPN的功能,能够适应IP层之上的几乎所有应用。本分析了OpenVPN的实现原理并且利用OpenVPN在一个安全系统上实现了五种方式的SSL访问。

    关键词  SSL VPN;虚拟卡;虚拟地址;TunTap

 

 

1  引言

    VPN技术通过密钥交换、封装、认证、加密手段在公共络上建立起私密的隧道,保障传输数据的完整性、私密性和有效性。OpenVPN是近年来新出现的开放源码项目,实现了SSL VPN的一种解决方案。

    传统SSL VPN通过端口代理的方法实现,代理服务器根据应用协议的类型(如httptelnet等)做相应的端口代理,客户端与代理服务器之间建立SSL安全连接,客户端与应用服务器之间的所有数据传输通过代理服务器转发。这种实现方式烦琐,应用范围也比较窄:仅适用于用TCP固定端口进行通信的应用系统,且对每个需要代理的端口进行单独配置;对于每个需要用到动态端口的协议都必须重新开发,且在代理中解析应用协议才能实现代理,如FTP协议;不能对TCP以外的其它络通信协议进行代理;代理服务器前端的防火墙也要根据代理端口的配置变化进行相应调整。

    OpenVPN以一种全新的方式实现了SSL VPN的功能,克服了传统SSL VPN的一些缺陷,扩展了应用领域,并且防火墙上只需开放TCPUDP协议的一个端口。

2  OpenVPN作原理

2.1  虚拟

    Linux2.4版本以上,操作系统支持一个名为tun的设备,tun设备的驱动程序中包含两个部分,一部分是字符设备驱动,一部分是卡驱动。卡的驱动把从TCP/IP协议栈收到的数据包结构skb放于tun设备的读取队列,用户进程通过调用字符设备接口read获得完整的IP数据包,字符驱动read函数的功能是从设备的读取队列读取数据,将核心态的skb传递给用户;反过来字符驱动write函数给用户提供了把用户态的数据写入核心态的接口,write函数把用户数据写入核心空间并穿入TCP/IP协议栈。该设备既能以字符设备的方式被读写,作为系统的虚拟卡,也具有和物理卡相同的特点:能够配置IP地址和路由。对虚拟卡的使用是OpenVPN实现其SSL VPN功能的关键。

2.2  地址池以及路由

    OpenVPN服务器一般需要配置一个虚拟IP地址池和一个自用的静态虚拟IP地址(静态地址和地址池必须在同一个子中),然后为每一个成功建立SSL连接的客户端动态分配一个虚拟IP地址池中未分配的地址。这样,物理络中的客户端和OpenVPN服务器就连接成一个虚拟络上的星型结构局域OpenVPN服务器成为每个客户端在虚拟络上的关。OpenVPN服务器同时提供对客户端虚拟卡的路由理。当客户端对OpenVPN服务器后端的应用服务器的任何访问时,数据包都会过路由流虚拟卡,OpenVPN程序在虚拟卡上截获数据IP,然后使用SSL协议将这些IP封装起来,再过物理卡发送出去。OpenVPN的服务器和客户端在虚拟卡之上建立起一个虚拟的局域络,这个虚拟的局域对系统的用户来说是透明的。

2.3  客户端与服务端安全连接的建立

    OpenVPN的服务器和客户端支持tcpudp两种连接方式,只需在服务端和客户端预先定义好使用的连接方式(tcpudp)和端口号,客户端和服务端在这个连接的基础上进行SSL握手。连接过程包括SSL的握手以及虚拟络上的理信息,OpenVPN将虚拟上的段、地址、路由发送给客户端。连接成功后,客户端和服务端建立起SSL安全连接,客户端和服务端的数据都流入虚拟卡做SSL的处理,再在tcpudp的连接上从物理卡发送出去。

2.4  数据包的处理过程

2.4.1 发送数据流程

    应用层的外出数据,过系统调用接口传入核心TCP/IP层做处理,在TCP/IP经过路由到虚拟卡,虚拟卡的卡驱动发送处理程序hard_start_xmit()将数据包加入skb表并完成数据包从核心区到用户区的复制,OpenVPN调用虚拟卡的字符处理程序tun_read(),读取到设备上的数据包,对读取的数据包使用SSL协议做封装处理后,通过socket系统调用发送出去。

2.4.2  接收数据流程


   
物理卡接收数据包,过核心TCP/IP上传到OpenVPNOpenVPN通过link_socket_read()接收数据包,使用SSL协议进行解包处理,过处理的数据包OpenVPN调用虚拟卡的字符处理程序tun_write()写入虚拟卡的字符设备,设备驱动程序完成数据从用户区到核心区的复制,并将数据写入skb链表,然后调用netif_rx()接收程序,数据包再次进入系统TCP/IP协议栈,传到上层应用程序。如1所示。

 1  数据在系统中的处理过程

 

2.5  数据包的封装

    OpenVPN提供tuntap两种作模式。在tun模式下,从虚拟卡上收到的是不含物理帧头IP数据包,SSL处理模块对IP包进行SSL封装;在tap模式下,从虚拟卡上收到的是包含物理帧头的数据包,SSL处理模块对整个物理帧进行SSL封装。Tap模式称为桥模式,整个虚拟的络就像桥方式连接的物理络。这种模式可以传输以太帧、IPXNETBIOS等数据包,应用范围更广。

2.6  OpenVPNOpenssl

    OpenVPN软件包需要和openssl软件一起安装,因为OpenVPN调用了Openssl函数库,OpenVPN的客户端和服务端建立SSL链接的过程是通过调用Openssl来实现的。通过bio_write()/函数把数据写入Openssl的状态机通道,bio_read()Openssl读取结果。OpenVPN还调用Openssl的加解密函数处理转发的数据包。

3  OpenVPN的应用

3.1 系统结构介绍

    2所示的应用中,部门一和部门二是两个独立的业务部门,其各自内部局域络中的服务器交换机再SSL VPN网关连接到公共的络。用户A和用户B是部门一的远程用户,用户X和用户Y是部门二的远程用户,用户可以访问本部门服务器,但不能直接访问其它部门的服务器。

3.2 系统中设备的基本配置

    服务器SSL VPN1SSL VPN2上安装OpenVPN以服务器方式启动。

    用户AB和服务器SSL VPN2上启动OpenVPN以客户端方式向服务器SSL VPN1申请建立连接,连接建立成功后分配到的虚拟地址分别为10.8.0.210.8.0.310.8.0.4

    用户X

  • 利用OpenVPN实现在系统中的多种安全访问
  • 利用OpenVPN实现在系统中的多种安全访问
  • SHA256在多种语言中的实现
  • 利用桥接实现OpenVPN客户端访问与服务器(windows)同一网段的其它电脑
  • OpenVPN 实现跨网络远程桌面访问
  • 利用json绕过浏览器安全限制,实现跨域访问
  • 通过ssh实现在本地xp系统下访问虚拟机中的Linux系统
  • 利用OpenVPN搭建加密的访问传输通道
  • 使用OpenVPN实现网通、电信机房间快速、安全通信
  • 利用mount在Linux中挂装文件系统访问Windows系统
  • 在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持
  • 多种方法访问局域网中的计算机
  • 利用MySQLDriverCS实现在.NET环境下访问MySQL数据库
  • 利用多种协议实现路由跟踪
  • 利用bitand实现多种位操作
  • 用OpenVPN构建安全VPN [OpenVPN + CA]
  • Struts2中利用filter、session实现安全访问和身份认证
  • openvpn 多用户访问
  • VS2005快捷键大全
  • 正则表达式中的特殊字符:
  • boost学习-3.conversion,多态类型之间的安全转型,与数据类型转换
  • 教程站,站长们的悲哀
  • Modultils工具源码分析之insmod篇 (4)
  • 利用OpenVPN实现在系统中的多种安全访问
  • 选项卡滚动
  • 开源免费项目管理软件Tedmine的安装配置
  • curl_easy_perform接口只能下载资源的一部分?
  • UNIX环境高级编程学习之第十章信号-信号的基本操作(绑定/忽略/默认/发送)
  • 技术团队随想
  • Windows下Apache使用虚拟主机(多域名多站点)的设置
  • Linux内核修炼之道 之 前言
  • 使用 VMware 在 Linux 5.4 上安装、升级及维护 Oracle 10gR2 RAC
  • 原创粉丝点击