共计 5072 个字符,预计需要花费 13 分钟才能阅读完成。
OpenVPN 是一个用于创建虚拟专用网络加密通道的软件包,实现二 / 三层的基于隧道的 VPN。最早由 James Yonan 编写。OpenVPN 允许创建的 VPN 使用公开密钥、数字证书、或者用户名 / 密码来进行身份验证。它大量使用了 OpenSSL 加密库中的 SSLv3/TLSv1 协议函数库。
目前 OpenVPN 能在 Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X 与 Windows 2000/XP/Vista/Windows 7 以及 Android 上运行,并包含了许多安全性的功能。它并不是一个基于 Web 的 VPN 软件,也不与 IPsec 及其他 VPN 软件包兼容。
一、协议原理
OpenVpn 的技术核心是虚拟网卡,其次是 SSL 协议实现,这里重点对虚拟网卡及其在 OpenVpn 的中的工作机理进行介绍。
虚拟网卡是使用网络底层编程技术实现的一个驱动软件,安装后在主机上多出现一个网卡,可以像其它网卡一样进行配置。服务程序可以在应用层打开虚拟网卡,如果应用软件(如 IE)向虚拟网卡发送数据,则服务程序可以读取到该数据,如果服务程序写合适的数据到虚拟网卡,应用软件也可以接收得到。虚拟网卡在很多的操作系统下都有相应的实现,这也是 OpenVpn 能够跨平台一个很重要的理由。
在 OpenVpn 中,如果用户访问一个远程的虚拟地址(属于虚拟网卡配用的地址系列,区别于真实地址),则操作系统会通过路由机制将数据包(TUN 模式)或数据帧(TAP 模式)发送到虚拟网卡上,服务程序接收该数据并进行相应的处理后,通过 SOCKET 从外网上发提交去,远程服务程序通过 SOCKET 从外网上接收数据,并进行相应的处理后,发送给虚拟网卡,则应用软件可以接收到,完成了一个单向传输的过程,反之亦然。
二、测试环境
环境:CentOS release 6.4 (Final) i386
协议:OpenVPN
端口:OpenVPN/TCP/1194(服务端), 1194 为默认可修改;
加密:使用 OpenSSL 库来加密数据与控制信息,能够使用任何 OpenSSL 支持的算法。
认证:支持多种认证方式,包括预享私钥、第三方证书、用户名/密码组合;
服务:openvpn
软件包:
1、openvpn-2.3.2.tar.gz
openvpn 主程序,服务器和客户端均采用此包编译安装,不同的是两者证书及配置文件,其他环境一致。
2、easy-rsa-2.2.2.tar.gz
This is a small RSA key management package,based on the openssl command line tool, thatcan be found in the easy-rsa subdirectory of the OpenVPN distribution. ——RSA 证书生成管理软件
3、pam CentOS6x/RHEL6x 自带无需安装,yum 更新便可
PAM (Pluggable Authentication Modules)是由 Sun 提出的一种认证机制。它通过提供一些动态链接库和一套统一的 API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序。PAM 最初是集成在 Solaris 中,目前已移植到其它系统中,如 Linux、SunOS、HP-UX 9.0 等。
4、lzo (可 yum 安装)
The OpenVPN RPM package requires the LZO library for real-time link compression. ——用于实时数据压缩
5、openssl (系统自带,可 yum 更新)
SSL,Security Socket Layer, 是一个安全传输协议,在 Internet 网上进行数据保护和身份确认。OpenSSL 是一个开放源代码的实现了 SSL 及相关加密技术的软件包,由加拿大的 Eric Yang 等发起编写。
软件 下载:
http://swupdate.openvpn.org/community/releases/openvpn-2.3.2.tar.gz
https://codeload.github.com/OpenVPN/easy-rsa/tar.gz/2.2.2
http://swupdate.openvpn.org/community/releases/openvpn-install-2.3.2-I003-i686.exe
三、编译安装
注:服务器端环境和客户端环境是一样的,只是配置文件不同而已一个是 server.conf 另一个是 client.conf,另外证书文件也是不同的。
3.1. 安装依赖包
# yum -y install pam pam-devel
# yum -y install openssl openssl-devel
# yum -y install lzo lzo-devel
3.2. 编译 openvpn
# tar xf openvpn-2.3.2.tar.gz
# cd openvpn-2.3.2
# ./configure –prefix=/usr/local/openvpn
# make && make install
# echo $?
目录规划(可自定义)
# mkdir /usr/local/openvpn/conf #配置文件位置,如 server.conf
# mkdir /usr/local/openvpn/keys #证书文件位置
四、证书生成
4.1. 环境配置
# tar xf easy-rsa-2.2.2.tar.gz
# cd easy-rsa-2.2.2
# cp -R easy-rsa/ /usr/local/openvpn/
# cd /etc/openvpn/easy-rsa/2.0
# vi vars #设置变量
export KEY_COUNTRY=”CN”#(国家)
export KEY_PROVINCE=”HeNan”#(省份)
export KEY_CITY=”ZhengZhou”#(城市)
export KEY_ORG=”itnul.com”#(组织)
export KEY_EMAIL=”contact@itnul.com”#(邮件地址)
export KEY_OU=”itnul.com”#(单位)
注:其他不作修改,默认便可
# source ./vars #使变量生效
# ./clean-all #初始化 keys 目录,创建所需要的文件和目录
# ln -s openssl-1.0.0.cnf openssl.cnf #做 SSL 配置文件软链:
上面是初始化工作,以后在进行证书制作工作时,仍旧需要进行初始化,但只需要进入 openvpn\easy-rsa 目录,运行 vars 就可以了,不需要上面那些步骤了。
4.2 证书生成
# ./build-ca #生成 ROOT CA 证书,用于签发 Server 和 Client 证书(ca.key ca.crt)
# ./build-dh #生成公开密钥算法(dirrie-hellman)文件(dh2048.pem)
# ./build-key-server server #生成服务器证书和密钥(server.key server.crt server.csr 01.pem)
# ./build-key client #生成客户端证书和密钥(client.key client.crt client.csr 02.pem)
注:生成服务器和客户端证书时提示输入额外属性,此处可不填!
Please enter the following‘extra’attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
4.3. 拷贝证书到相应位置
# cd /usr/local/openvpn/easy-rsa/2.0/keys
# cp -f dh2048.pem ca.crt server.crt server.key /usr/local/openvpn/keys #(服务器端)
# cp -f ca.crt client.crt client.key /usr/local/openvpn/keys #(客户端)
五、配置文件
# cd /tmp/penvpn-2.3.2/sample/sample-config-files
# cp server.conf /usr/local/openvpn/conf/server.conf #(服务器端)
# cp client.conf /usr/local/openvpn/conf/client.conf #(客户端)
5.1.server.conf(仅供参考)
# vi /usr/local/openvpn/conf/server.conf
local 192.168.1.180
port 1194
proto tcp
dev tun
ca /usr/local/openvpn/keys/ca.crt
cert /usr/local/openvpn/keys/server.crt
key /usr/local/openvpn/keys/server.key
dh /usr/local/openvpn/keys/dh2048.pem
server 10.1.10.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push“route 10.100.0.0 255.255.0.0″ #本地内网
route 10.200.0.0 255.255.0.0 #远程内网
push“dhcp-option DNS 8.8.8.8″
push“dhcp-option DNS 8.8.4.4″
client-to-client
comp-lzo
log-append /var/log/openvpn.log
verb 4
5.2.client.conf(仅供参考)
# vi /usr/local/openvpn/conf/client.conf
client
dev tun
proto tcp
remote 192.168.1.180 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca /usr/local/openvpn/keys/ca.crt
cert /usr/local/openvpn/keys/client.crt
key /usr/local/openvpn/keys/client.key
comp-lzo
verb 4
5.3. 配置文件详细分析
OpenVPN:server.conf 与 client.conf 配置解析 ——IT 零起步
http://blog.itnul.com/archives/218.html
六、连接测试
6.1 开启 IP 转发功能
# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl –p
6.2 时间同步
# ntpdate pool.ntp.org #时间同步,server 和 client 时间必须一致
6.3 开放端口
# iptables -I INPUT -p tcp –dport 1194 -j ACCEPT #服务器开放 1194 端口
6.4 启动 openvpn
以后台运行模式启动 openvpn
/usr/local/openvpn/sbin/openvpn –config /usr/local/openvpn/conf/server.conf >/var/log/openvpn.log 2>&1 & #服务器端命令
/usr/local/openvpn/sbin/openvpn –config /usr/local/openvpn/conf/client.conf >/var/log/openvpn.log 2>&1 & #客户端命令
七、参考链接
配置文档:
http://zh.wikipedia.org/wiki/OpenVPN
http://openvpn.ustc.edu.cn/
http://openvpn.se/
https://github.com/OpenVPN/easy-rsa/releases
http://openvpn.net/index.php/download/community-downloads.html
http://openvpn.net/index.php/access-server/overview.html
http://www.cnblogs.com/agostop/archive/2012/11/14/2770121.html
http://hi.baidu.com/reyleon/item/c48e981857d51612e3f9866d
