1. 程式人生 > >(轉)sslvpn及openvpn實現原理

(轉)sslvpn及openvpn實現原理

SSL VPN即指採用SSL (Security Socket Layer)協議來實現遠端接入的一種新型VPN技術。SSL協議是基於WEB應用的安全協議,它包括:伺服器認證、客戶認證(可選)、SSL鏈路上的資料完整性和SSL鏈路上的資料保密性。

傳統的vpn,如IPsec vpn是在IP層實現的vpn,採用ipsec協議,部署IPSec需要對本身的網路做重大修改,而且還有一些缺點:安全性低,投資和維護費用高,適用性不強等。對使用者而言最複雜的是需要安裝客戶端,而且對客戶端的配置比較繁瑣。

相對於傳統的VPN,sslvpn是在網路層之上實現的VPN技術,它無需安裝客戶端,而且採用ssl協議加密更加安全,使用者只需要有web瀏覽器,便可以訪問到遠端資訊。

一般而言,SSL VPN必須滿足最基本的兩個要求:

1). 使用SSL 協議進行認證和加密;

2). 直接使用瀏覽器完成操作,無需安裝獨立的客戶端;

2.1 Apache反向代理

反向代理伺服器部署在伺服器端,通常是代理伺服器接收客戶端的請求,主要作用就是分發請求和對內部做負載均衡。反向代理可以讓外部主機訪問內部伺服器上的資源,但是外部主機只能看到這個代理伺服器相關資訊,而不知道其後面的伺服器資訊。應用在SSL VPN上,在內部伺服器的出口處部署反向代理伺服器,並把內部伺服器資源對映到代理伺服器上,伺服器上是公網地址,外在的使用者直接訪問代理伺服器上的資源,然後代理伺服器通過資源對映把請求發往內部相應伺服器上,接收到內部伺服器的迴應後再把迴應資訊發給使用者。    

2.2 stunnel 和squid

2.1.1  stunnel加密

Stunnel用於提供全域性的TLS/SSL服務。針對本身無法進行TLS或SSL通訊的客戶端及伺服器,Stunnel可提供安全的加密連線。

Stunnel 是一款可以加密網路資料的TCP連線,並可工作在Unix和Windows平臺上,它採用Client/Server模式,它的工作流程為:

Stunnel的原理很簡單,從伺服器和客戶端的配置就能看出來。例如:

在客戶端瀏覽器配置代理到本機的440埠,然後本地訪問的請求流量到stunnel的440上,stunnel對資料進行加密後。轉發到遠端伺服器 211.1.1.1上stunnel監聽的埠445上,伺服器stunnel收到後解密,然後傳送到伺服器端的80埠對應的服務上。整個過程對http服務進行了加密處理。

2.2.2  squid代理

squid是一款開源的,支援http,https以及ftp等協議的網頁快取代理伺服器。它是用來快取internet資料的軟體

主要工作原理是:接收使用者的請求,如果本地有有請求的資源,就返回給使用者,若沒有就連線到遠端伺服器取得對應資源然後發給使用者,並在本地存一份,當用戶下次訪問時直接將本地資源發給使用者。

Squid與apache和nginx都有反向代理的功能,但是squid和apache是同步傳輸,nginx是非同步傳輸。非同步傳輸即接收完客戶端的請求後再向伺服器傳送請求,而同步傳輸是在客戶端請求到來時立刻向伺服器請求,這樣在客戶端請求期間一直維護一個連線。非同步傳輸較少後端web伺服器的壓力。

2.4   openvpn技術

傳統SSL VPN通過埠代理的方法實現,代理伺服器根據應用協議的型別(如http,telnet等)做相應的埠代理,客戶端與代理伺服器之間建立SSL安全連線,客戶端與應用伺服器之間的所有資料傳輸通過代理伺服器轉發。這種實現方式煩瑣,應用範圍也比較侷限,僅適用於用TCP固定埠進行通訊的應用系統,且對每個需要代理的埠進行單獨配置;對於每個需要用到動態埠的協議都必須重新開發,且在代理中解析應用協議才能實現代理,如FTP協議;不能對TCP以外的其它網路通訊協議進行代理;代理伺服器前端的防火牆也要根據代理埠的配置變化進行相應調整。 
OpenVPN以一種全新的方式實現了SSL VPN的功能,克服了傳統SSL VPN的一些缺陷,擴充套件了應用領域,並且防火牆上只需開放TCP或UDP協議的一個埠。

實現Openvpn的關鍵主要是虛擬網絡卡和ssl協議。

在Linux2.4版本以上,作業系統支援一個名為tun的裝置,tun裝置的驅動程式中包含兩個部分,一部分是字元裝置驅動,一部分是網絡卡驅動。網絡卡的驅動把從TCP/IP協議棧收到的資料包結構skb放於tun裝置的讀取佇列,使用者程序通過呼叫字元裝置介面read獲得完整的IP資料包,字元驅動read函式的功能是從裝置的讀取佇列讀取資料,將核心態的skb傳遞給使用者;反過來字元驅動write函式給使用者提供了把使用者態的資料寫入核心態的介面,write函式把使用者資料寫入核心空間並穿入TCP/IP協議棧。該裝置既能以字元裝置的方式被讀寫,作為系統的虛擬網絡卡,也具有和物理網絡卡相同的特點:能夠配置IP地址和路由。對虛擬網絡卡的使用是OpenVPN實現其SSL VPN功能的關鍵。

Openvpn伺服器端一般需要配置一個虛擬地址網段,用來給每個連線到它的客戶端分配IP,同時給伺服器自己也分配一個ip。Openvpn服務還提供對虛擬網絡卡的路由管理,當客戶端訪問伺服器資訊時,資料包通過路由找到虛擬網絡卡,openvpn程式在虛擬網絡卡上擷取IP報文,然後使用ssl協議將這些報文加密封裝起來,在經過物理網絡卡傳送出去。Openvpn伺服器和客戶端在虛擬網絡卡上建立了一個區域網絡。

1)傳送資料

應用層的資料,經過系統呼叫介面傳入核心TCP/IP層做處理,在TCP/IP經過路由到虛擬網絡卡,虛擬網絡卡的網絡卡驅動傳送處理程式hard_start_xmit()將資料包加入skb表並完成資料包從核心區到使用者區的複製,OpenVPN呼叫虛擬網絡卡的字元處理程式tun_read(),讀取到裝置上的資料包,對讀取的資料包使用SSL協議做封裝處理後,通過socket系統呼叫經過物理網絡卡傳送出去。

2)接收資料

物理網絡卡接收資料包,經過核心TCP/IP上傳到OpenVPN,OpenVPN通過link_socket_read()接收資料包,使用SSL協議進行解包處理,經過處理的資料包OpenVPN呼叫虛擬網絡卡的字元處理程式tun_write()寫入虛擬網絡卡的字元裝置,裝置驅動程式完成資料從使用者區到核心區的複製,並將資料寫入skb連結串列,然後呼叫網絡卡netif_rx()接收程式,資料包再次進入系統TCP/IP協議棧,傳到上層應用程式。

簡單來說,openvpn的核心就是虛擬網絡卡,客戶端和伺服器的openvpn程式安裝好之後,先開啟伺服器程式,伺服器上會開啟一個名為tun/tap的虛擬網絡卡, 其地址是openvpn程式根據配置檔案中配置的虛擬地址網段分配的地址,當客戶端開啟程式時,會根據配置檔案中配置的服務端外網地址及埠對伺服器發起第一次連線請求,伺服器接收到請求後,會給客戶端分配一個虛擬網段的地址,並給客戶端推送伺服器內網的地址,客戶端接收到伺服器的訊息後,根據分配的地址在本地開啟一個 名為tun的虛擬網絡卡,並把推送的內網地址新增到路由指向虛擬網絡卡,此後客戶端對伺服器內網發起請求後會通過路由傳送到虛擬網絡卡上,客戶端與伺服器就建立了一個隧道,其資料流向下圖:

伺服器:

eth0:  211.1.1.4

Tun:   192.168.1.1

Openvpn port: 9999

內網:10.0.13.1/24

客戶端:

eth0:  211.1.1.3

tun:   192.168.1.2

路由:10.0.13.0  255.255.255.0  tun