文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>使用OPENVPN实现各机房的互通

使用OPENVPN实现各机房的互通

时间:2007-03-04  来源:hcs



使用OPENVPN实现各机房的互通

CODE:

目       录

使用OPENVPN实现各机房的互通        1
1        现状        2
2        网络结构        2
3        服务器信息以及网络安全        4
3.1        服务器信息        4
3.2        网络安全        4
4        使用openvpn实现南北互通        5
4.1        Openvpn简介        5
4.2        下载        5
4.3        安装        6
4.4        你的操作系统支持tun吗?        6
4.5        配置C/S结构的VPN网络        7
4.5.1        如何生成ca和cert/key?        7
4.5.1.1        产生MASTER Certificate Authority(CA) 的公钥(certificate)和私钥(key)        7
4.5.1.2        创建server端的cert和key文件        8
4.5.1.3        创建3个client端cert和key文件        9
4.5.1.4        建立 Diffie Hellman文件        9
4.5.1.5        所有文件的列表及使用的主机        9
4.5.2        OpenVPN Server端的配置        10
4.5.3        OpenVPN Client端的配置        12
4.5.4        运行OpenVPN        14
5        其它配置        15
5.1        让多个client的子网间互通        15
5.2        控制运行中的openvpn进程        15
5.3        windows下的配置:        15
6        实际应用情况        16
7        参考文档        17 1        现状
假设现在的某公司的服务器存放在广州、河北、杭州三个机房中,每个机房使用不用的子网:

CODE:

机房        子网(内部)
广州        10.1.0.0/16
河北        10.2.0.0/16
杭州        10.3.0.0/16 各机房使用不同的网段,为使用vpn连接创造了有利条件。

由于电信至网通间的网络速度是否缓慢,对广州与河北机房间的数据同步带来非常大的困难。我们找到一台即连接了网通的线路,又连接了电信线路的服务器,但却不能直接用其作为路由。如果使用porxy的方式或转发的方式又会降低同步的效率。
采用C/S结构的vpn方式,即解决了同步的问题,又不会影响同步的效率。

2        网络结构
下图是三个机房实现互连互通后的拓扑图:
(由于是发到论坛的关系,请看贴子最后的图)

从上图可以看到,该VPN系统是一个C/S的结构。中间为VPN SERVER;广州、河北、杭州三个机房各取出一台服务器作为VPN CLIENT。

VPN SERVER拥有两块网卡和两条线路(电信和网通),两个网卡均需要设置公网IP。根据实际的情况设置路由,这里我是设置电信的线路为默认路由,设置到河北机房网段的走网通的路由。

VPN CLIENT可以有两块网卡也可以只用一块网卡,如果是电信的线路则连接vpn server的电信的IP;如果是网通的线路则连接网通的vpn server 的网通方面的IP。

3        服务器信息以及网络安全
3.1        服务器信息
在本文中我们使用了4台服务器分别作为vpn server和client。由于使用vpn传输数据对服务器的负载不大,所以除了vpn server需要一台新的服务器外,各机房的client服务器只需要找一台负载轻的服务器来担当即可。

本文使用的四台服务器的详细信息:

CODE:
]
机房        Vpn 模式        操作系统        服务器IP
        Vpn server        RedHat 9.0        公网IP1  (网通)
公网IP2(电信)
广州机房        Vpn client        FreeBSD4.9        10.1.0.1
河北机房        Vpn client        RedHat9.0        10.2.0.1
杭州机房        Vpn client        FreeBsd4.9        10.3.0.1 3.2        网络安全
除vpn server外,其它的机房中的vpn client均无需公网IP,所以vpn server需要加强安全方面的设置。
该服务器是RedHat9.0的操作系统,登陆界面使用的是grub,并设置的grub密码,保证物理上的安全。
使用Iptables设置包过滤防火墙,只允许你的服务器对其进行访问:

QUOTE:
iptables –F
iptables -A INPUT -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -s YOURNETWORK -j ACCEPT
iptables -A INPUT -p udp --dport 1194 –j DROP 4        使用openvpn实现南北互通
4.1        Openvpn简介
OpenVPN 是一个强大、高度可配置、基于ssl的 VPN (Virtual Private Network)Open Source 软件。它具有多种的验证方式以及许多强大的功能。

OpenVPN工作在OSI模型的第2或第3层,使用SSL/TLS协议进行网络传输。支持多种客户认证方法,如证书、smart cards,加上用户名密码的证书认证等。除此以外,还有强大的ACL功能限制客户的信息交换。

        OpenVPN可以运行在多种操作系统中,包括:
        Linux, Windows 2000/XP and higher, OpenBSD, FreeBSD, NetBSD, Mac OS X, and Solaris.

        使用OpenVpn,可以实现:
●        使用特定udp或tcp端口实现两台主机的之间的vpn连接。
●        实现C/S结构,实现多台client通过server服务器互连互通。
●        通过TLS/SSL加密保证数据传输的安全。
●        通过数据的压缩,提高数据传输的速度。

(由于其它功能在本文中并不需要使用,如想要详细了解请访问http://openvpn.net)
       
4.2        下载

从以下网址下载最新版本的openvpn source包。
http://nchc.dl.sourceforge.net/sourceforge/openvpn/openvpn-2.0_rc16.tar.gz

由于openvpn需要使用数据压缩,所以还需要安装lzo包:
http://www.oberhumer.com/opensource/lzo/download/lzo-1.08.tar.gz

4.3        安装
Linux:

CODE:
软件        编译安装
Lzo        ./configure          Make && make install

Openvpn        ./configure -prefix=/opt/openvpn   Make && make install FreeBSD:

CODE:

Lzo        ./configure         Make && make install

Openvpn        ./configure -prefix=/opt/openvpn --with-lzo-headers=/usr/local/include --with-lzo-headers=/usr/local/include        Make && make install 参照上面的安装方法分别在linux和freebsd主机上安装好openvpn。

4.4        你的操作系统支持tun吗?
从我安装过的操作系统看,RedHat9.0和FreeBSD4.9的内核默认已经支持TUN,并且已经安装tun模块。RedHat AS3则没有该模块,需要重新编译内核支持。

加载tun模块:
●Linux 2.4 or higher (with integrated TUN/TAP driver):
  (1)  make device node:         mknod /dev/net/tun c 10 200
  (2a) add to /etc/modules.conf: alias char-major-10-200 tun
  (2b) load driver:              modprobe tun
  (3)  enable routing:           echo 1 >; /proc/sys/net/ipv4/ip_forward       

●FreeBSD 4.1.1+:
kldload if_tap

4.5        配置C/S结构的VPN网络
4.5.1        如何生成ca和cert/key?

CODE:

Ca        certificate
authority(认证授权),所有的server和client均使用同一个ca文件。
cert        certificate(证书)。公钥,每一个server和client各自独立生成的公钥。
key        私钥,每一个server和client工作独立生成的私钥。 ◎        server端只需要知道它自己的cert和key。它不需要知道每一个可以连接到它的client的cert。
◎        server端接受的client必须拥有以server的CA产生的cert。server能使用它自己的CA私钥来确认client的cert中是否带有其CA的记号。

4.5.1.1        产生MASTER Certificate Authority(CA) 的公钥(certificate)和私钥(key)
#######
In this section we will generate a master CA certificate/key, a server certificate/key, and certificates/keys for 3 separate clients
#######

在本节,我们会尝试建立一对master CA的cert和key,一对server端的cert和key,和3个不同client的年的cert和keys。

UNIX:
在openvpn的源码中可以找到easy-rsa文件夹。

cd easy-rsa
. ./vars        建立环境变量
./clean-all        清除以前的
./build-ca        建立CA

最后一个命令会调用openssl来创建CA的公钥和私钥:

CODE:
[Copy to clipboard]
Country Name (2 letter code) [KG]:
State or Province Name (full name) [NA]:
Locality Name (eg, city) [BISHKEK]:
Organization Name (eg, company) [OpenVPN-TEST]:yourcorp       在此输入公司名
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:hbroute 在此输入主机名或随便输一个名字
Email Address [[email protected]]:

其它的按默认即可。 完成后会在keys目录中创建ca.crt  ca.key  index.txt  serial四个文件。

4.5.1.2        创建server端的cert和key文件

cd easy-rsa
./build-key-server server

CODE:
[Copy to clipboard]
Country Name (2 letter code) [KG]:
State or Province Name (full name) [NA]:
Locality Name (eg, city) [BISHKEK]:
Organization Name (eg, company) [OpenVPN-TEST]:yourcorp                输入公司名
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:hbrouteserver  输入主机名或随便一个名字
Email Address [[email protected]]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Sign the certificate? [y/n]:y                        输入y

1 out of 1 certificate requests certified, commit? [y/n]y         输入y
Write out database with 1 new entries
Data Base Updated
其它的按回车。 4.5.1.3        创建3个client端cert和key文件
与创建server端的非常相似.

./build-key gz
./build-key hb
./build-key hz

注意gz、hb和hz不能一样,否则两个相同名字的client只能有一个能连接进来。
如果想使用带密码的client key,可以使用build-key-pass脚本。

如建立广州的:

CODE:
[Copy to clipboard]
./build-key gz
Country Name (2 letter code) [KG]:
State or Province Name (full name) [NA]:
Locality Name (eg, city) [BISHKEK]:
Organization Name (eg, company) [OpenVPN-TEST]:mycorp
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:gz         键入"gz"
Email Address [[email protected]]:

Certificate is to be certified until Mar 14 08:15:16 2015 GMT (3650 days)
Sign the certificate? [y/n]:y                        键入“y”

1 out of 1 certificate requests certified, commit? [y/n]y     键入“y”
Write out database with 1 new entries
Data Base Updated 4.5.1.4        建立 Diffie Hellman文件
Diffie Hellman参数必须要在openvpn server中使用。

./build-dh

4.5.1.5        所有文件的列表及使用的主机

CODE:
[Copy to clipboard]
Filename         Needed By         Purpose         Secret
ca.crt         server + all clients         Root CA certificate         NO
ca.key         key signing machine only         Root CA key        YES
Dh{n}.pem         server only         Diffie Hellman parameters         NO
server.crt         server only         Server Certificate         NO
server.key         server only         Server Key         YES
gz.crt         广州 only         gz Certificate         NO
Gz.key         广州 only         gz Key         YES
hcrt         河北 only         hb Certificate         NO
hb.key         河北 only         hb Key         YES
hz.crt         杭州 only         hz Certificate         NO
hz.key         杭州 only         hz Key         YES 根据上表,将所有的文件拷贝到需要这些文件的主机上。

4.5.2        OpenVPN Server端的配置
刚安装完openvpn的时候,/opt/openvpn目录下只有sbin和man两个文件夹,为方便起见,我们可以在该目录下建立其它的文件夹。

CODE:
[Copy to clipboard]
目录名        作用
Sbin        放置openvpn的主程序“openvpn”
Conf        放置配置文件
Ccd        放置各client的独立配置文件
Log        放置server的日志文件
Keys        放置认证文件
Man        放置man文档 配置文件:./conf/server.conf

CODE:
[Copy to clipboard]
port 1194
proto udp
dev tun
ca /opt/openvpn/keys/ca.crt
cert /opt/openvpn/keys/server.crt
key /opt/openvpn/keys/server.key
dh /opt/openvpn/keys/dh1024.pem
server 10.99.0.0 255.255.255.0
ifconfig-pool-persist /opt/openvpn/log/ipp.txt
client-config-dir ccd
route 10.1.0.0 255.255.0.0
route 10.2.0.0 255.255.0.0
route 10.3.0 255.255.0.0
push "route 10.10.0 255.255.0.0"
push "route 10.2.0.0 255.255.0.0"
push "route 10.3.0.0 255.255.0.0"
client-to-client
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status /opt/openvpn/log/openvpn-status.log
log /opt/openvpn/log/openvpn.log
verb 6
mute 20
writepid /opt/openvpn/log/server.pid Client的自定义配置:./ccd/

CODE:
[Copy to clipboard]
gz:
iroute 10.1.0.0 255.255.0.0

hz:
iroute 10.3.0.0 255.255.0.0

hb:
iroute 10.2.0.0 255.255.0.0 配置文件解释:

CODE:
[Copy to clipboard]
;local a,b,c,d                listen的IP
port 1194                listen的端口
proto udp                使用UDP协议
dev tun                        使用tunnel的模块

ca ca.crt                公钥(s端和c端使用相同的ca)
cert server.crt                server的公钥
key server.key                server的私钥(要保管好)(s端和c端使用各自的cert和key)
dh dh1024.pem                产生方法:openssl dhparam -out dh1024.pem 1024

server 10.99.0.0 255.255.255.0        设置为server模式,并指定子网的IP段,server端默认会设为.1的地址。
ifconfig-pool-persist ipp.txt        当vpn断开或重启后,可以利用该文件重新建立相同IP地址的连接。
push "route 10.1.0.0 255.255.0.0" 让client端建立到另一个子网的路由。

client-to-client        让不同的client之间可以互相“看到”。
;max-clients 100        最多的client数量。

keepalive 10 120        每10秒ping一次,如果120秒没有回应则认为对方已经down。

user nobody
group nobody                指定运行openvpn的用户和组。(减少危险)。

persist-key
persist-tun

status openvpn-status.log        每分钟记录一次连接的状态。

log openvpn.log                将log记录到指定文件中

verb 3                        设置日志要记录的级别。
                        0只记录错误信息。
                        4能记录普通的信息。
                        5和6在连接出现问题时能帮助调试
                        9是极端的,所有信息都会显示,甚至连包头等信息都显示(像tcpdump)

mute 20                        相同信息的数量,如果连续出现20条相同的信息,将不记录到日志中。 4.5.3        OpenVPN Client端的配置

CODE:
[Copy to clipboard]
目录名        作用
Sbin        放置openvpn的主程序“openvpn”
Conf        放置配置文件
Keys        放置认证文件
Man        放置man文档 配置文件:./conf/client.conf
广州:

CODE:
[Copy to clipboard]
Client
dev tun
proto udp
remote VPNSERVERIP11194
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca /opt/openvpn/keys/ca.crt
cert /opt/openvpn/keys/gz.crt
key /opt/openvpn/keys/gz.key
comp-lzo
verb 3
mute 20 杭州:

CODE:
[Copy to clipboard]
client
dev tun
proto udp
remote VPNSERVERIP1 1194
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca /opt/openvpn/keys/ca.crt
cert /opt/openvpn/keys/hz.crt
key /opt/openvpn/keys/hz.key
comp-lzo
verb 3
mute 20 河北:

CODE:
[Copy to clipboard]
client
dev tun
proto udp
remote VPNSERVERIP2 1194
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca /opt/openvpn/keys/ca.crt
cert /opt/openvpn/keys/hb.crt
key /opt/openvpn/keys/hb.key
comp-lzo
verb 3
mute 20 4.5.4        运行OpenVPN
建立脚本:
        Server端:

CODE:
[Copy to clipboard]
#!/bin/sh
OPENVPN=/opt/openvpn/sbin/openvpn
CFG=/opt/openvpn/conf/server.conf
PID=`cat /opt/openvpn/log/server.pid`
case "$1" in
start)
$OPENVPN --config $CFG &
;;
stop)
kill $PID
;;
restart)
kill $PID
sleep 5
$OPENVPN --config $CFG &
;;
*)
echo "Usage: `basename $0` {start|stop|restart}"
;;
esac Client端

CODE:
[Copy to clipboard]
#!/bin/sh
/opt/openvpn/sbin/openvpn --config /opt/openvpn/conf/client.conf & 5        其它配置5.1        让多个client的子网间互通
●client-config-dir ccd
添加一个ccd的文件夹,里面的文件名为client的名字(如gz,hb)。当一个新client连接到server上时,程序会检查ccd文件夹,看 是否有一个文件的名字与client的名字一致。如果有,进程会读该文件里面的指令并将这些指令应用于该名字的client。

●在ccd文件夹中创建一个文件hz,该文件中包括:
iroute 10.3.0.0 255.255.0.0                  这会告诉hz client,不要在本机添加10.3.0.0网段(因为杭州本来就是10.23/16网段)。

●在server的配置文件中加入:
route 10.3.0.0 255.255.0.0

如果想两个client可以互通,请在server的配置文件中加入:
client-to-client
push "route 10.3.0.0 255.255.0.0"

记得在各子网内的机器上设置路由(如果server和client机器不是作为默认网关的话)。

5.2        控制运行中的openvpn进程
在配置文件中加入writepid参数指定pid文件。
SIGUSR1--以非root的身份重启openvpn进程。
SIGHUP--重启
SIGUSR2--输出连接统计到log文件
SIGTERM,SIGINT--exit。

5.3        windows下的配置:
windows版本的openvpn下载地址:
http://nchc.dl.sourceforge.net/sourceforge/openvpn/openvpn-2.0_rc17-install.exe

安装方法很简单,和其它windows下的软件无异。
我安装到c:\program file\openvpn下。
在config中建立配置文件win.ovpn

CODE:
[Copy to clipboard]
Client
dev tun
proto udp
remote VPNSERVER1 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ../keys/ca.crt
cert ../keys/win.crt
key ../keys/win.key
comp-lzo
verb 3
mute 20 从server中生成ca.crt ,win.crt,win.key文件并拷贝到windows上。生成文件的方法请参考章节5.5.1.3。
在命令行运行:
openvpn --config win.ovpn

如果要将openvpn做成服务,运行:
openvpnsev.exe -install
这样就可以在服务中找到openvpn服务了。
当openvpn作为服务时,会到config文件夹寻找ovpn后缀的配置文件。生成的日志会放在log文件夹中。

6        实际应用情况

从实际应用的情况看,VPN采用的加密的方式并没有影响到数据传输的速度,从流量图中可以看出,流量最大可以达到14Mbits/s(电信的线路只有10Mbits/s)。

见图2。

7        参考文档
OpenVPN Howto(2.0)  http://openvpn.net/howto.html
OpenVPN Install  http://openvpn.net/install.html
OpenVPN Install(Win32)   http://openvpn.net/INSTALL-win32.html
OpenVPN Man Pages http://openvpn.net/man.html
OpenVPN FAQ  http://openvpn.net/faq.html

图片附件: openvpn-网络图.jpg (2005-9-26 15:30, 22.33 K)

screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('openimg.php?img=attachments/openvpn-______.jpg');}" onmousewheel="return imgzoom(this);" border="0">


图片附件: openvpn-流量图.JPG (2005-9-26 15:30, 47.02 K)

screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('openimg.php?img=attachments/openvpn_________28851127719837.jpg');}" onmousewheel="return imgzoom(this);" border="0">


相关阅读 更多 +
排行榜 更多 +
平衡球球

平衡球球

休闲益智 下载
平衡球球游戏

平衡球球游戏

休闲益智 下载
土耳其方块消除游戏

土耳其方块消除游戏

休闲益智 下载