歡迎您光臨本站 註冊首頁

基於linux操作系統架構openvpn總結

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

使用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/s ... vpn-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 [me@myhost.mydomain]:

其它的按默認即可。

完成後會在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 [me@myhost.mydomain]:

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 [me@myhost.mydomain]:

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` {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/s ... .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 stsart|stop|restart 成功!

[火星人 ] 基於linux操作系統架構openvpn總結已經有471次圍觀

http://coctec.com/docs/linux/show-post-204455.html