1. 程式人生 > >利用雲伺服器通過OpenVPN將內網的地址釋出到外網

利用雲伺服器通過OpenVPN將內網的地址釋出到外網

一、目的:

通過雲伺服器的外網地址,將沒有外網的伺服器的埠地址轉發到外網,使其能夠通過外網進行訪問。

二、原理:

  1.虛擬專用網VPN

  虛擬專用網VPN(virt ual private network)是在公共網路中建立的安全網路連線,這個網路連線和普通意義上的網路連線不同之處在於,它採用了專有的隧道協議,實現了資料的加密和完整性的檢驗、使用者的身份認證,從而保證了資訊在傳輸中不被偷看、篡改、複製,從網路連線的安全性角度來看,就類似於再公共網路中建立了一個專線網路一樣,只補過這個專線網路是邏輯上的而不是物理的所以稱為虛擬專用網。VPN系統的結構圖1所示,包括VPN伺服器,VPN客戶機和隧道。由於使用Internet進行傳輸相對於租用專線來說,費用極為低廉,所以VPN的出現使企業通過Internet既安全又經濟的傳輸私有的機密資訊成為可能。

            

  2.Windows作業系統中利用OpenVPN配置VPN

  OpenVPN是一個用於建立虛擬專用網路加密通道的軟體包,最早由James Yonan編寫。OpenVPN允許建立的VPN使用公開金鑰、電子證書、或者使用者名稱/密碼來進行身份驗證。

  3.Windows自帶的埠轉發工具netsh

  微軟Windows的netsh是一個命令列指令碼實用工具。使用netsh工具 ,可以檢視或更改本地計算機或遠端計算機的網路配置。不僅可以在本地計算機上執行這些命令,而且可以在網路上的遠端計算機上執行。

三、環境及軟體:

1.本文基於Windows下的環境配置。

四、步驟:

  1.安裝OpenVPN,實現內網伺服器和雲伺服器變為一個區域網(a.b.c.d.e.f.g 在雲伺服器完成,h 在內網伺服器完成)

    a.雲伺服器安裝OpenVPN;

    b.初始化配置;

    c.生成根CA;

    d.生成dh1024.pem檔案;

    e.生成伺服器端證書、客戶端證書和TA證書;(以上cmd命令必須在一個cmd完成

    f.對伺服器端和客戶端配置檔案檔案進行配置;

    g.配置伺服器端,為客戶端連線做準備;

    h.配置客戶端,連線伺服器端,使內網伺服器和雲伺服器變為一個區域網;

  2.配置埠轉發,實現內網伺服器對外網的釋出

五、步驟內容:

   1.安裝OpenVPN,實現內網伺服器和雲伺服器變為一個區域網。

    a.雲伺服器安裝OpenVPN

      

      

      

      

      

      

      

      安裝完畢後,開啟 控制面板->網路和 Internet->網路和共享中心->更改介面卡設定 

      

      出現虛擬網絡卡為TAP-Windows Adapter V9的新本地連線,將其改名為OpenVPN。

      (注:如果沒有出現新的本地連線,請雙擊C:\Program Files\TAP-Windows\bin目錄下的addtap.bat 檔案,來手動新增一個)

    b.初始化配置

      (一)使用寫字板開啟 OpenVPN安裝目錄\easy-rsa\vars.bat.sample 檔案容(最好用寫字板開啟,以免記事本開啟會破壞文件格式),如下:

        

        

  注:上面檔案資訊可以不予更改。但是,由於稍後給客戶端生成對應加密證書和私鑰時,程式會要求我們輸入一些註冊資訊。如果你需要配置多個客戶端,並且許多資訊都相同(比如國家、省市、地址、公司名稱等)你還可以修改vars.bat.sample檔案後面的一些相關變數的預設值,這樣在稍後生成客戶端證書的時候,如果該資訊項不輸入就會採用預設值。

       (二)執行DOS命令,初始化執行環境。

        開啟 %OpenVPN的安裝目錄%\easy-rsa 目錄,按住 Shift + 右鍵 選擇 在此處開啟命令視窗 ,

        然後依次輸入並執行以下命令:

init-config(初始化配置,將vars.bat.sample檔案的內容複製到vars.bat。實際上,你也可以直接雙擊執行easy-rsa目錄下的init-config.bat檔案來代替這一步。)
vars(設定相應的區域性環境變數,就是我們在vars.bat.sample檔案中設定的內容)
clean-all(相關設定和清理工作)

        

    c.生成根證書CAbuild-ca

        

  如上圖所示,在build-ca的時候需要輸入一些註冊資訊。在輸入資訊的時候,如果你不輸入任何資訊,就表示採用預設值(前面[]中的內容就是預設值);如果你輸入 .(點號) ,則表示當前資訊項留空白。值得注意的是,上圖中紫色框中的OpenVPN_CA是證書的通用名稱(Common Name),相當於我們常說的賬號,你也可以自行輸入其他名稱。

    d.生成dh1024.pem檔案(建立迪菲·赫爾曼金鑰):build-dh

      

  迪菲·赫爾曼金鑰交換(Diffie–Hellman key exchange,簡稱「D–H」) 是一種安全協議。它可以讓雙方在完全沒有對方任何預先資訊的條件下通過不安全通道建立起一個金鑰。這個金鑰可以在後續的通訊中作為對稱金鑰來加密通訊內容。

    e.生成伺服器端證書、客戶端證書和TA證書

     (一)生成服務端證書:build-key-server server

      

  如上圖所示,命令中的引數server指的是生成的證書檔名稱,你可以按照自己的需要進行修改,不過後面的Common Name也應保持一致。第三個紅色矩形框中是輸入的密碼,你也可以根據意願自行輸入。最後程式會詢問你是否註冊並提交證書,兩次均輸入y即可。

     (二)生成客戶端證書:build-key CdtsmClient

      

  如上圖所示,命令中的引數client表示生成的證書檔名稱,你可以按照自己的需要進行修改,不過後面的Common Name也應保持一致。第三個紅色矩形框中是輸入的密碼,你也可以根據意願自行輸入。最後程式會詢問你是否註冊並提交證書,兩次均輸入y即可。

  如果你想建立多個不同的客戶端證書,只需要重複此步驟即可。切記,Common Name不要重複,這是OpenVPN用來區分不同客戶端的關鍵所在。

     (三)生成TA證書:openvpn –genkey –secret keys/ta.key

      

  這一步其實是可選操作,生成的ta.key主要用於防禦DoS、UDP淹沒等惡意攻擊。命令中的第3個引數keys/ta.key表示生成的檔案路徑(含檔名)。

  非常重要的提醒以上命令都是在同一個DOS視窗中執行的,如果你以後需要開啟新視窗來執行命令(比如建立新的客戶端證書):你不需要再執行init-config命令,除非你再次改動了vars.bat.sample檔案;每一次開啟新視窗時都需要先執行vars命令,後面才能執行其他命令。

    f.對伺服器端和客戶端配置檔案進行配置

  上面我們已經建立了OpenVPN配置所需要的各種證書和私鑰,現在我們開始為伺服器和客戶端編寫對應的配置檔案,檔案目錄為 OpenVPN安裝目錄\sample-config 。

  對於一個剛剛接觸OpenVPN的人來說,我們應該配置些什麼呢,又該從哪裡入手呢?彆著急,OpenVPN已經考慮到了這一點。在OpenVPN的安裝目錄的sample-config資料夾中存放有3個示例模板檔案:server.ovpn、client.ovpn、sample.ovpn。其中,server.ovpn是伺服器的配置模板,client.ovpn是客戶端的配置模板(sample.ovpn也可用作客戶端配置模板,不過配置比較簡單,不夠全面。按照官方的說法,client.ovpn可用於連線具有多個客戶端的伺服器端配置檔案)。

在OpenVPN的配置檔案中,前面帶「#」或「;」的表示註釋內容。

 (一)配置服務端檔案:server.ovpn

local 192.168.0.2    #指定監聽的本機IP(因為有些計算機具備多個IP地址),該命令是可選的,預設監聽所有IP地址。

port 1194        #指定監聽的本機埠號

proto udp        #指定採用的傳輸協議,可以選擇tcp或udp

dev tun         #指定建立的通訊隧道型別,可選tun或tap

ca ca.crt         #指定CA證書的檔案路徑

cert server.crt     #指定伺服器端的證書檔案路徑

key server.key      #指定伺服器端的私鑰檔案路徑

dh dh1024.pem      #指定迪菲赫爾曼引數的檔案路徑

server 10.8.0.0 255.255.255.0 #指定虛擬區域網佔用的IP地址段和子網掩碼,此處配置的伺服器自身佔用10.8.0.1。

ifconfig-pool-persist ipp.txt #伺服器自動給客戶端分配IP後,客戶端下次連線時,仍然採用上次的IP地址(第一次分配的IP儲存在ipp.txt中,下一次分配其中儲存的IP)。

client-to-client    #允許客戶端與客戶端相連線,預設情況下客戶端只能與伺服器相連線。

keepalive 10 120    #每10秒ping一次,連線超時時間設為120秒。

tls-auth ta.key 0    #開啟TLS,使用ta.key防禦攻擊。伺服器端的第二個引數值為0,客戶端的為1。

comp-lzo        #開啟VPN連線壓縮,如果伺服器端開啟,客戶端也必須開啟

persist-key

persist-tun      #持久化選項可以儘量避免訪問在重啟時由於使用者許可權降低而無法訪問的某些資源。

status openvpn-status.log #指定記錄OpenVPN狀態的日誌檔案路徑

verb 3         #指定日誌檔案的記錄詳細級別,可選0-9,等級越高日誌內容越詳細

      實際修改內容參見下面的截圖。

      

      

      

      

     (二)客戶端配置檔案:client.ovpn

client           #指定當前VPN是客戶端
dev tun          #必須與伺服器端的保持一致
proto udp          #必須與伺服器端的保持一致
remote 192.168.0.2 1194  #指定連線的遠端伺服器的實際IP地址和埠號
resolv-retry infinite   #斷線自動重新連線,在網路不穩定的情況下(例如:膝上型電腦無線網路)非常有用。
nobind           #不繫結特定的本地埠號
persist-key
persist-tun
ca ca.crt          #指定CA證書的檔案路徑
cert client.crt      #指定當前客戶端的證書檔案路徑
key client.key      #指定當前客戶端的私鑰檔案路徑
remote-cert-tls server  #指定採用伺服器校驗方式
tls-auth ta.key 1     #如果伺服器設定了防禦DoS等攻擊的ta.key,則必須每個客戶端開啟;如果未設定,則註釋掉這一行;
comp-lzo          #與伺服器保持一致
verb 3          #指定日誌檔案的記錄詳細級別,可選0-9,等級越高日誌內容越詳細

      實際修改內容參見下面的截圖。

      

      

      

    g.配置伺服器端,為客戶端連線做準備

     (一)把配置檔案server.ovpn複製到伺服器端 OpenVPN安裝目錄\config 下

     (二)把OpenVPN安裝目錄\easy-rsa\keys目錄下的

        

        複製到OpenVPN安裝目錄\config目錄下

       (三)開啟OpenVPN GUI.exe

        此時在工作列的右下角將會出現如下圖所示的白色小圖示,右鍵該圖示,點選connect

        

        緊接著,就會自動彈出如下視窗,右下角圖示變為黃色。

        
        連線成功後,視窗自動關閉,右下角的圖示變為綠色。

        

    h.配置客戶端,連線伺服器端,使內網伺服器和雲伺服器變為一個區域網

     (一)把配置檔案client.ovpn複製到客戶端 OpenVPN安裝目錄\config 下

     (二)把OpenVPN安裝目錄\easy-rsa\keys目錄下的

        

          複製到OpenVPN安裝目錄\config目錄下

          (三)開啟OpenVPN GUI.exe

            和伺服器端一樣,圖示為綠色表示成功。

          (四)驗證區域網是否成功

            在伺服器端ping客戶端地址

            

            在客戶端ping伺服器端地址

            

  注:如果ping不通,看防火牆是否關閉。這裡的OpenVPN設定是為了實現埠轉發,如果內網伺服器需要通過雲伺服器上網,請開啟雲伺服器的本地連線的共享(不是OpenVPN的介面卡,是雲伺服器聯網的介面卡)。

  2.配置埠轉發,實現內網伺服器對外網的釋出

在雲伺服器端開啟Dos命令視窗,

    例,將內網伺服器的80埠轉發到雲伺服器的14941埠

    我們在cmd裡執行 netsh interface portproxy add v4tov4 listenport=14941 connectaddress=10.8.0.6 connectport=80 實現埠轉移。

    

     如果需要檢視那些埠已經被轉移,則在cmd執行 netsh interface portproxy show all 

     如果需要刪除那些埠轉移,則在cmd執行 netsh interface portproxy delete v4tov4 listenport=14941 

    

六、結果演示

   

   這裡將80設為14980