OpenVPN高級路由技術(shù)
OpenVPN內(nèi)部路由和系統(tǒng)的路由之間的區(qū)別在于,系統(tǒng)路由完全照著最長前綴匹配原則,找到路由之后,將數(shù)據(jù)包從對應(yīng)的網(wǎng)卡接口轉(zhuǎn)發(fā)出去。而 OpenVPN內(nèi)部的路由雖然最終也是決定是否轉(zhuǎn)發(fā)并且往哪里轉(zhuǎn)發(fā)數(shù)據(jù)包,然而這個“是否轉(zhuǎn)發(fā)”以及“往哪里轉(zhuǎn)發(fā)”是和系統(tǒng)路由大大不同的,OpenVPN是否轉(zhuǎn)發(fā)數(shù)據(jù)包依照的其內(nèi)部的一張路由表而和系統(tǒng)的路由表沒有關(guān)系,往哪里轉(zhuǎn)發(fā)呢?其實是往兩個地方轉(zhuǎn)發(fā),根據(jù)查找內(nèi)部路由得到的結(jié)果,如果目的地址不是其它OpenVPN客戶端的或者這些OpenVPN客戶端后面的網(wǎng)絡(luò)主機的,那么就往自己的虛擬網(wǎng)卡中轉(zhuǎn)發(fā),如果目的地址是其它 OpenVPN客戶端的或者其后面網(wǎng)絡(luò)的,那么在開啟C2C的情況下,直接轉(zhuǎn)發(fā)到對應(yīng)OpenVPN的socket,轉(zhuǎn)發(fā)前用對應(yīng)的socket實例的安全參數(shù)進行OpenVPN協(xié)議封裝,C2C是不是很像linux中的ip_forward內(nèi)核參數(shù)呢?
注意,前面的闡述中,我一直都在說目的地址,而沒有說目的IP地址,這是因為OpenVPN的內(nèi)部路由不僅僅是IP路由,在tap模式下,它的內(nèi)部路由實際上是鏈路層的路由,這時OpenVPN服務(wù)器不是一臺路由器,而是一臺交換機,還是一臺可以“動態(tài)學(xué)習(xí)MAC地址”的交換機,因此tap模式下,OpenVPN內(nèi)部路由其實就是交換機的鏈路層路由,其路由表其實就類似于交換機的MAC地址表。
OpenVPN內(nèi)部路由的職責(zé)有:
1.抉擇是否轉(zhuǎn)發(fā)到來的已經(jīng)解除了OpenVPN封裝的載荷數(shù)據(jù)包。也就是載荷包的發(fā)起者是否在OpenVPN的策略范圍內(nèi);
2.處理不同OpenVPN客戶端之間的通信以及不同客戶端后面所掛接的網(wǎng)段主機之間的通信。也就是說在上述這些主機之間路由數(shù)據(jù)包,注意這里所謂的路由并不是協(xié)議棧中的IP路由,而是OpenVPN內(nèi)部的路由。
OpenVPN可以通過內(nèi)部路由擴展成一個巨大的網(wǎng)絡(luò),該網(wǎng)絡(luò)直接穿越不安全的網(wǎng)絡(luò)區(qū)域,比如互聯(lián)廣域網(wǎng)或者城域網(wǎng),是這個擴展而成的巨大網(wǎng)絡(luò)真正的成了虛擬的和專用的,這就是OpenVPN對于網(wǎng)絡(luò)拓撲支持最強大的地方,OpenVPN另外的強大之處前面的文章都快說爛了,比如和SSL結(jié)合,和PKI結(jié)合等等,在和主機網(wǎng)絡(luò)協(xié)議棧結(jié)合處,OpenVPN使用了虛擬網(wǎng)卡,這也快說爛了,因此本系列文章著重談OpenVPN的強大路由功能。如果能徹底理解這個,那么相信你已經(jīng)理解了其它,進而閱讀源代碼和修改定制源代碼已經(jīng)不是什么困難事了,因此本系列文章不再冗余的分析源碼。
那么,被OpenVPN擴展而成的網(wǎng)絡(luò)到底是什么樣子呢?這要看你使用tap模式還是tun模式了:
tap模式下,VPN節(jié)點(多個客戶端和一個服務(wù)器端)組成了一個以太網(wǎng),而VPN服務(wù)器就相當(dāng)于一臺以太網(wǎng)交換機。由于以太網(wǎng)是IP協(xié)議棧下層的封裝,tap模式下的所有VPN節(jié)點以及節(jié)點后被bridge的節(jié)點組成了一個大的以太網(wǎng)而不是IP網(wǎng)絡(luò),OpenVPN內(nèi)部路由是作用于MAC地址的,對于任意來源IP,OpenVPN內(nèi)部路由都是直通的,寫入虛擬網(wǎng)卡后,由系統(tǒng)路由判決。因此tap模式下,如果需要各個VPN節(jié)點后面的網(wǎng)絡(luò)之間達到 IP互通的效果,那就必須要么做NAT映射,將VPN節(jié)點后面的網(wǎng)絡(luò)NAT到VPN節(jié)點,要么輔助以系統(tǒng)的IP路由,而這些配置很復(fù)雜,很難維護。見下圖:
tun模式下,VPN節(jié)點(多個客戶端和一個服務(wù)器端)以及其它允許接入的網(wǎng)絡(luò)(通過iroute配置)組成了一個IP網(wǎng)絡(luò),而VPN服務(wù)器就相當(dāng)于一臺IP路由器。tun模式下的所有VPN節(jié)點以及節(jié)點后被iroute內(nèi)部路由以及系統(tǒng)路由指向的節(jié)點組成了一個大的IP網(wǎng)。此模式下,內(nèi)部路由和系統(tǒng)路由共同起作用,OpenVPN的事件機制可以將這二者無縫結(jié)合。見下圖:
OpenVPN事實上通過定義良好的銜接口和既有的優(yōu)秀框架結(jié)合,這些銜接口分別是SSL協(xié)議/PKI,虛擬網(wǎng)卡/主機協(xié)議棧,內(nèi)部路由/事件機制/系統(tǒng) IP路由。OpenVPN既做到了機制的完整,和外部框架的結(jié)合,又給了用戶靈活的配置,因此,OpenVPN很棒。
原文博客:http://blog.csdn.net/dog250/article/details/6979231