實踐出真知 布署openvpn環(huán)境應注意的事
原創(chuàng)【51CTO.com獨家特稿】前言
OpenVPN是一個開源的加密隧道構(gòu)建工具,基于OpenSSL的SSL/TLS協(xié)議,可以在Internet中 實現(xiàn)點對點的SSLVPN安全連接。使用OpenVPN的好處是安全、易用和穩(wěn)定,且認證方式靈活,具備實現(xiàn)SSL VPN解決方案的完整特性。OpenVPN可以應用于Linux、Unix、Mac OS以及Windows等各種操作系統(tǒng)平臺。OpenVPN提供兩種 類型的虛擬網(wǎng)絡接口:TUN和TAP,分別用于建議IP隧道、以太網(wǎng)橋接。在Linux/unix中使用這兩種虛擬設(shè)備,需要對應的內(nèi)核模塊支持。 RHEL5/FreeBSD8系統(tǒng)默認已編譯好TUN模塊,直接使用即可。OpenVPN的官方站點是http://openvpn.net,目前穩(wěn)定版為OpenVPN-2.0.9。
推薦專題:企業(yè)內(nèi)網(wǎng)開發(fā)環(huán)境部署與管理全攻略(FreeBSD+PHP)
我替公司設(shè)計VPN家庭辦公方案時,初期部署的是pptpd方案,穩(wěn)定性和加密性大家都是還滿意的;后期在運作時發(fā)現(xiàn),許多小區(qū)或用電信路由器作NAT撥號的同事發(fā)現(xiàn),根本連接不了公司的公網(wǎng)pptpd服務器,撥號時出現(xiàn)了619報錯,具體原因為:
這種情況大數(shù)多原因為客戶機連接Internet的網(wǎng)關(guān)(如家庭寬帶路由或公司上網(wǎng)網(wǎng)關(guān)路由或防火墻)NAT-T功能關(guān)閉或?qū)PN支持性不好,主要是對GRE及PPTP協(xié)議的NAT-T不支持??纱蜷_網(wǎng)關(guān)路由的NAT-T功能,如果還是出現(xiàn)錯誤,則需要更換網(wǎng)關(guān)設(shè)備,現(xiàn)在市面上大多數(shù)設(shè)備已經(jīng)支持。由于公司在小區(qū)或家里有幾臺電腦的情況都很普遍,另考慮到以前布署的點對點openvpn穿透能力還是很強的,考慮放棄pptpd,改用openvpn。
值得注意的是:為了消除防火墻及路由器的影響,我直接將openvpn服務器放在防火墻前面(如果置于防火墻后,還要考慮DMZ映射及路由方面的因素,失敗率比較高),為了穩(wěn)定性我用的是64bit的Centos5.5,LAN:192.168.4.222,WAN:220.249.x.x。
這里提前說明一下openvpn的網(wǎng)絡部署應該注意的情況,如果你所在小區(qū)的局域網(wǎng)是192.168.1.0,而你的openvpn所在局域網(wǎng)也是192.168.4.0的話,會發(fā)生杯具性的事情,你是撥不上openvpn服務器的;所以你在規(guī)劃你的網(wǎng)絡時,應該考慮將網(wǎng)段不要設(shè)計成192.168.1.0的網(wǎng)段,考慮用192.168.4.0或192.168.10.0這些不常見的網(wǎng)段;你到星巴克咖啡館唱咖啡時你會驚奇的發(fā)現(xiàn),大多數(shù)類似的提供無線服務,基本是將局域網(wǎng)設(shè)計成192.168.1.0的,所以我推薦公司的網(wǎng)絡盡量不要用192.168.1.0的網(wǎng)段,切記。
完整安裝步驟如下(以下過程我重復了上百次,大家可依此實驗,F(xiàn)reebsd及Linux均適用)
一、安裝前的準備工作
OpenVPN是基于openssl的,所以需要安裝openssl,在freebsd8下可采用port安裝 cd /usr/ports/security/openssl && make install clean;
RHEL5&Centos5下用 yum -y install openssl openssl-devel
二、 安裝服務器端及配置 ,源碼包我放在/usr/local/src下。
①首先下載及安裝lzo軟件包,用于壓縮隧道通訊數(shù)據(jù)以加快傳輸速度。
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz
- tar zxvf lzo-2.03.tar.gz
- cd lzo-2.03
- ./configure --prefix=/usr && make && make install
②下載openvpn及安裝
wget http://openvpn.net/release/openvpn-2.0.9.tar.gz
- tar zxvf openvpn-2.0.9
- ./configure --with-lzo-lib=/usr && make && make install
一、OpenVPN服務器端的配置
1)建立CA
在OpenVPN源代碼目錄下有一個\easy-rsa\2.0目錄,進入后修改vars文件最后部分的信息,即
- vim /root/openvpn-2.0.9/easy-ras/2.0/vars
- export KEY_COUNTRY="CN"
- export KEY_PROVINCE="BJ"
- export KEY_CITY="Beijing"
- export KEY_ORG="PKU"
- export KEY_EMAIL=" xxxxxx@pku.edu.cn"
保存退出,再運行:
- source vars
- NOTE: If you run ./clean-all, I will be doing a rm -rf on /root/openvpn-2.0.9/easy-rsa/2.0/keys
- ./clean-all
- ./build-ca
然后就是一段提示,要求輸入信息,大部分信息默認就是上述vars文件里的信息,自己只需要填寫“Organizational Unit Name”一項,這個隨便寫一個就是了,也可以不寫,我就沒有寫。
2)為服務器生成證書和密鑰
./build-key-server server
還是與上一步類似,自己只需要填寫“Organizational Unit Name”一項,也可以不寫,即均默認為default值。還會出現(xiàn):“Sign the certificate? [y/n]”和“1 out of 1 certificate requests certified, commit? [y/n]”,都輸入y然后回車,其它可參照如下。
- Generating a 1024 bit RSA private key
- ......++++++
- ....................++++++
- writing new private key to 'server.key'
- -----
- You are about to be asked to enter information that will be incorporated
- into your certificate request.
- What you are about to enter is what is called a Distinguished Name or a DN.
- There are quite a few fields but you can leave some blank
- For some fields there will be a default value,
- If you enter '.', the field will be left blank.
- -----
- Country Name (2 letter code) [CN]:
- State or Province Name (full name) [BJ]:
- Locality Name (eg, city) [BJ]:
- Organization Name (eg, company) [buaa]:
- Organizational Unit Name (eg, section) []:gait
- Common Name (eg, your name or your server's hostname) []:server
- Email Address [[email]support@cooldvd.com[/email]]:
- Please enter the following 'extra' attributes
- to be sent with your certificate request
- A challenge password []:abcd1234
- An optional company name []:dvdmaster
- Using configuration from /openvpn-2.0.5/easy-rsa/openssl.cnf
- Check that the request matches the signature
- Signature ok
- The Subject's Distinguished Name is as follows
- countryName :PRINTABLE:'CN'
- stateOrProvinceName :PRINTABLE:'GD'
- localityName :PRINTABLE:'SZ'
- organizationName :PRINTABLE:'dvdmaster'
- organizationalUnitName:PRINTABLE:'dvdmaster'
- commonName :PRINTABLE:'server'
- emailAddress :IA5STRING:'[email]support@cooldvd.com[/email]'
- Certificate is to be certified until Mar 19 08:15:31 2016 GMT (3650 days)
- Sign the certificate? [y/n]:y
- 1 out of 1 certificate requests certified, commit? [y/n]y
- Write out database with 1 new entries
- Data Base Updated
3)在openvpn中,這種配置方法是每一個登陸的VPN客戶端需要有一個證書,每個證書在同一時刻只能供一個客 戶端連接(如果有兩個機器安裝相同證書,同時撥服務器,都能撥上,但是只有第一個撥上的才能連通網(wǎng)絡)。所以需要建立許多份證書。下面建立2份,名稱分別 為client1和client2
- ./build-key client1
- Generating a 1024 bit RSA private key
- .....++++++
- ......++++++
- writing new private key to 'client1.key'
- -----
- You are about to be asked to enter information that will be incorporated
- into your certificate request.
- What you are about to enter is what is called a Distinguished Name or a DN.
- There are quite a few fields but you can leave some blank
- For some fields there will be a default value,
- If you enter '.', the field will be left blank.
- -----
- Country Name (2 letter code) [CN]:
- State or Province Name (full name) [BJ]:
- Locality Name (eg, city) [BJ]:
- Organization Name (eg, company) [buaa]:
- Organizational Unit Name (eg, section) []:gait
- Common Name (eg, your name or your server's hostname) []:client1 重要: 每個不同的 client 生成的證書, 名字必須不同.
- Email Address [[email]support@cooldvd.com[/email]]:
- Please enter the following 'extra' attributes
- to be sent with your certificate request
- A challenge password []:abcd1234
- An optional company name []:gait
- Using configuration from /openvpn-2.0.5/easy-rsa/openssl.cnf
- Check that the request matches the signature
- Signature ok
- The Subject's Distinguished Name is as follows
- countryName :PRINTABLE:'CN'
- stateOrProvinceName :PRINTABLE:'GD'
- localityName :PRINTABLE:'SZ'
- organizationName :PRINTABLE:'dvdmaster'
- organizationalUnitName:PRINTABLE:'dvdmaster'
- commonName :PRINTABLE:'client1'
- emailAddress :IA5STRING:'[email]support@cooldvd.com[/email]'
- Certificate is to be certified until Mar 19 08:22:00 2016 GMT (3650 days)
- Sign the certificate? [y/n]:y
- 1 out of 1 certificate requests certified, commit? [y/n]y
- Write out database with 1 new entries
- Data Base Updated
依次類推生成其他客戶端證書/key:
./build-key client2
4)./build-dh,這步不要看掉了~
生成的證書文件均在/usr/local/src/openvpn-2.0.9/easy-rsa/2.0/keys下
5)配置服務器VPN文件
a) cp -p /usr/local/src/openvpn-2.0.9/sample-config-files/server.conf /usr/local/etc/server.conf
b) vi /usr/local/etc/server.conf
i. proto udp改成proto tcp
ii. ca那四行改成
- ca /usr/local/src/openvpn-2.0.9/easy-rsa/2.0/keys/ca.crt
- cert /usr/local/src/openvpn-2.0.9/easy-rsa/2.0/keys/server.crt
- key /usr/local/src/openvpn-2.0.9/easy-rsa/2.0/keys/server.key
- dh /usr/local/src/openvpn-2.0.9/easy-rsa/2.0/keys/dh1024.pem
iii. server那行改成
server 10.0.0.0 255.255.255.0 前期我用是10.0.0.0,后期實際部署用的是10.10.0.0。
v. 改成verb 5可以多查看一些調(diào)試信息
6) 啟動服務:
a) 關(guān)閉服務器、防火墻上所有對SSH(22)、openvpn(1194)的攔截。
b) echo "1" > /proc/sys/net/ipv4/ip_forward
c)
- /usr/local/sbin/openvpn --config /usr/local/etc/server.conf
- Fri Jan 23 23:55:34 2009 OpenVPN 2.0.9 i686-pc-linux [SSL] [EPOLL] built on Jan 23 2009
- Fri Jan 23 23:55:34 2009 Diffie-Hellman initialized with 1024 bit key
- Fri Jan 23 23:55:34 2009 TLS-Auth MTU parms [ L:1543 D:140 EF:40 EB:0 ET:0 EL:0 ]
- Fri Jan 23 23:55:35 2009 TUN/TAP device tun0 opened
- Fri Jan 23 23:55:35 2009 /sbin/ifconfig tun0 10.0.0.1 pointopoint 10.0.0.2 mtu 1500
- Fri Jan 23 23:55:35 2009 /sbin/route add -net 10.0.0.0 netmask 255.255.255.0 gw 10.0.0.2
- Fri Jan 23 23:55:35 2009 Data Channel MTU parms [ L:1543 D:1450 EF:43 EB:4 ET:0 EL:0 ]
- Fri Jan 23 23:55:35 2009 Listening for incoming TCP connection on [undef]:1194
- Fri Jan 23 23:55:35 2009 TCPv4_SERVER link local (bound): [undef]:1194
- Fri Jan 23 23:55:35 2009 TCPv4_SERVER link remote: [undef]
- Fri Jan 23 23:55:35 2009 MULTI: multi_init called, r=256 v=256
- Fri Jan 23 23:55:35 2009 IFCONFIG POOL: base=10.0.0.4 size=62
- Fri Jan 23 23:55:35 2009 IFCONFIG POOL LIST
- Fri Jan 23 23:55:35 2009 MULTI: TCP INIT maxclients=1024 maxevents=1028
- Fri Jan 23 23:55:35 2009 Initialization Sequence Completed
#p#
二、安裝WidnowsVPN客戶端
1、安裝客戶端
①從http://openvpn.se/files/上下載與openvpn服務器版本一致的Windows客戶端“OpenVPN GUI For Windows”
例如, 服務器裝的是 OpenVPN 2.09, 那么下載的 OpenVPN GUI fow windows應該是: openvpn-2.0.9-gui-1.0.3-install.exe
②執(zhí)行openvpn-2.0.9-gui-1.0.3-install.exe。一切采用默認設(shè)置。
③將ca.crt、client1.crt、client1.key復制到C:\Program Files\OpenVPN\config。(不同用戶使用不同的證書,每個證書包括.crt和.key兩個文件,如client2.crt和client2.key)
④在/root/openvpn-2.0.9/sample-config-files/client.conf 的基礎(chǔ)上建立客戶端配置文件,改名為C:\Program Files\OpenVPN\config\client.ovpn,即先在服務器上建立配置文件,然后再上傳改名到客戶機上。
a) proto udp改成proto tcp
b) remote那行改成
192.168.1.103 1194
c) ca那3行改為
- ca ca.crt
- cert client1.crt
- key client1.key
d) 注釋掉comp-lzo
⑤連接:在右下角的openvpn圖標上右擊,選擇“Connect”。正常情況下應該能夠連接成功,分配正常的IP。(點擊看大圖)
2、這些都很順利,但撥號成功后,如何才能使撥號用戶訪問局域網(wǎng)內(nèi)192.168.4.0網(wǎng)段的機器呢,具體做法來:
①在openvpn的配置文件里增加push "route 192.168.4.0 255.255.255.0",目的是為客戶端加一條路由,這樣客戶端才有可能訪問到辦公網(wǎng)絡中出VPN Server之外的其它主機(有很多VPN客戶端直接添加默認路由,這樣客戶端的所有連接請求都被路由到 VPN 通道內(nèi),結(jié)果是客戶端此時不能訪問VPN,而此項添加指定地址的路由不會導致這一問題)
②在openvpn上開啟ip轉(zhuǎn)發(fā)echo “1”> /proc/sys/net/ipv4/ip_forward
③在公司的網(wǎng)關(guān)或路由器上增加一條路由,添加到 10.10.0.0/24 的路由項目,網(wǎng)關(guān)為服務器的內(nèi)部 IP 地址,目的是為了讓公司局域網(wǎng)里的主機知道去往VPN Client的包如何路由,記住 ,路由是雙向和回環(huán)的,既要有來的路由,也應該有回的路由。由于我這種環(huán)境下既沒有路由器,也沒有防火墻,所以我直接在公司重要的服務器及我要遠程的機器(xp)上增加一條路由。
route add 10.10.0.0 mask 255.255.255.0 192.168.4.222
三、需要注意的問題
每個人的網(wǎng)絡拓補不一樣,如何使openvpn的客戶端也能訪問除openvpn外的公司局域網(wǎng)內(nèi)的機器呢?這個問題是玩openvpn的朋友們最為關(guān)注的,其它情況可以參考以下幾點:
1 、可以把openvpn服務器也設(shè)成路由器,并使openvpn服務器作為這些需要被訪問的內(nèi)網(wǎng)機器的路由器,這樣路由器和openvpn在同一臺機器上就 ok了。
2 、如果內(nèi)網(wǎng)中有多臺機器可能需要被訪問,針對我這種情況,可以在路由器上設(shè)置靜態(tài)路由表,設(shè)置10.10.0.0網(wǎng)段的信息路由到openvpn服務器, 具體設(shè)置參看自己的路由器的設(shè)置頁面吧。如果是計算機作路由器,那就使用route add 10.10.0.0 mask 255.255.255.0 192.168.4.222(openvpn服務器的ip),這樣只需要改一個地方就ok了,就不需要修改每臺內(nèi)網(wǎng)的機器了。
3 、如果改不了路由器,或者內(nèi)網(wǎng)需要修改的機器不多的話,也可以直接在內(nèi)網(wǎng)要被訪問的機器上,執(zhí)行route add 10.10.0.0 mask 255.255.255.0 192.168.4.222(openvpn服務器的ip)命令(我的情況是操作系統(tǒng)是windows,命令就是那個了),來直接給內(nèi)網(wǎng)的機器添加路由,這樣 當碰到10.10.0.0網(wǎng)段的信息,它就知道直接路由到openvpn服務器,而不會走路由器這條路了。
還有一個細節(jié)問題應該注意:一臺機器只能用一個證書撥號,如果是二臺機器都要用一個證書來撥號的話,第二臺機器會發(fā)生每5秒就掉線的杯具,這個也是實際使用中發(fā)現(xiàn)的;雖然可以在openvpn通過配置來更改,但我建議還是一臺機器使用一個證書的好。
另外一個小問題就是:在進行證書制作工作時,仍舊需要進行初始化,
但只需要進入openvpn\easy-rsa目錄,運行vars就可以了,不需要./clean-all步驟,它會清掉一切證書文件的(汗) 。
以上就是我玩openvpn以來的一些經(jīng)驗總結(jié)和心得,希望能給大家?guī)硪恍椭?;每個人的情況不一樣,別人的未必適用于你,所以多動手,多嘗試,畢竟實踐出真知嘛。通過部署整個VPN辦公環(huán)境,發(fā)現(xiàn)openVPN的穩(wěn)定和穿透能力相當?shù)膹姾钒?,套用一句流行的話:openVPN相當V5,呵呵。
附錄:
在windows機器上永久增加路由的方法:
ROUTE命令可以在XP、2K/2003、WIN7等操作系統(tǒng)下手工增加靜態(tài)路由,但是重啟之后路由便丟失了,還要重新增加,那么怎樣能讓路由一直保待,重啟后仍然存在呢?其實很簡單,在增加路由的命令后加上-P開關(guān)就可以了。例如
route -p add 10.10.0.0 mask 255.255.0.0 192.168.4.222
-p參數(shù)詳解
與Add命令共同使用時,指定路由被添加到注冊表并在啟動TCP/IP協(xié)議的時候初始化IP路由表。默認情況下,啟動TCP/IP協(xié)議時不會保存添加的路 由,與Print命令一起使用時,則顯示永久路由列表。所有其他的命令都忽略此參數(shù)。永久路由存儲在注冊表中的位置是,注意最后一副圖畫紅線的部分,它也可以驗證我們新增的命令會永久的增加靜態(tài)路由。
HKEY_LOCAL_MACHSYSTEM\CurrentControlSet\Services\Tcpip\Parameters\PersistentRoutes