OpenVPN部署手记

openvpn 搭建

一. OpenVPN基本介绍:

OpenVPN是开源的VPN守护进程(daemon),easy-RSA提供一些简易的CA证书工具。

二. OpenVPN的工作原理

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

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

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

  1. 虚拟网卡

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

2.  地址池以及路由

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

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

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

4. 数据包的处理过程

4.1发送数据流程

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

4.2接收数据流程

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

5. 数据包的封装

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

6,OpenVPN与Openssl

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

三. 服务器软件安装配置

1. 安装 epel源

yum install epel-release

检查系统TUN模块,一般系统自带

  # modinfo tun
   filename: /lib/modules/2.6.18-164.el5/kernel/drivers/net/tun.ko
   alias: char-major-10-200
   license: GPL
   author: (C) 1999-2004 Max Krasnyansky <[email protected]>
   description: Universal TUN/TAP device driver
   srcversion: 9DE80B8421E85BE6D3B9E06
   depends: 
   vermagic: 2.6.18-164.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1
   module_sig: 883f3504a9f782a581431131ff6a52711218ff0a0cb17a7f7462a56b587d3919a824faa39d   2d786e0a0ee3f10e7a4b9f03efc5c87b418191eea5a66171

2. 安装openvpn软件包,

yum install openvpn easy-rsa

2.1 easy-rsa配置

        # mkdir -p /etc/openvpn/easy-rsa/keys
        # cp -rf/usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa/

2.3 创建ca 证书和密钥

#修改注册信息,比如公司地址、公司名称、部门名称等。

         # vi /etc/openvpn/easy-rsa/vars
          export KEY_COUNTRY="CN"
          export KEY_PROVINCE="Shandong"
          export KEY_CITY="Qingdao"
          export KEY_ORG="MyOrganization"
          export KEY_EMAIL="[email protected]"
          export KEY_OU="MyOrganizationalUnit"

# cd /etc/openvpn/easy-rsa/

初始化证书授权中心

            # cp openssl-1.0.0.cnf openssl.cnf
            # source ./vars
            #./clean-all

创建CA证书和密钥

            ./build-ca

创建服务器端证书和密钥

 
            ./build-key-server server

创建客户端的证书和密钥

       
            ./build-key client

创建迪菲霍尔曼密钥交换参数

 
        ./build-dh

2.4  配置服务端证书,密钥

        # cd /etc/openvpn/easy-rsa/keys/
        # cp dh2048.pem ca.crt server.crt server.key /etc/openvpn/

客户端证书秘钥:ca.crt client.crt client.key(编辑openvpn客户端配置文件会用到)

配置VPN服务器端

            # cp /usr/share/doc/openvpn-2.3.2/sample/sample-config-files/server.conf  /et            c/openvpn/
            vim /etc/openvpn/server.conf
              port 1194
              # 改成tcp,默认使用udp,如果使用HTTP Proxy,必须使用tcp协议
              proto tcp
              dev tun
              # 路径前面加keys,全路径为/etc/openvpn/keys/ca.crt
              ca keys/ca.crt
              cert keys/server.crt
              key keys/server.key  # This file should be kept secret
              dh keys/dh2048.pem
              # 默认虚拟局域网网段,不要和实际的局域网冲突即可
              server 10.8.0.0 255.255.255.0
              ifconfig-pool-persist ipp.txt
              # 10.0.0.0/8是我这台VPN服务器所在的内网的网段,读者应该根据自身实际情况进行                修改
              push "route 10.0.0.0 255.0.0.0"
              # 可以让客户端之间相互访问直接通过openvpn程序转发,根据需要设置
              client-to-client
              # 如果客户端都使用相同的证书和密钥连接VPN,一定要打开这个选项,否则每个证书                只允许一个人连接VPN
              duplicate-cn
              keepalive 10 120
              tls-auth keys/ta.key 0 # This file is secret
              comp-lzo
              persist-key
              persist-tun
              # OpenVPN的状态日志,默认为/etc/openvpn/openvpn-status.log
              status openvpn-status.log
              # OpenVPN的运行日志,默认为/etc/openvpn/openvpn.log 
              log-append openvpn.log
              # 改成verb 5可以多查看一些调试信息
              verb 5

2.5  Iptables配置

            # iptables -F            
            # iptables -X
            查看确认
            # iptables -L -n
            允许ssh端口通过
            # iptables -A INPUT -p tcp --dport 22 -j ACCEPT
            # iptables -P OUTPUT ACCEPT
            允许openvpn的端口连接
            # iptables -A INPUT -p tcp --dport 1194 -j ACCEPT
            配置openvpn的nat功能,将所有10.8.0.0网段的包转发到eth0口
            # iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
            添加FORWARD白名单
            iptables -A FORWARD -i tun+ -j ACCEPT
            允许虚拟网段的所有连接
            # iptables -A INPUT -s 10.8.0.0/24 -j ACCEPT
            保持已经建立的连接
            # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
            # service iptables save
            service iptables start

2.6开启系统的内核转发参数

            # echo "1" > /proc/sys/net/ipv4/ip_forward            
           开启永久内核转发参数:
             vim /etc/sysctl.conf
            net.ipv4.conf.default.accept_source_route = 1
            net.ipv4.conf.default.rp_filter = 0
            net.ipv4.ip_forward = 1
            sysctl -p

四.  客户端配置

  • 安装openvpn-clents
  • 将客户端证书秘钥:ca.crt client.crt client.key 拷到openvpn/config目录下
  • 把samle-config/client.ovpn复制到 config
  • 修改client.ovpn配置项remote Openvpnserver_IP 1194

五. 扩展添加帐号验证

1.修改openvpn服务主配置文件,添加如下内容;如果加上client-cert-not-required则代表只     使用户名密码方式验证登录,如果不加,则代表需要证书和用户名密码双重验证登录!

    vi  /usr/local/openvpn/etc/server.conf         
        auth-user-pass-verify /usr/local/openvpn/etc/checkpsw.sh via-env
        client-cert-not-required  
        username-as-common-name
        script-secrity 3

2.获取口令验证脚本

        wget http://openvpn.se/files/other/checkpsw.sh -P /etc/openvpn
        
        vi /etc/openvpn/checkpsw.sh
            #!/bin/sh
            ###########################################################
            # checkpsw.sh (C) 2004 Mathias Sundman <[email protected]>
            #
            # This script will authenticate OpenVPN users against
            # a plain text file. The passfile should simply contain
            # one row per user with the username first followed by
            # one or more space(s) or tab(s) and then the password.
            PASSFILE="/etc/openvpn/psw-file"
            LOG_FILE="/var/log/openvpn-password.log"
            TIME_STAMP=`date "+%Y-%m-%d %T"`
            ###########################################################
            if [ ! -r "${PASSFILE}" ]; then
            echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading                ." >> ${LOG_FILE}
            exit 1
            fi
            CORRECT_PASSWORD=`awk ‘!/^;/&&!/^#/&&$1=="‘${username}‘"{print $2;exit}‘ ${PA                SSFILE}`
            if [ "${CORRECT_PASSWORD}" = "" ]; then 
            echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=                \"${password}\"." >> ${LOG_FILE}
            exit 1
            fi
            if [ "${password}" = "${CORRECT_PASSWORD}" ]; then 
            echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >>                 ${LOG_FILE}
            exit 0
            fi
            echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\                "${password}\"." >> ${LOG_FILE}
            exit 1
            
        chmod +x checkpsw.sh
        chmod nobody.nobody checkpaw.sh

3.创建密码验证文件

    vi /etc/openvpn/psw-file        
        文件格式: user <Tab> passwd
        user  passwd

4.增加client验证时询间用户名和密码

编辑openvpn/config/client.ovpn

增加 auth-user-pass

时间: 2024-10-07 05:50:11

OpenVPN部署手记的相关文章

Openvpn 部署

OpenVPN 简介 OpenVPN是一款开源的企业级VPN,功能强大,数据全程加密.无论是电脑或手机都能轻松连接企业网络,实现远程办公. Google Authenticator  是一款动态口令生成器,在登录VPN的时候,使用密码+动态口令的方式可以进一步加强VPN登录的安全系数. OpenVPN有两种网络连接模式,一种为本地代理.另一种为全局代理.使用本地代理连接VPN之后,只在访问企业内网资源的时候走VPN的网络流量,在访问互联网时依旧与无VPN连接状态一样,流量不再经过VPN. 全局代

CentOS 6.8 上OpenVPN部署和使用

OpenVPN生产环境中实战部署及客户端使用 OpenVPN环境部署 1.环境需求 设备 IP 个人PC,VPN客户端 eth0:192.168.119.0/24 OpenVPN Server eth0:192.168.239.167:eth1:192.168.119.83 局域网服务器 eth0:192.168.239.165 实现需求 在远端通过VPN客户端对VPN Server后端多个servers直接访问,管理维护 2.查看系统环境 [[email protected] ~]# cat 

openvpn部署

原文发表于cu:2016-03-29 参考文档: 安装:http://qicheng0211.blog.51cto.com/3958621/1575273 安装:http://www.ipython.me/centos/centos6-5-build-install-openvpn.html 安装:http://my.oschina.net/deepblue/blog/532014?fromerr=DV0DExXF#OSC_h3_15 配置文件详解:http://www.360doc.com/c

Openvpn部署实施方案

OpenVPN简介 VPN直译就是虚拟专用通道,是提供给企业之间或者个人与公司之间安全数据传输的隧道,OpenVPN无疑是Linux下开源VPN的先锋,提供了良好的性能和友好的用户GUI.[ OpenVPN允许参与建立VPN的单点使用共享金钥,电子证书,或者用户名/密码来进行身份验证.它大量使用了OpenSSL加密库中的SSLv3 /TLSv1 协议函式库.OpenVPN能在Solaris.Linux.OpenBSD.FreeBSD.NetBSD.Mac OS X与Windows 上运行,并包含

openvpn部署之基于证书认证

environment: New in version 1.0 OS:CentOS6.6 64 bit os Internal IP:172.16.77.173 OpenVPN version:openvpn-2.3.8-1.el6.x86_64 1.Preparing Openvpn for Installation #Disable selinuxsetenforce 0sed -i '/^SELINUX=/c\SELINUX=disabled' /etc/selinux/config # 

openvpn部署之部署基于AD域认证

1.添加yum源 #epel repo installtion yum -y install epel-release 2.安装openvpn yum install openvpn -y yum -y install openssl openssl-devel -y  yum -y install lzo lzo-devel  -y  yum install -y libgcrypt libgpg-error libgcrypt-devel 3.安装openvpn认证插件 yum instal

openvpn部署账号密码登录

1.开启服务器端路由转发功能: 修改配置文件/etc/sysctl.conf中 net.ipv4.ip_forward = 0 改为 net.ipv4.ip_forward = 1 [[email protected] ~]# sysctl -p #重读配置文件 2.设置nat转发; iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERAD #转发内网192.168.1.0网段地址到eth0出口,MASQUERAD

linux openvpn 部署

openvpn提供两种类型的虚拟网络接口:TUN和TAP,tun用于建立IP隧道,tap用于建立以太网桥,这两种模式我们也称为路由模式和网桥模式. TAP 等同于一个以太网设备,它操作第二层数据包如以太网数据帧.TUN模拟了网络层设备,操作第三层数据包比如IP数据封包. 参考http://blog.csdn.net/guoliquan1/article/details/4851332 一. Lzo库的编译安装: 登录http://www.oberhumer.com/opensource/lzo/

OpenVPN学习笔记——部署安装

上一篇介绍了OpenVPN部署前的环境准备,下面开始具体的部署安装. mkdir -p /opt/tools cd /opt/tools/ wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz yum install openssl openssl-devel gcc -y # 因为openvpn依赖于openssl,所以这里需要安装openssl和openssl-devel [[email protected