一 概念相关


1、*** 介绍

*** 虚拟专用网络,是依靠isp和其他的nsp,在公共网络中建立专用的数据通信网络的技术。在***中任意两点之间的链接并没有传统的专网所需的端到端的物理链路,而是利用公共网络资源动态组成的,可以理解为通过私有的隧道技术在公共数据网络上模拟出来的和专网有相同功能的点到点的专线技术,所谓虚拟是指不需要去拉实际的长途物理线路,而是借用公共的Internet网络实现。


2、*** 作用

***可以帮助公司用的远程用户(出差,家里)公司的分之机构、商业合作伙伴及供应商等公司和自己的公司内部网络之间建立可信的安全连接或者局域网连接,确保数据的加密安全传输和业务访问,对于运维工程师来说,还可以连接不同的机房为局域网,处理相关的业务流。


3、常见***功能的开源产品

pptp ***  最大优势在于无需在windows客户端单独安装***客户端软件,windows默认就支持pptp ***拨号功能。他是属于点对点的方式应用,比较适合远程企业用户拨号到企业进行办公等应用,缺点很多小区及网络设备不支持pptp导致无法访问。


SSL ×××(open***)

PPTP主要为常在外面移动或者家庭办公的用户考虑的,而Open***不但可以使用与PPTP的场景,还是和针对企业异地两地总分公司之间的***不间断按需链接,例如:ERP,OA及时通讯工具等在总分公司企业中的应用,缺点:需要单独安装客户端软件。


IPSEC ××× 

也适合针对企业异地两地中分公司或者多个IDC机房之间的×××的不间断按需链接,并且在部署使用上更简单方便。IPSEC ***的开源产品openswan.


4、open***通讯原理

open***所有的通讯都基于一个单一的ip端口(默认1194),默认使用udp协议,同时也支持tcp。open***能通过大多数的代理服务器,并且能在NAT的环境很好的工作。open***服务端具有客户端“推送”某些网络配置信息的功能,这些信息包括,ip地址,路由设置等。 OPen***提供了2个虚拟网络接口:通过TUN/Tap驱动,通过他们,可以建立三层IP隧道,或者虚拟二层以太网,后者可以传送任何类型的二层以太网数据。传送的数据可通过LZO算法压缩。open***2.0以后版本每个进程可以同时管理数个并发的隧道。


5、open***协议选择


在选择协议的时候,需要注意2个加密隧道支架你的网络状况,如果高延迟或者丢包较多的情况下,请选择TCP协议作为底层协议,UDP协议由于存在无连接和重传机制,导致隧道上层的协议进行重传,效率非常低下,这里建议用tcp协议方式。



6、open***的依赖及核心技术

open***依赖Openssl,可以使用预设的私钥,第三方证书,用户名密码等进行身份验证。

OPen***的技术核心是虚拟网卡,其次是SSL协议实现。


二 服务器端

相关软件:

lzo压缩模块,可加快传输速度。

open*** 主程序。


1、安装open***及相应包


安装环境:centos6.4 x64

1、安装lzo
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz
tar zxf lzo-2.06.tar.gz
cd lzo-2.06
./configure
make 
make install
cd ../
2、安装open***(需要先安装openssl)
yum install -y openssl* -y
#wget http://www.open***.net/release/open***-2.2.2.tar.gz
tar zxf open***-2.2.2.tar.gz
cd open***-2.2.2
./configure --with-lzo-headers=/usr/local/include --with-lzo-lib=/usr/local/lib
make
make install
cd ../


安装环境:ubuntu 12.04 x64

  1. root@jkb:~# aptitude install open***
  2. root@jkb:~# aptitude install libpam-dev libpam-mysql libmysql++-dev sasl2-bin

2、检查安装

root@jkb:~# ls /usr/share/doc/|grep open***
open*** ##发现已经存在。

3、生成证书

root@jkb:~#cd  /usr/share/doc/open***/examples/easy-rsa/2.0/ 
root@jkb:~# . ./vars    ##### 重成环境变量 以下生成的文件都在/usr/share/doc/open***/examples/easy-rsa/2.0/keys 下
root@jkb:/usr/share/doc/open***/examples/easy-rsa/2.0# ./clean-all ###用来清除之前生成的所有的key
root@jkb:/usr/share/doc/open***/examples/easy-rsa/2.0# ./build-ca  ####生成ca.crt  ca.key

4、建立给server用的certificate & key

root@jkb:/usr/share/doc/open***/examples/easy-rsa/2.0#./build-key-server server 
##“Common Name” 设成 “server”
##会产生以下文件
01.pem
server.crt
server.csr
server.key

5、建立给client用的certificate & key(可以建立多个client)

## “Common Name” 设成 “clinet1” 以此类推
root@jkb:/usr/share/doc/open***/examples/easy-rsa/2.0# ./build-key client1
##生成
client1.crt
client1.csr
client1.key
root@jkb:/usr/share/doc/open***/examples/easy-rsa/2.0#  ./build-key client2
root@jkb:/usr/share/doc/open***/examples/easy-rsa/2.0#  ./build-key client3
##当然,你也可以只生成一个client,我就是这样做的

6、建立 Diffie Hellman parameters 和 ta.key

root@jkb:/usr/share/doc/open***/examples/easy-rsa/2.0#  ./build-dh #建立 Diffie Hellman parameters 会生成dh{n}.pem。
root@jkb:/usr/share/doc/open***/examples/easy-rsa/2.0# open*** --genkey --secret ta.key  #生成ta.key,防止ddos***,client和server同时存储

7、拷贝相关文件至/etc/open***下。

root@jkb:/usr/share/doc/open***/examples/easy-rsa/2.0# mv keys/* /etc/open***/
root@jkb:/usr/share/doc/open***/examples/easy-rsa/2.0# mv ta.key /etc/open***/ #不要遗漏

8、建立配置文件/etc/open***/server.conf

local 10.0.9.10 ###本机IP,这是一个内网IP,不过在路由上已经做了IP 的映射到一个外网ip
port 1194##指定端口
proto tcp       #制定协议
dev tun        
;tls-server
ca ca.crt
cert server.crt
key server.key
tls-auth ta.key 0
dh dh1024.pem
server 10.8.0.0 255.255.255.0#拨入后的ip段及网关
ifconfig-pool-persist ipp.txt
#push “redirect-gateway”   # 自動將 client 的 default gateway 設成經由 ××× server 出去
keepalive 10 120 # 保持連線,每 10 秒 ping 一次,若是 120 秒未收到封包,即認定 client 斷線
comp-lzo        #启用压缩
max-clients 20 # 最多同時只能有十個 client
user nobody
group nogroup # *** daemon 執行時的身份(在非 Windows 平台中使用)
persist-key        #当***超时后,当重新启动***后,保持上一次使用的私钥,而不重新读取私钥。
persist-tun    #通过keepalive检测***超时后,当重新启动***后,保持tun或者tap设备自动链接状态。
status /etc/open***/easy-rsa/keys/open***-status.log #日志状态信息
log /var/log/open***.log #日志文件
verb 3    ## 日志文件冗余。
# 以下二行是將 *** server 內部的虛擬 ip 機器開放給 client 使用
push "route 10.0.1.0 255.255.255.0"
push "route 10.0.2.0 255.255.255.0"
push "route 10.0.3.0 255.255.255.0"
plugin ./open***-auth-pam.so /usr/sbin/open*** ###这个是用来mysql 认证的,如不需要可注释掉

9、开启操作系统的IP转发设置。

root@jkb:~# echo 1 > /proc/sys/net/ipv4/ip_forward
root@jkb:~# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

10、建立mysql认证文件。

root@jkb:~# vi /etc/pam.d/open***
auth sufficient pam_mysql.so user=*** passwd=***jkb host=127.0.0.1:3306 db=*** \
table=***user usercolumn=name passwdcolumn=password \
where=active=1 sqllog=0 crypt=2 verbose=1
account required pam_mysql.so user=*** passwd=***jkb host=127.0.0.1:3306 db=*** \
table=***user usercolumn=name passwdcolumn=password \
where=active=1 sqllog=0 crypt=2 verbose=1

11、创建***库、授权、建表

mysql> create database ***;##创建数据库***。
mysql> GRANT ALL ON ***.* TO ***@localhost IDENTIFIED BY ‘***jkb‘;##授权localhost上的用户***(密码***123)有对数据库***的所有操作权限。
mysql> flush privileges;##更新sql数据库的权限设置。
mysql> use ***;##使用刚创建的的***数据库。
mysql> CREATE TABLE ***user (
-> name char(20) NOT NULL,
-> password char(128) default NULL,
-> active int(10) NOT NULL DEFAULT 1,
-> PRIMARY KEY (name)
-> );
mysql> insert into ***user (name,password) values(’soai’,password(’soai’));
##命令解释:
#创建***用户,对***这个database有所有操作权限,密码为***123
#active不为1,无权使用×××

12、拷贝文件

root@jkb:~# cp /usr/lib/open***/open***-auth-pam.so /etc/open***/

13、可选配置

#client-cert-not-required #不请求客户的CA证书,使用User/Pass验证
#username-as-common-name #使用客户提供的UserName作为Common Name
#client-to-client #如果让Client之间可以相互看见,去掉本行的注释掉,否则Client之间无法相互访问
#duplicate-cn #是否允许一个User同时登录多次,去掉本行注释后可以使用同一个用户名登录多次

14、下载相关文件给客户端用

##下载下列文件
client.crt  clinet.key ca.crt    ta.key



三 客户端


1、客户端下载地址:


http://swupdate.open***.org/community/releases/open***-2.2.2-install.exe ##windows

http://swupdate.open***.org/community/releases/open***-2.2.2.tar.gz  ##linux or mac

2、创建client.o***文件

client
dev tun
proto tcp
remote  8.8.8.8 1194 #公网ip 和 端口
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1
;comp-lzo
verb 3
auth-user-pass

3、把client.o***加上之前client.crt  clinet.key ca.crt    ta.key 放入一个config文件夹,并移动至***安装的主目录

4、启动客户端,输入用户名密码即可。#用户名密码在服务器端,mysql中添加的用户密码。


四 其他

1、关于auto认证相关可参考:http://b.gkp.cc/2010/08/08/setup-open***-with-mysql-auth/


2、后期维护

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

    source vars
    ./build-key

b、后期客户端的吊销

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

检查keys/index.txt,发现被吊销的用户前面有个R

怎么使吊销的生效呢,就是在server.conf里面加上 #crl-verify /etc/open***/keys/crl.pem,然后重启open***服务生效。