使用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 現狀
假設現在的某公司的服務器存放在廣州、河北、杭州三個機房中,每個機房使用不用的子網:
代碼:
機房 子網(內部)
廣州 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服務器只需要找一台負載輕的服務器來擔當即可。
本文使用的四台服務器的詳細信息:
代碼:
機房 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設置包過濾防火牆,只允許你的服務器對其進行訪問:
代碼:
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:
代碼:
軟件 編譯安裝
Lzo ./configure Make && make install
Openvpn ./configure -prefix=/opt/openvpn Make && make install
FreeBSD:
代碼:
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: echo "alias char-major-10-200 tun" >> /etc/modules.conf
(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?
代碼:
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的公鑰和私鑰:
代碼:
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
代碼:
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腳本。
如建立廣州的:
代碼:
./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 所有文件的列表及使用的主機
代碼:
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兩個文件夾,為方便起見,我們可以在該目錄下建立其它的文件夾。
代碼:
目錄名 作用
Sbin 放置openvpn的主程序“openvpn”
Conf 放置配置文件
Ccd 放置各client的獨立配置文件
Log 放置server的日志文件
Keys 放置認證文件
Man 放置man文檔
配置文件:./conf/server.conf
代碼:
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/
代碼:
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
配置文件解釋:
代碼:
;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端的配置
代碼:
目錄名 作用
Sbin 放置openvpn的主程序“openvpn”
Conf 放置配置文件
Keys 放置認證文件
Man 放置man文檔
配置文件:./conf/client.conf
廣州:
代碼:
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
杭州:
代碼:
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
河北:
代碼:
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端:
代碼:
#!/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` {startstoprestart}"
;;
esac
Client端
代碼:
#!/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
代碼:
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補充:BY yazjiyao/yzjboy
如果用openvpn-2.0_rc16.tar.gz在configure的時候遇到下如錯誤,我們用rpm包安裝,
configure: checking for OpenSSL SSL Library and Header files...
checking openssl/ssl.h usability... no
checking openssl/ssl.h presence... no
checking for openssl/ssl.h... no
configure: error: OpenSSL SSL headers not found.
第一步:下載用所需的rpm包:
openssl-0.9.6g-1.i386.rpm(其他版本不可以)
openssl-devel-0.9.6g-1.i386.rpm (其他版本不可以)
lzo-1.08-3.i386.rpm
openvpn-2.0.2-1.i386.rpm
第二步:安裝低版本的openssl包,在linux 9系統是openssl-0.9.7a-2.i386.rpm和openssl-devel-0.9.7a-2.i386.rpm (不要刪除啊,不然系統會出錯嚴重點可能系統都無法啟動),那麼我們就通過rpm 的--force參數來安裝低版的openssl
rpm -ivh --force openssl-0.9.6g-1.i386.rpm
rpm -ivh --force openssl-devel-0.9.6g-1.i386.rpm
第三步:四個rpm安裝完畢後,把client.conf或server.conf放在/etc/openvpn/目錄下就行了,其他配置跟上面差不多,這裡就不再說明了。
第四步:然後,/etc/rc.d/init.d/openvpn stsartstoprestart 成功!