openvpn 详解与搭建

作者: print("") 分类: linux 发布时间: 2017-05-17 13:29

4、1 VPN介绍
4.1.1概述:
VPN(全称virtual Private Network)虚拟专用网络。是依靠ISP和其他NSP,在公共网络中建立专用的数据通信网络的技术、可以为企业之间或者个人企业之间提供安全的数据传输隧道服务、在VPN中任意两点之间的连接并没有传统专网提供的端到端的物理连接链路,
二十利用公共网络资源动态组成的、可以理解为通过私有的隧道技术在公共数据网络上模拟出来的和专网有同样功能的点到点的专项技术、所谓虚拟是指不需要去拉十几的长途物理线路、而是借用Internt 网络实现
在众多VPN的产品中、openvpn无疑是linux开源VPN的先锋、它提供了良好的性能和友好的GUI
Openvpn是一个用于创建虚拟专用网络加密通道的软件包、最早由James Yonan编写、
Openvpn 允许参与建立VPN的单点使用预设的私钥、第三方证书或者用户名/密码来进行身份验证。它大量使用了openssl加密库。以及SSLV3/TLSV1 协议。Openvpn能在linux、xBSD、MAC oS X与windows 2000/xp 上运行、它并不是一个基于WEB的VPN软件,也不是与ipsec及其他VPN软件包兼容
openVPN 使用TLS加密是通过使用公开秘钥(非对称秘钥、加密解密使用不同的key,一个称为public key ,另一个是private key)对数据进行加密的。对与TLS传输的工作原理、这里暂且先不做介绍、对于openvpn使用TLS mode、首先 Server和Client要有相同CA签发的证书、双方通过交换证书验证双方的合法性以决定是否建立VPN连接、然后使用对方CA把自己目前使用的数据加密方法(类似于秘钥)加密后发送给对方、由于使用对方CA加密的、所以只对对方CA对应的private key 次啊能解密该字符串、保证了此秘钥的安全性、并且秘钥定期改变、对于窃听者来说,可能还没有破解该字符串、通信双方已经更改了秘钥了
openvpn 提供了多种身份验证方式、用于确定参与连接双方的身份,包括:预享私钥。第三方证书以及用户名/密码组合。预享秘钥最为简单、但是同时它只能用于建立点对点的VPN;基于PKI的第三方证书提供了最完善的功能,但是需要额外的精力去维护一个PKI证书体系,openvpn2.0 后引入了用户名/口令组合的身份证验证方式、它可以省略客户端证书、但是仍需要一份服务器证书需要被用作加密。
Openvpn 所有的通信都基于一个单一的IP端口、默认且推荐使用UDP协议通信、同时TCP也被支持、OpenVPn连接能通过大多数的代理服务器、并且能够在NAT的环境中很好的工作、服务端具有向客户端“推送”某些网络配置信息的功能、这些信息包括:IP地址
、路由设置等、OpenVPn提供两种虚拟网络接口:通用Tun/Tap驱动、通过他们可以建立三层IP隧道。或者虚拟二层以太网,后者可以传送任何类型的二层以太网数据、传送的数据可通过LZO算法压缩。IANA (internet Assigned Numbers Authority)指定给Openvpn 的官方端口为1194 。openVPn 2.0 以后版本每个进程可以同事管理数个并发隧道。
Openvpn 使用通用网络协议(TCP与UDP)的特点使它成为Ipsec等协议的理想替代品、尤其是ISP(Internet service provider)过滤某些特点VPN协议的情况下。
在选择协议的时候、需要注意2个加密隧道之间的网络状况、如有搞延迟或丢包较多的情况下、选择TCP协议作为底层协议、UDP协议由于存在无连接或重传机制、导致要隧道上层的协议进行重传。效率非常地下
 
4.2.1 openvpn 通信原理
OpenVpn的技术核心是虚拟网卡,其次是SSL协议实现,由于SSL协议在其它的词条中介绍的比较清楚了,这里重点对虚拟网卡及其在OpenVpn的中的工作机理进行介绍:[1] 虚拟网卡是使用网络底层编程技术实现的一个驱动软件,安装后在主机上多出现一个网卡,可以像其它网卡一样进行配置。服务程序可以在应用层打开虚拟网卡,如果应用软件(如IE)向虚拟网卡发送数据,则服务程序可以读取到该数据,如果服务程序写合适的数据到虚拟网卡,应用软件也可以接收得到。虚拟网卡在很多的操作系统下都有相应的实现,这也是OpenVpn能够跨平台一个很重要的理由。[1] 在OpenVpn中,如果用户访问一个远程的虚拟地址(属于虚拟网卡配用的地址系列,区别于真实地址),则操作系统会通过路由机制将数据包(TUN模式)或数据帧(TAP模式)发送到虚拟网卡上,服务程序接收该数据并进行相应的处理后,通过SOCKET从外网上发送出去,远程服务程序通过SOCKET从外网上接收数据,并进行相应的处理后,发送给虚拟网卡,则应用软件可以接收到,完成了一个单向传输的过程,反之亦然。[1] 生产环境实战部署
4.2.1 环境需求

设备/项目 Ip
笔记本或PC(adsl上网) 192.168.236.1
IDC机房内部局域网的服务器 120.14.15.125 (IDC 服务器外网网卡) 192.168.236.10 (内网网卡)
实现需求 在远程通过VPN客户端对vpnserver后端多个server直接访问。管理维护

4.2.2 查看linux系统环境
[root@liang ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@liang ~]# uname -r
2.6.32-642.13.1.el6.x86_64
[root@liang ~]# uname -m
x86_64
4.4.3 配置VPN服务器时间同步
手工执行如下命令
[root@mysql1 ~]# ntpdate pool.ntp.org
 
3.修改iptables规则:
设置nat转发:
注:保证VPN地址池可路由出外网
# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
设置VPN内网机器不需要设置网关及路由 设置VPN的地址可以访问内网机器
#iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT –to-source 192.168.236.160
4.设置openvpn端口通过:
# iptables -A INPUT -p TCP –dport 22 -j ACCEPT
# iptables -A INPUT -p TCP –dport 80 -j ACCEPT
# iptables -A INPUT -p TCP –dport 3306 -j ACCEPT
# iptables -A INPUT -p TCP –dport 1194 -j ACCEPT
# iptables -A INPUT -p TCP –dport 7505 -j ACCEPT
# iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
# service iptables save
二、安装依赖库
# yum install -y openssl openssl-devel lzo lzo-devel pam pam-devel automake pkgconfig
下载openvpn (需要翻墙)
#cd /tools
wget https://swupdate.openvpn.org/community/releases/openvpn-2.4.2.tar.gz ./configure –prefix=/usr/local/openvpn
make && make install
# mkdir -p /etc/openvpn
cp -Rf sample /etc/openvpn/
复制openvpn配置文件到主目录:
# cp /etc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/
四、1.下载easy-rsa:
注:该包用来制作ca证书,服务端证书,客户端证书,openvpn2.3.0该版本源码不包含easy-rsa,所以需要单独下载安装用来配合openvpn实现证书生成。
# cd /tools
# wget  https://github.com/OpenVPN/easy-rsa/archive/master.zip
# unzip master #yum -y install unzip
# cp -Rf /tools/easy-rsa-master /etc/openvpn/easy-rsa
# cd /etc/openvpn/easy-rsa/easyrsa3 #这里是easyrsa3版本,网上很多帖子都说是2.0,但是同一个下载方法显示的是3版本,所以这里就按照3版本的方式进行演示记录。
—————————–
以下操作都在此目录下面(pwd:/etc/openvpn/easy-rsa/easyrsa3/)
—————————–
2.编辑vars文件,根据自己环境配置
复制vars.example 为vars
cp vars.example vars
修改下面字段,命令:vi vars,然后修改,最后wq保存
set_var EASYRSA_REQ_COUNTRY “CN” #根据自己情况更改
set_var EASYRSA_REQ_PROVINCE “BeiJingShi”
set_var EASYRSA_REQ_CITY “BeiJing”
set_var EASYRSA_REQ_ORG “My_ORG”
set_var EASYRSA_REQ_EMAIL “qingbo.song@apicloud.com”
set_var EASYRSA_REQ_OU “APICloud_OpenVPN”
3./etc/openvpn/easy-rsa/easyrsa3/目录初始化:
#./easyrsa init-pki
==================================
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /usr/local/src/easy-rsa-master/easyrsa3/pki
==================================
4.创建根证书
# ./easyrsa build-ca
====================================================
Note: using Easy-RSA configuration from: ./vars
Generating a 2048 bit RSA private key
…………………………………+++
…………………………….+++
writing new private key to ‘/etc/openvpn/easy-rsa/easyrsa3/pki/private/ca.key’
Enter PEM pass phrase:  liang
Verifying – Enter PEM pass phrase: liang –此密码是为了进行证书签名
—–
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.
—–
Common Name (eg: your user, host, or server name) [Easy-RSA CA]: liang
 
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt
====================================================
注意:在上述部分需要输入PEM密码 PEM pass phrase,输入两次,此密码必须记住,不然以后不能为证书签名。还需要输入common name 通用名,这个你自己随便设置个独一无二的。
5.创建服务器端证书
# ./easyrsa gen-req server nopass
====================================================
Note: using Easy-RSA configuration from: ./vars
Generating a 2048 bit RSA private key
…………….+++
……………………………….+++
writing new private key to ‘/etc/openvpn/easy-rsa/easyrsa3/pki/private/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.
—–
Common Name (eg: your user, host, or server name) [server]:admin  –此名称随意但是不要跟之前的根证书的一样
 
Keypair and certificate request completed. Your files are:
req: /etc/openvpn/easy-rsa/easyrsa3/pki/reqs/server.req
key: /etc/openvpn/easy-rsa/easyrsa3/pki/private/server.key
====================================================
签约服务端证书:(将创建的服务端证书与CA证书签约)
# ./easyrsa sign server server
===================================================
Note: using Easy-RSA configuration from: ./vars
 
You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
 
Request subject, to be signed as a server certificate for 3650 days:
 
subject=
commonName                = admin
 
 
Type the word ‘yes’ to continue, or any other input to abort.
Confirm request details: yes  –需要输入yes进行确定
Using configuration from /etc/openvpn/easy-rsa/easyrsa3/openssl-1.0.cnf
Enter pass phrase for /etc/openvpn/easy-rsa/easyrsa3/pki/private/ca.key: –需要输入CA证书密码apicloud
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
commonName            :PRINTABLE:’admin’
Certificate is to be certified until Mar 25 07:45:43 2025 GMT (3650 days)
 
Write out database with 1 new entries
Data Base Updated
 
Certificate created at: /etc/openvpn/easy-rsa/easyrsa3/pki/issued/server.crt
================================================================
创建Diffie-Hellman,确保key穿越不安全网络的命令:
# ./easyrsa gen-dh
================================================
Note: using Easy-RSA configuration from: ./vars
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
…………….+……………………………..+……………………………..+…
DH parameters of size 2048 created at /etc/openvpn/easy-rsa/easyrsa3/pki/dh.pem
================================================
6.创建客户端证书 (pwd:/root/client/easy-rsa/easyrsa3)
进入root目录新建client文件夹,文件夹可随意命名,然后拷贝前面解压得到的easy-ras文件夹到client文件夹,进入下列目录
# cd /root/
# mkdir client
# cp -Rf /usr/local/src/easy-rsa-master /root/client/easy-rsa
# cd /root/client/easy-rsa/easyrsa3/
A:初始化目录:
# ./easyrsa init-pki
==============================
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /root/client/easy-rsa/easyrsa3/pki
==============================
B:创建客户端key及生成证书(客户端密码)
# ./easyrsa gen-req qingbo #名字自己定义
========================================
Generating a 2048 bit RSA private key
…………………………………….+++
……+++
writing new private key to ‘/root/client/easy-rsa/easyrsa3/pki/private/qingbo.key’
Enter PEM pass phrase: –客户端证书密码qingbo 这个可以随意的。但是你需要记住
Verifying – Enter PEM pass phrase:
—–
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.
—–
Common Name (eg: your user, host, or server name) [qingbo]:qingbo –客户端证书名称
 
Keypair and certificate request completed. Your files are:
req: /root/client/easy-rsa/easyrsa3/pki/reqs/qingbo.req
key: /root/client/easy-rsa/easyrsa3/pki/private/qingbo.key
========================================
C:将的到的qingbo.req导入然后签约证书
=======================
进入到/etc/openvpn/easy-rsa/easyrsa3/
cd /etc/openvpn/easy-rsa/easyrsa3/
导入req
./easyrsa import-req /root/client/easy-rsa/easyrsa3/pki/reqs/qingbo.req qingbo
特别提醒:这里如果上面用的是 cp –R 就需要用。如果是cp –Rf 就不需要的
————————————
Note: using Easy-RSA configuration from: ./vars
The request has been successfully imported with a short name of: qingbo
You may now use this name to perform signing operations on this request.
————————————
签约证书
./easyrsa sign client qingbo  #这里生成client所以必须为client:qingbo要与之前导入名字一致
====================================
首先输入YES :记得看清楚提示
上面签约证书跟server类似,期间需要输入CA的密码
================================
五、openvpn服务配置及启动
1.复制模板文件到/etc/openvpn/ (该步骤在源码编译的时候已操作如果没有操作的话需要操作操作一下)
# cp /usr/share/doc/openvpn-2.3.6/sample/sample-config-files/server.conf /etc/openvpn/
2.修改server.conf
=====================================
local 192.168.236.160  (这里修改为自己的VPS)
port 1194
proto udp
dev tun
ca /etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt
cert /etc/openvpn/easy-rsa/easyrsa3/pki/issued/server.crt
key /etc/openvpn/easy-rsa/easyrsa3/pki/private/server.key
dh /etc/openvpn/easy-rsa/easyrsa3/pki/dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push “redirect-gateway def1 bypass-dhcp”
push “dhcp-option DNS 202.101.224.68”
keepalive 10 120
comp-lzo
max-clients 10
persist-key
persist-tun
status openvpn-status.log
log         /usr/local/openvpn/log/openvpn.log
log-append  /usr/local/openvpn/log/openvpn-status.log
verb 3
================================
3.启动openvpn服务
# /usr/local/openvpn/sbin/openvpn –config /etc/openvpn/server.conf &
4.开机启动
# echo “/usr/local/openvpn/sbin/openvpn –config /etc/openvpn/server.conf > /dev/null 2>&1 &” >> /etc/rc.local
 
报错:(怎么办?)
======================================
Sat Mar 28 17:39:45 2015 OpenVPN 2.3.6 x86_64-unknown-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [MH] [IPv6] built on Mar 28 2015
Sat Mar 28 17:39:45 2015 library versions: OpenSSL 1.0.1e-fips 11 Feb 2013, LZO 2.03
Sat Mar 28 17:39:45 2015 Diffie-Hellman initialized with 2048 bit key
Sat Mar 28 17:39:45 2015 Socket Buffers: R=[229376->131072] S=[229376->131072]
Sat Mar 28 17:39:45 2015 TCP/UDP: Socket bind failed on local address [AF_INET]119.255.41.233:1194: Cannot assign requested address
Sat Mar 28 17:39:45 2015 Exiting due to fatal error
======================================
客户端配置:
一、安装WINDOWS客户端(WIN7 64bit)
1.下载客户端,安装路径D:\Program Files (x86)\OpenVPN
# http://vpntech.googlecode.com/files/openvpn-2.1.1-gui-1.0.3-install-cn-64bit.zip
2.将服务器端生成的客户端证书文件(ca.crt、qingbo.crt、qingbo.key)复制到客户端D:\Program Files\OpenVPN\config下.
三个文件是/root/client/下面的哦
3.在D:\Program Files\OpenVPN\config下创建client.ovpn文件
编译内容:
==========================
client
dev tun
proto udp
remote 192.168.236.160 1194 #主要这里修改成自己vps ip
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt #这里需要证书
cert qingbo.crt
key qingbo.key
comp-lzo
verb 3
二、启动客户端配置测试
如果连接成功了服务端也会有显示的
报错:==================================
Options error: –dh fails with ‘/etc/opensvn/dh.pem’: No such file or directory
Options error: –ca fails with ‘/etc/opensvn/ca.crt’: No such file or directory
Options error: –cert fails with ‘/etc/opensvn/server.crt’: No such file or directory
Options error: –key fails with ‘/etc/opensvn/server.key’: No such file or directory
Options error: –status fails with ‘/usr/local/opensvn/log/openvpn-status.log’: No such file or directory
=================================
 
 
参考:                                        建立CA证书
  https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/vpntech/openvpn-2.1.1-gui-1.0.3-install-cn-64bit.zip

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

说点什么

avatar
  Subscribe  
提醒