1. 程式人生 > >利用Nginx、openVPN、CentOS搭建HTTPS、VPN服務

利用Nginx、openVPN、CentOS搭建HTTPS、VPN服務

最近一直忙著資訊保安有關的課程設計,課程設計很簡單,給一個web專案做增強防護,具體的拓撲圖由下可見。這個課程設計主要是由我和我的一個哥們做的,具體的分工也很簡單,我主要負責專案部署這塊,他主要負責web專案中的Java開發,對專案本身的安全性進行加固拓撲圖
正如這個拓撲圖可以看到,我們的web專案部署在企業內網(實際情況也就是用寢室的路由器做一個區域網,模擬一下企業的內網了),我做的專案部署主要有以下幾個方面:
1、外網的伺服器(阿里雲)部署一個openvpn伺服器,與部署在內網的web伺服器搭建vpn連線
2、外網的伺服器部署Nginx伺服器,用來構建反向代理以及負載均衡,使得在外網狀態下,可以訪問到部署在企業內網的web服務
3、外網計算機與Nginx伺服器之間的通訊採用HTTPS協議,通訊安全

其實之前vpn和反向代理已經做好了,但是之前沒有把製作過程記錄下來,所以在這裡還是寫一下吧。

openVPN的部署:
由於我的伺服器作業系統採用的是CentOS 7作業系統,所以也許和其他版本的Linux伺服器作業系統的命令有點不一樣,但是大同小異。
我這次部署的vpn伺服器採用的是數字證書的身份驗證方式(沒有采用使用者名稱和密碼),所以我們首先要為openvpn構建PKI體系

首先檢查我們的伺服器有沒有事先安裝好openVPN和easy-rsa(用來建立證書用的),執行如下兩個命令:
# rpm -qa easy-rsa
# rpm -qa openvpn
如果沒有安裝,就用yum源進行安裝,命令如下:
# yum install easy-rsa
# yum install openvpn

安裝好了之後,開始利用easy-rsa簽發證書,首先我們需要將easy-rsa的目錄移至openvpn的配置目錄下(其實移不移都一樣,只是最後證書的路徑好找一些),命令如下:
# cp -R /usr/share/easy-rsa/ /etc/openvpn/
(不同版本的Linux位置可能不一樣,自己好好找一下就OK了)
再來就是修改easy-rsa的vars檔案:
# vim /etc/openvpn/easy-rsa/2.0/vars
修改的時候,推薦把KEY_SIZE 改為2048(看了很多部落格都這麼說的,我也不清楚為什麼0.0),剩下的什麼地址什麼的,隨便寫。

接下來正式簽發證書了,首先進入easy-rsa目錄:
# cd /etc/openvpn/easy-rsa/2.0
載入配置引數:
# source ./vars
清空(清空之前簽發的所有證書,如果第一次簽發,那麼沒有影響):
# ./clean-all
構建CA私鑰和自簽發證書,該命令需要填寫若干引數,可選擇預設(注意選取CN欄位值),該命令執行後,/etc/openvpn/easy-rsa/2.0/keys中,生成CA公鑰證書ca.crt和CA的私鑰ca.key,即CA體系的自簽發根證書。其他證書,如伺服器證書和客戶端證書均由該根證書籤發:
# ./build-ca
簽發伺服器證書和私鑰(生成server.crt和server.key):
# ./build-server server
生成SSL協議所需的Diffie Hellman key exchange引數:
# ./build-dh
生成客戶端證書和私鑰(後面的名字可以自己取):
# ./build-key client
如果以後還想新增新的客戶端證書,可以執行:
# source ./vars
# ./build-key client-name
注意不能執行./clean-all,否則之前的證書都報廢了。當然還可以撤銷客戶端證書,由於我不需要,就沒了解了,網上有很多資源的。

下面,就是到了拷貝證書環節,將已經將已經簽發的ca.crt, server.crt, server.key和dh2048.pem移動至/etc/openvpn目錄之下,為了以後寫配置檔案方便,當然可以不移動,運用cp命令,可以參考上文。再來就是將ca.crt, client.crt, client.key從伺服器拷貝到客戶端,為部署客戶端做好準備,我用的是xftp軟體進行拷貝的。

接著我們就要對openvpn寫配置檔案,openvpn已經為我們提供了配置檔案的範例,我們只要拷貝過來,直接修改使用就行了。我的配置檔案的位置是/usr/share/doc/openvpn-../sample/sample-config-files/server.conf (其中“”代表openvpn的版本),將其拷貝至/etc/openvpn/進行修改即可。
我們需要修改的主要就是本地的IP地址,監聽的埠號,以及那些證書的位置,其他具體的配置我也不是很懂,需要的話可以去網上查一查。我的配置如下:
local 121.42..(IP地址,不方便透露啦^.^)
port 1195
proto udp
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key # This file should be kept secret
dh /etc/openvpn/dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push “redirect-gateway def1 bypass-dhcp”
client-to-client
duplicate-cn
keepalive 10 120
cipher AES-256-CBC
comp-lzo
max-clients 100
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3
explicit-exit-notify 1

OK, 接下來,配置客戶端。客戶端我用的自己的電腦,作業系統為Windows10,下載一個openvpn客戶端之後,就可以進行配置了。類似的,也有例項檔案,在doc檔案目錄裡面。將從伺服器下載下的ca.crt, client.crt, client.key以及客戶端配置例項檔案拷貝到config目錄之下,在修改配置檔案。
例項
client.ovpn配置資訊如下:

client
dev tun
proto udp
remote 121.42.. 1195
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
cipher AES-256-CBC
comp-lzo
verb 3

在服務端,執行如下命令啟動openvpn服務:
# openvpn /etc/openvpn/server.conf
應該還有其他啟動方法,但是我好像都嘗試失敗了,也沒去深究了。
在客戶端,點選openvpn-gui,在點選connect,連線成功。
這裡寫圖片描述
這裡寫圖片描述
所以,vpn就搞定啦!

Nginx部署反向代理
反向代理可以是web伺服器的第一道防火牆,也可以對伺服器進行負載均衡配置,我覺得用處還是很大的。當然,其中高效能的Nginx伺服器居功至偉。修改Nginx的配置檔案,這裡不想手寫了,截個圖吧:
# vim /etc/nginx/nginx.conf
這裡寫圖片描述
其中wamp中的地址,就是部署在區域網中的web伺服器的IP地址和埠號。location中的內容,就是講本地接收到的所有請求全部轉發到wamp中的IP去。所有都準備好後,啟動Nginx伺服器和openvpn伺服器,本機開啟Apache伺服器並連線openvpn伺服器。使用另一塊聯網的裝置訪問121.42..,結果如下:
這裡寫圖片描述
由於本機的Apache伺服器設定了禁止vpn通訊,所以顯示沒有許可權訪問,可是我們可以看到,瀏覽器對121.42..的請求已經轉發到了本機的80埠上,本機的Apache伺服器也給出了響應。而訪問者卻對此渾然不知,以為是121.42..給出的響應。
那麼到此,我們可以看到,反向代理成功構建!

Nginx構建HTTPS
其實構建HTTPS,正是故事開始的地方。之前的vpn和反向代理,做的都很順利,自己本來就懂點,然後按著教程一步一步的過來,都是一次成功了的。而在構建HTTPS的時候,麻煩一個接著一個地就來了。

一開始百度了一下,有兩種構建方法,一種是利用阿里雲提供的免費DV證書,另一種是使用OpenSSL自己簽發證書。本來以為阿里雲提供的證書在瀏覽器中可以識別為可信的,於是毫不猶豫地選擇了阿里雲DV證書(後來弄好後才發現,和自己簽發的一樣,瀏覽器都識別不了)。在阿里雲的控制檯填了一些資訊之後,繫結域名等一系列操作之後(阿里雲有教程的),將申請的證書下載下來了,放到伺服器上之後,對Nginx的伺服器進行配置,配置的基本資訊如下(主要都是藍色被註釋的部分,因為最後又自己用OpenSSL簽發了):
這裡寫圖片描述

這些僅僅是針對HTTPS的配置,由於最終的web伺服器是tomcat,本地開放的是8080埠,於是呢,我又將本地監聽額埠改成了8080(不是在這段配置上改)。配置完畢後,啟動伺服器,用HTTPS訪問我的伺服器,網頁一直載入不出來。於是乎,從網上找了很多資料,改啊改,改啊改,還是不行。到了第二天晚上,還是不行。呵呵,那就試試自己簽發?好!說幹就幹起來了!

具體怎麼做呢?額,時間有點長,我也忘記了,反正就是按部就班一步一步的做。從這篇部落格(http://blog.csdn.net/u013216667/article/details/53467319)截了個圖,可以參考一下:
這裡寫圖片描述
到時候,把向對應的檔案位置改一下就OK了。我的配置檔案就是對應的這種方法來的。

東西都弄好了吧,那就測試一下嘍,哈哈,還是不行0.0。於是乎,又查找了很多資料,百度、谷歌查到的東西都被我翻了個遍。看到有個帖子說是不是防火牆的問題,於是我就又開始查詢CentOS的防火牆設定。以前CentOS的防火牆都是iptables,到了CentOS7之後,對防火牆進行了升級,使用Firewall,對於Firewall的使用,這篇部落格寫的很詳細,可以參考一下(http://www.cnblogs.com/moxiaoan/p/5683743.html)。

就這樣,我就啟動了防火牆,分別開放了80、8080、443埠,還是不行0.0。

一次很偶然的因素,因為本地伺服器開放的是8080埠,每次寫URL的時候,都得在後面加上埠號,覺得很麻煩,就想偷個懶,換成80的。啊,這下子好了。為什麼呢?一下子就成功了,哈哈哈,我也不知道怎麼搞的,難道必須是80端口才行?0.0
這裡寫圖片描述
因為自己簽發的證書,沒有拿過去認證,瀏覽器不會識別,所以才會顯示風險(畢竟認證的證書要好幾千塊呢)
這樣HTTPS也構建好了。

整合時的尷尬
都已經弄好了以後,就開始對做好的東西進行整合,可是問題又來了,vpn連不上了。於是我又折騰了幾個下午,又重新簽發了客戶端證書,結果都不不行。最後,我又重新安裝了openvpn客戶端,這下好了,客戶端又啟動不起來了,百度了一下,發現了一個很好玩東西,見下圖:
這裡寫圖片描述
(原文連結:http://blog.csdn.net/xiaoshunzi111/article/details/53633679
這哥們和我乾的事一模一樣,本來vpn客戶端安裝在D盤,拆卸了之後又安裝在C盤,執行時候報了一樣的錯。同時也謝天謝地,因為他我可以順利解決這個問題。

最終,我查看了客戶端的錯誤日誌,發現TCP握手完成不了,監聽伺服器的埠,根本就沒有資料,這才恍然大悟,我之前無意中啟動了firewall,而openvpn的埠沒有開啟,才會發生這樣的事情。

事後想想,很是滑稽。因為無意搞砸了一些事,而又因為無意又解決了一些事情。這到底是不是偶然呢?於是乎,用這篇有一點技術內容的部落格做個記錄。

好了,不多說了,我那個哥們的Java炸了,他還在等著我去拯救呢。