OpenVPN--通過C/S結構實現多個機房間的互通

←手機掃碼閱讀     火星人 @ 2014-03-04 , reply:0

OpenVPN--通過C/S結構實現多個機房間的互通

歡迎轉載 ,但有任何修改請來信告知,不得作為商業用途
作者: JoeCen
轉載時請保持該通告

上半年為公司的南北互通工程研究實現的方式,最後決定使用openvpn來實現多個機房直接的互通。當時寫了一份很詳細的文檔,現在終於有時間發出來了。這份文檔是完全根據openvpn官方網站上的文檔以及我的實際配置寫成,在CU的VPN版是首發。希望能對大家有所啟發。

使用OPENVPN實現各機房的互通
目       錄


使用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 /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?
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) :
State or Province Name (full name) :
Locality Name (eg, city) :
Organization Name (eg, company) :yourcorp       在此輸入公司名
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:hbroute 在此輸入主機名或隨便輸一個名字
Email Address :

其它的按默認即可。


完成後會在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) :
State or Province Name (full name) :
Locality Name (eg, city) :
Organization Name (eg, company) :yourcorp                輸入公司名
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:hbrouteserver  輸入主機名或隨便一個名字
Email Address :

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

Sign the certificate? :y                        輸入y


1 out of 1 certificate requests certified, commit? 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) :
State or Province Name (full name) :
Locality Name (eg, city) :
Organization Name (eg, company) :mycorp
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:gz         鍵入"gz"
Email Address :

Certificate is to be certified until Mar 14 08:15:16 2015 GMT (3650 days)
Sign the certificate? :y                        鍵入「y」


1 out of 1 certificate requests certified, commit? 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` {start|stop|restart}"
;;
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        實際應用情況

從實際應用的情況看,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--通過C/S結構實現多個機房間的互通

vpn版的人氣真是...
《解決方案》

OpenVPN--通過C/S結構實現多個機房間的互通

建議加精!好貼。
《解決方案》

OpenVPN--通過C/S結構實現多個機房間的互通

好貼,頂..........
《解決方案》

OpenVPN--通過C/S結構實現多個機房間的互通

好貼
《解決方案》

OpenVPN--通過C/S結構實現多個機房間的互通

用OPENVPN 實現LAN-LAN的安全問題不大,CLIENT-LAN感覺不安全,不象IPSEC能切斷本地連接
《解決方案》

OpenVPN--通過C/S結構實現多個機房間的互通

原帖由 "style"]用OPENVPN 實現LAN-LAN的安全問題不大,CLIENT-LAN感覺不安全,不象IPSEC能切斷本地連接


嗯,會有什麼安全的問題呢?麻煩指教一下。

所有的連接都必須經過作為「server」的host,我認為在「server」上設置過濾就好了。
《解決方案》

OpenVPN--通過C/S結構實現多個機房間的互通

主要還是客戶端的安全問題,一旦一個客戶建立了vpn連接,但是他的計算機不夠安全,黑客可以通過這個肉雞進入vpn網路
《解決方案》

OpenVPN--通過C/S結構實現多個機房間的互通

原帖由 "style"]主要還是客戶端的安全問題,一旦一個客戶建立了vpn連接,但是他的計算機不夠安全,黑客可以通過這個肉雞進入vpn網路



如果是這樣的話,我覺得也沒有什麼太好的辦法去防止這種情況出現。
在實際應用中我們當然不會讓很多的客戶端連接進去。
server端其實等於一個路由器,如果真的要做到很安全的話,我們可以在server端上設置ACL限制每一個client可以訪問的主機。
《解決方案》

OpenVPN--通過C/S結構實現多個機房間的互通

如果是那樣的話,客戶端就有很多的資源不能訪問了。




[火星人 ] OpenVPN--通過C/S結構實現多個機房間的互通已經有665次圍觀

http://coctec.com/docs/service/show-post-12030.html