1 基本概念
1.1 什么是VPN?
VPN,英文全称为Virtual Private Network,中文翻译为虚拟专用网,指的是依靠ISP(Internet Server Provider,Internet服务提供商)或其它NSP(Network Server Provider,网络服务提供商),通过公用网络建立专用的数据通信网络的技术。在VPN中,任意两个节点之间的连接并没有传统专用网所需的端到端的物理链路,而是利用某种公用网的资源动态组成的。IETF草案理解基于IP的VPN为:"使用 IP机制仿真出一个私有的广域网"是通过私有的隧道技术在公共数据网络上仿真一条点到点的专线技术。所谓虚拟,是指用户不再需要拥有实际的长途数据线路,而是使用Internet公用数据网络的长途数据线路。所谓专用网络,是指用户可以为自己制定一个最符合自己需求的网络。一句话,VPN的核心就是利用公共网络建立虚拟私有网。
1.2 什么是OpenVPN?
官方OpenVPN 2_0 HOWTO称:OpenVPN is a full-featured SSL VPN which implements OSI layer 2 or 3 secure network extension using the industry standard SSL/TLS protocol, supports flexible client authentication methods based on certificates, smart cards, and/or username/password credentials, and allows user or group-specific access control policies using firewall rules applied to the VPN virtual interface. OpenVPN is not a web application proxy and does not operate through a web browser.用中文表述就是:OpenVPN 是一个具备完全特征的SSL VPN解决方案,能够进行大范围的配置操作,包括远程访问、站点-站点间VPN、WiFi安全及企业级远程访问解决方案,支持负载均衡,错误恢复及细粒度的访问控制。OpenVPN通过使用工业标准SSL/TLS协议 实现了OSI 2层及3层安全网络扩展,支持灵活的基于证书、智能卡的客户端认证方法,允许通过在VPN虚拟接口上应用防火墙规则实现用户及组访问控制策略。OpenVPN并非一个Web应用代理,也不能通过Web浏览器进行操作。OpenVPN 能够运行于Linux、Windows 2000/XP及更高版本、OpenBSD、FreeBSD、NetBSD、Mac OS X及Solaris平台。
简单的说,OpenVPN 是一个强大、高度可配置的 VPN系统守护程序,它能够在 Internet 网上用作安全地连接两个或者更多的私用网络。
要想获得更多的关于OpenVPN的介绍,请参考:http://www.sozz.cn/00183/55173.htm(中文HOWTO),http://openvpn.net/(英文HOWTO)。
1.3 什么是TLS和SSL?
SSL (Secure Socket Layer):安全套接字协议层是Internet上领先的安全协议软件,它是由Netscape公司开发的主要用于WEB的安全传输协议。SSL 协议指定了一种在应用程序协议(如 HTTP 、 Telenet 、 NMTP 和 FTP 等)和 TCP/IP 协议之间提供数据安全性分层的机制,它为 TCP/IP 连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证。当SSL会话开始后,WEB浏览器将公共密钥发送给WEB服务器,这样服务器可以很安全地将私人密钥发送给浏览器。浏览器和服务器在会话期间,用私人密钥加密数据。这种协议在WEB上获得了广泛的应用。SSL可能与由IETF提出的协议和验证方法并入名为TLS (Transport LayerSecurity)的新协议。
TLS (Transport Layer Security): IETF(www.ietf.org)将SSL作了标准化,即RFC2246,并将其称为TLS。
有关SSL VPN的介绍,请参考:http://www.stcore.com/html/2005/1018/8984.html。到Google上搜索一下,很多的东西可用。
2 构建VPN
本文主要是参考ELM关于OpenVPN的文章,结合自己的实际情况,增加了许多自己遇到的问题和解决方法。因为是以一个初学者的身份来学习OpenVPN,所以在具体问题的描述上可能会细致一些。ELM的原文请参照其OpenVPN的专题文章:http://elm.blog.edu.cn/user1/4123/index.shtml
2.1 实践1
环境介绍:
Server: RedHat 9.0 Client: Windows XP sp2。本人用的主机为Windows XP sp2,在上面安装了VMWARE虚 拟平台,采取桥接方式安装了RedHat 9.0。Win的IP为192.168.1.106,RedHat 9.0的eth0的IP指定为静态192.168.1.100。想要建设的VPN的IP为
说明:OpenVPN+CA,基于TLS加密方式,使用CA验证VPN Client的身份。
由于OpenVPN需要lzo的支持,所以需要安装lzo。关于OpenVPN和lzo的下载就不多说,从ChinaUnix的下载频道 http://download.chinaunix.net/上面很容易得到。我选用的版本是openvpn-
首先,建立目录。
#pwd
/home/lqm
#mkdir openvpn
#cd openvpn
#mkdir setup
这样把下载的压缩包openvpn-
#pwd
/home/lqm/openvpn
#tar xvzf ./setup/openvpn-
#tar xvzf ./setup/lzo-2.02.tar.gz
#cd lzo-2.02
#./configure
#make
#make install
#cd ../ openvpn-
#./configure --prefix=/etc/openvpn
#make
#make install
这样比较顺利的完成了openvpn的安装工作,目标文件夹为/etc/openvpn。在下面生成了两个文件夹man和sbin。为了以后方便,建立几个文件夹。
#cd /etc/openvpn
#mkdir conf keys log
#cp -r /home/lqm/openvpn/openvpn-
说明:sbin 放置openvpn的可执行文件openvpn
conf 放置server的配置文件
log 放置server的日志文件
keys 放置认证文件
man 放置man文档
easy-rsa 在此目录下完成认证文件的生成,为了安全,完成server配置后要全部移到另一台电脑上保护。
(1)修改变量
#cd /etc/openvpn/easy-rsa
#vi vars
==================================
# 定义你所在的国家,2个字符
export KEY_COUNTRY=CN
# 你所在的省份
export KEY_PROVINCE=Shandong
# 你所在的城市
export KEY_CITY=Jinan
# 你所在的组织
export KEY_ORG="Liu OpenVPN ORG"
# 你的邮件地址
export KEY_EMAIL=piaoxiangxinling@sina.com
==================================
其他部分不必改,然后让vars生效,并且初始化keys目录。
#. vars(注意:这里是“点+空格+vars”)
#./clean-all
#ls keys
(2)生成ROOT CA,用于签发Server和Client证书。
#./build-ca
在这里,因为已经修改过vars的默认值,只需要回车默认即可,只是Common Name得写,而且一般不要重复。在这里我定义为OpenVPN ROOTCA。这时keys文件夹内生成了四个文件:ca.crt ca.key index.txt serial,可以用ls命令查看。
(3)生成dh1024.pem文件,Server使用TLS必须使用的一个文件。
#./build-dh
(4)签发server的CA文件
# ./build-key-server server
(5)签发client的CA文件
#./build-key client
(6)为防止恶意攻击(如DOS、UDP port flooding),我们生成一个"HMAC firewall"
# openvpn --genkey --secret keys/ta.key
(7)生成证书吊销链文件,防止日后有人丢失证书,被非法用户接入VPN
#./make-crl vpncrl.pem
在这里有个问题,就是在openvpn-
#chmod +x make-crl
#./make-crl vpncrl.pem
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf (这是运行成功的标志)
到此为止,所有的认证文件都生成了。需要把easy-rsa的keys文件夹中的ca.crt,dh1024.pem,server.crt,server.key,ta.key,vpncrl.pem这六个文件放到openvpn下面的keys文件夹内。另外需要把ca.crt,client.crt.client.key,ta.key这四个文件传到windows下面的配置文件夹内。在这里存在着linux和windows的资源共享问题,在这里参考了网上的一些帖子,选择了下面的方案:在windows下利用软件Serv-U搭建好ftp站点,利用软件flashfxp作为ftp客户机;在linux下启用vsftpd搭建ftp服务器,默认安装ftp客户机。这样就可以利用ftp服务实现linux和windows的资源共享问题了。关于vsftpd的安装和配置,在这里就不多说了,在RedHat9下面也可能出现问题,借助于前辈的经验贴,应该不难解决了。完成转移工作后就应该把easy-rsa文件夹转到另外机器上了。
(8)server的配置
在conf文件夹内,建立server.conf,并且编辑:
#申明本机使用的IP地址,也可以不说明。
--------------------------------------------------------------------------------
;local 192.168.1.100
#申明使用的端口,默认是1194。
#这里使用的5000是UDP默认的端口。
port 5000
#申明使用的协议,默认使用UDP,如果使用HTTP proxy,必须使用TCP协议。
;proto tcp
proto udp
#申明使用的设备可选tap和tun,tap是二层设备,支持链路层协议。
#tun是ip层的点对点协议,限制稍微多一些。
;dev tap
dev tun
#OpenVPN使用的ROOT CA,使用build-ca生成的,用于验证客户是证书是否合法。
ca /etc/openvpn/keys/ca.crt
#Server使用的证书文件。
cert /etc/openvpn/keys/server.crt
#Server使用的证书对应的key,注意文件的权限,防止被盗。
key /etc/openvpn/keys/server.key
#CRL文件的申明,被吊销的证书链,这些证书将无法登录。
crl-verify /etc/openvpn/keys/vpncrl.pem
#生成的Diffie-Hellman文件
dh /etc/openvpn/keys/dh1024.pem
#这条命令等效于:
# mode server #OpenVPN工作在Server模式,可以支持多client同时动态接入
# tls-server #使用TLS加密传输,本端为Server,Client端为tls-client
# if dev tun: #如果使用tun设备,等效于以下配置
# ifconfig
# ifconfig-pool
# route
# if client-to-client: #如果使用client-to-client这个选项
# push "route
# else
# push "route
#省略了子网掩码和下一跳地址,分别为: 255.255.255.255
#
# if dev tap: #如果使用tap设备,则等效于以下命令
# ifconfig
# ifconfig-pool
# push "route-gateway
server
#用于记录某个Client获得的IP地址,
#防止openvpn重新启动后“忘记”Client曾经使用过的IP地址
ifconfig-pool-persist /etc/openvpn/log/ipp.txt
#Bridge状态下类似DHCPD的配置,为客户分配地址,由于这里工作在路由模式,所以不使用
;server-bridge
#通过VPN Server往Client push路由,client通过pull指令获得Server push的所有选项并应用
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
#VPN启动后,在VPN Server上增加的路由,VPN停止后自动删除
;route
#使Client的默认网关指向VPN,让Client的所有Traffic都通过VPN走
;push "redirect-gateway"
#DHCP的一些选项,具体查看Manual
;push "dhcp-option DNS
;push "dhcp-option WINS
#如果可以让VPN Client之间相互访问直接通过openvpn程序转发,
#不用发送到tun或者tap设备后重新转发,优化Client to Client的访问效率
client-to-client
#如果Client使用的CA的Common Name有重复了,或者说客户都使用相同的CA
#和keys连接VPN,一定要打开这个选项,否则只允许一个人连接VPN
;duplicate-cn
#NAT后面使用VPN,如果VPN长时间不通信,NAT Session可能会失效,
#导致VPN连接丢失,为防止之类事情的发生,keepalive提供一个类似于ping的机制,
#下面表示每10秒通过VPN的Control通道ping对方,如果连续120秒无法ping通,
#认为连接丢失,并重新启动VPN,重新连接
#(对于mode server模式下的openvpn不会重新连接)。
keepalive 10 120
#上面提到的HMAC防火墙,防止DOS攻击,对于所有的控制信息,都使用HMAC signature,
#没有HMAC signature的控制信息不予处理,注意server端后面的数字肯定使用0,client使用1
tls-auth /etc/openvpn/keys/ta.key 0 # This file is secret
#对数据进行压缩,注意Server和Client一致
comp-lzo
#定义最大连接数
;max-clients 100
#定义运行openvpn的用户
user nobody
group nobody
#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
persist-key
#通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的,
#否则网络连接会先linkdown然后linkup
persist-tun
#定期把openvpn的一些状态信息写到文件中,以便自己写程序计费或者进行其他操作
status /etc/openvpn/log/openvpn-status.log
#记录日志,每次重新启动openvpn后删除原有的log信息
log /etc/openvpn/log/openvpn.log
#和log一致,每次重新启动openvpn后保留原有的log信息,新信息追加到文件最后
;log-append openvpn.log
#相当于debug level,具体查看manual
verb 3
mute 20
#记录openvpn的进程PID号
writepid /etc/openvpn/log/server.pid