一、openVPN工作原理

VPN技术通过密钥交换、封装、认证、加密手段在公共网络上建立起私密的隧道,保障传输数据的完整性、私密性和有效性。OpenVPN是近年来新出现的开放源码项目,实现了SSLVPN的一种解决方案。传统SSL VPN通过端口代理的方法实现,代理服务器根据应用协议的类型(如http,telnet等)做相应的端口代理,客户端与代理服务器之间建立SSL安全连接,客户端与应用服务器之间的所有数据传输通过代理服务器转发。这种实现方式烦琐,应用范围也比较窄:仅适用于用TCP固定端口进行通信的应用系统,且对每个需要代理的端口进行单独配置;对于每个需要用到动态端口的协议都必须重新开发,且在代理中解析应用协议才能实现代理,如FTP协议;不能对TCP以外的其它网络通信协议进行代理;代理服务器前端的防火墙也要根据代理端口的配置变化进行相应调整。

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

1.1 虚拟网卡

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

1.2 地址池以及路由

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

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

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

1.4 数据包处理

1.4.1 发送数据流程

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

1.4.2 接收数据流程

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

1.5 数据包的封装

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

1.6 openVPN和OpenSSL

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

二、openVPN安装部署

2.1 安装openVPN软件包

lzo提供了一种数据加密的算法,这里openvpn会用到lzo算法,所以要安装lzo

#安装lzo

cd /usr/local/src
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.04.tar.gz
tar xf lzo-2.04.tar.gz 
cd lzo-2.04
./configure --prefix=/usr/local/lzo
echo $?
make && make install

#安装openVPN

 yum -y install openssl-develecho 
 tar xf openvpn-2.1.4.tar.gz 
 cd openvpn-2.1.4
 ./configure --prefix=/usr/local/openvpn --with-lzo-headers=/usr/local/lzo/include/ --with-lzo-lib=/usr/local/lzo/lib/ --with-ssl-headers=/usr/include/openssl/ --with-ssl-lib=/usr/lib
 make && make install

2.2 openvpn 设置

2.2.1 用easy-rsa生成服务器证书客户端证书

[root@linux-node1 ~]# mkdir /etc/openvpn
[root@linux-node1 ~]# cp /usr/local/src/openvpn-2.1.4/easy-rsa/ /etc/openvpn/ -r
[root@linux-node1 ~]# cd /etc/openvpn/easy-rsa/2.0
[root@linux-node1 2.0]#  cat vars |grep -v '^$'|grep -v '^#'
export EASY_RSA="`pwd`"
export OPENSSL="openssl"
export PKCS11TOOL="pkcs11-tool"
export GREP="grep"
export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
export KEY_DIR="$EASY_RSA/keys"
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
export PKCS11_MODULE_PATH="dummy"
export PKCS11_PIN="dummy"
export KEY_SIZE=1024
export CA_EXPIRE=3650
export KEY_EXPIRE=3650
export KEY_COUNTRY="CN"
export KEY_PROVINCE="SC"
export KEY_CITY="YB"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="zhangyang1@afocus.com.cn"

[root@linux-node1 2.0]# source ./vars

2.2.2 清空证书

[root@linux-node1 2.0]# ./clean-all

注意:这个命令在第一次安装时可以运行,以后在添加客户端时千万别运行,这个命令 会清除所有已经生成的证书密钥。

2.3 建立根证书

[root@linux-node1 2.0]# ./build-ca 
Generating a 1024 bit RSA private key
.................................................++++++
....++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]:
State or Province Name (full name) [SC]:
Locality Name (eg, city) [YB]:
Organization Name (eg, company) [AFOCUS]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [AFOCUS CA]:
Name []:
Email Address [zhangyang1@afocus.com.cn]:

2.4 生成服务器密钥key,后面这个server-name就是服务器名,可以定义

[root@linux-node1 2.0]# ./build-key-server server
Generating a 1024 bit RSA private key
.............................++++++
.........................++++++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]:
State or Province Name (full name) [SC]:
Locality Name (eg, city) [YB]:
Organization Name (eg, company) [AFOCUS]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [server]:
Name []:
Email Address [zhangyang1@afocus.com.cn]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'CN'
stateOrProvinceName   :PRINTABLE:'SC'
localityName          :PRINTABLE:'YB'
organizationName      :PRINTABLE:'AFOCUS'
commonName            :PRINTABLE:'server'
emailAddress          :IA5STRING:'zhangyang1@afocus.com.cn'
Certificate is to be certified until Jul 15 16:54:10 2027 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

2.5 生成客户端key

[root@linux-node1 2.0]# ./build-key client1
Generating a 1024 bit RSA private key
.....++++++
...............................................................................++++++
writing new private key to 'client1.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]:
State or Province Name (full name) [SC]:
Locality Name (eg, city) [YB]:
Organization Name (eg, company) [AFOCUS]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [client1]:
Name []:
Email Address [zhangyang1@afocus.com.cn]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:  
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'CN'
stateOrProvinceName   :PRINTABLE:'SC'
localityName          :PRINTABLE:'YB'
organizationName      :PRINTABLE:'AFOCUS'
commonName            :PRINTABLE:'client1'
emailAddress          :IA5STRING:'zhangyang1@afocus.com.cn'
Certificate is to be certified until Jul 15 16:54:54 2027 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

注意:在进入 Common Name (eg, your name or your server's hostname) []: 的输入时, 每个证书输入的名字必须不同.

2.6 生成Diffie Hellman 参数,加强安全

[root@linux-node1 2.0]# ./build-dh 
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
..........................................................................+.
[root@linux-node1 2.0]# /usr/local/openvpn/sbin/openvpn --genkey --secret ta.key  ##生成ta.key,防止ddos攻击,client和server同时存储

2.7 创建服务端配置文件

[root@linux-node1 2.0]#  mkdir /etc/openvpn/easy-rsa/2.0/conf
[root@linux-node1 2.0]#  mkdir /etc/openvpn/easy-rsa/2.0/conf
[root@linux-node1 2.0]# cp /usr/local/src/openvpn-2.1.4/sample-config-files/server.conf /etc/openvpn/easy-rsa/2.0/conf/
[root@linux-node1 2.0]# cat /etc/openvpn/easy-rsa/2.0/conf/server.conf |grep -v '^$'|grep -v '^;'|grep -v '^#'
local 0.0.0.0
port 1194
proto tcp
dev tun
ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert /etc/openvpn/easy-rsa/2.0/keys/server.crt
key /etc/openvpn/easy-rsa/2.0/keys/server.key  # This file should be kept secret
dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 172.168.1.0  255.255.255.0" 
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log         openvpn.log
verb 3

2.8 启动openVPN

[root@linux-node1 conf]# /usr/local/openvpn/sbin/openvpn --config /etc/openvpn/easy-rsa/2.0/conf/server.conf &
[1] 17403

2.9 打开路由转发功能

# vim /etc/sysctl.conf
修改以下内容:
net.ipv4.ip_forward = 1

2.9 生效及配置iptables转发规则

sysctl -p
iptables -I INPUT -p tcp --dport 1194 -m comment --comment "openvpn" -j ACCEPT
iptables -I INPUT -p udp --dport 1194 -m comment --comment "openvpn" -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j MASQUERADE
/etc/init.d/iptables save

三、windows测试openVPN

3.1 安装客户端

#下载地址

http://swupdate.openvpn.org/community/releases/openvpn-2.2.2-install.exe   ##windows
http://swupdate.openvpn.org/community/releases/openvpn-2.2.2.tar.gz          ##linux or mac

3.2 将服务器上的/etc/openvpn/easy-rsa/2.0/keys下的文件拷贝到C:\Program Files\OpenVPN\config

拷贝文件:

client1.crt  clinet1.key  ca.crt   ta.key  dh1024.pem client.ovpn

3.3 在windows7客户端上将C:\Program Files\OpenVPN\sample-config拷贝到C:\Program Files\OpenVPN\config下

3.4 编辑client.ovpn 修改如下

remote 外网IP 1194
proto tcp
user nobody
group nobody
cert client1.crt
key client1.key

3.5 运行client.ovpn测试是否可以ping通10.8.0.1,,也就是服务器的tun接口IP。

C:\Users\Administrator>ping -t 10.8.0.1

正在 Ping 10.8.0.1 具有 32 字节的数据:
来自 10.8.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 10.8.0.1 的回复: 字节=32 时间=1ms TTL=64
来自 10.8.0.1 的回复: 字节=32 时间=1ms TTL=64
来自 10.8.0.1 的回复: 字节=32 时间=1ms TTL=64
来自 10.8.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 10.8.0.1 的回复: 字节=32 时间=1ms TTL=64
来自 10.8.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 10.8.0.1 的回复: 字节=32 时间=1ms TTL=64
来自 10.8.0.1 的回复: 字节=32 时间=1ms TTL=64
来自 10.8.0.1 的回复: 字节=32 时间=1ms TTL=64
来自 10.8.0.1 的回复: 字节=32 时间<1ms TTL=64

10.8.0.1 的 Ping 统计信息:
    数据包: 已发送 = 11,已接收 = 11,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 1ms,平均 = 0ms

四、后期维护

4.1、如果后期重新添加key的话

source vars
./build-key

4.2、后期客户端的吊销

source vars
./revoke-full xiaowang   #-->会生成crl.pem文件

检查keys/index.txt,发现被吊销的用户前面有个R
怎么使吊销的生效呢,就是在server.conf里面加上 #crl-verify /etc/openvpn/keys/crl.pem,然后重启openvpn服务生效。

CentOS 部署openVPN的更多相关文章

  1. [svc]centos6上部署openvpn+gg二步认证

    最近又发现个新的vpn: wireguard 为了满足员工在家办公的需求.需要 openvpn+gg方案 在centos6上部署openvpn 参考 1.安装前准备 wget -O /etc/yum. ...

  2. CentOS下OpenVPN实现公网IP映射到内网(iptables转发功能)(转)

    说明:这种方案的实现前提是必须要有一台拥有公网IP的电脑,OpenVPN搭建过程很普通,关键技术在于iptables的转发.搭建教程可能有点旧了,可以只看iptables的关键点技术. 方案背景: 公 ...

  3. 跳过 centos部署 webpy的各种坑

    用centos部署webpy发现的各种坑: 1.python 版本: 2.中文编码: 3.web模块路径: 在命令行里输入python,能import web,但是网站错误报告一直报告没有找到web模 ...

  4. CentOS下OpenVPN客户端配置

    CentOS下OpenVPN客户端配置 http://liumissyou.blog.51cto.com/4828343/1762683 1,安装 yum install openvpn -y mkd ...

  5. 【Linux】Centos部署MySQL

    将CentOS部署MySQL需要本地配置环境.本地编译MySQL,耗时较长的情况,优化为编译成型MySQL并打包,推送并按配置部署. 首先需要在一台机器配置好环境,搭个YUM源,并将所需要的包取出备用 ...

  6. Tigase XMPP Server在CentOS部署和配置

    Tigase XMPP Server在CentOS部署与配置 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 以下讲述Tigase XMPP Server ...

  7. SpringBoot入门教程(二)CentOS部署SpringBoot项目从0到1

    在之前的博文<详解intellij idea搭建SpringBoot>介绍了idea搭建SpringBoot的详细过程, 并在<CentOS安装Tomcat>中介绍了Tomca ...

  8. CentOS搭建OpenVPN以及WIN&Android&iOS的安装连接

    OpenVPNhttp://info.swufe.edu.cn/vpn/openvpn/#2 苹果.安卓智能手机openvpn的设置_百度经验https://jingyan.baidu.com/art ...

  9. 为什么使用centos部署服务器

    这个是实验室同学面试的时候,面试官问的一个问题? 为什么选择centos系统,为什么centos系统用的比较多呢? 首先我们说下redhat红帽公司,它是全球最大的linux服务提供商,它的服务是最好 ...

随机推荐

  1. 关于HashMap初始化容量问题

    使用阿里云代码规范插件扫描后出现以下提示: hashmap should set a size when initalizing,即hashmap应该在初始化时设置一个大小 在网上搜到一篇讲解(htt ...

  2. oracle 使用occi方式 批量插入多条数据

    if (vecInfo.empty()) { ; //数据为空,不上传,不上传标志设置为1,只有0表示上传成功 } std::string strUserName = userName; std::s ...

  3. jquery插件-table转Json数据插件

    使 用开源插件Table-to-json: 官方地址:http://lightswitch05.github.io/table-to-json/ 功能说明:将js对象table转换成javascrip ...

  4. Datatable添加数据,提示该行已经属于另一个表的解决方法

    一.DataTable.Rows.Add(DataRow.ItemArray); 二.DataTable.ImportRow(DataRow) 三.设置DataTable的tablename,然后.R ...

  5. 树莓派安装centos 7系统

    1,格式化 https://www.sdcard.org/downloads/formatter_4/eula_windows/ 2,烧录,Win32DiskImager https://source ...

  6. Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion

    本篇太乱,请移步: Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 写了删删了写,反复几次,对自己的描述很不 ...

  7. 【BZOJ】1500: [NOI2005]维修数列(splay+变态题)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1500 模板不打熟你确定考场上调试得出来? 首先有非常多的坑点...我遇到的第一个就是,如何pushu ...

  8. 【BZOJ】1096: [ZJOI2007]仓库建设(dp+斜率优化)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1096 首先得到dp方程(我竟然自己都每推出了QAQ)$$d[i]=min\{d[j]+cost(j+ ...

  9. 隐马尔可夫树(HMT模型)

    HMT(Hidden Markov Tree)隐马尔可夫树 [论文] 小波变换与HMT模型的图像插值算法-郭昌-中山大学学报(自然科学版)

  10. python之简单的get和post请求

    1.json 模块提供了一种很简单的方式来编码和解码JSON数据. 其中两个主要的函数是 json.dumps() 和 json.loads() , 要比其他序列化函数库如pickle的接口少得多. ...