Private Network Android 4.0 網路安全 平板裝置 VPN API 手機

Android 4.0開放VPN API 智慧手機資訊安全更有保障

2012-10-26
隨著消費者使用手機與平板裝置聯網的比重越來越高,手機與平板裝置的網路使用安全亦日益備受重視,VPN的需求因而水漲船高。不過,Android 4.0作業系統對於VPN的設定複雜,因此透過API自行撰寫VPN將較簡易。
隨著越來越多的智慧型手機開始上網,以往使用筆記型電腦和行動網卡的使用者,也習慣透過手機上網,尤其在手機功能越來越強大的現代。

如此一來,本來透過筆電上網和虛擬私有網路(VPN),存取公司資源的外部工作者,勢必也需要手機的VPN支援。

Google Android做為目前智慧型手機最主要的作業系統之一,本身就提供VPN功能給使用者。因此可在手機上新增、設定及管理VPN,透過此網路連線並存取特定網路,例如企業網路的資源。使用者可以根據公司或所使用的VPN類型,輸入登入憑證和/或安裝安全性憑證,接著連線到公司的區域網路,在已建立Wi-Fi或2G/3G數據連線的狀況下。

由於各種組織與環境大不相同,僅使用系統所提供的功能並不足以應付多樣化的需求,Google Play上為數眾多VPN軟體就是因為系統內建的功能不敷使用。但是礙於種種因素,先前Android並未全面開放這些功能給開發商,多數VPN的開發商都需要使用者對裝置進行越獄(Jail Break)後以取得最高權限,才得以使用其所提供的服務。

在2011年的Google I/O大會上發表的Android 4.0,除了有許多重要改進之外,其中跟企業網路最有關係的就是開放VPN應用程式介面(API)讓廠商得以進行客製化以符合企業本身的需求。

VPN是利用通道(Tunneling)、加解密等安全技術,在公眾網路如網際網路上,建構出虛擬的私有網路(Private Network),以達到私有網路本身的安全與便利性。

虛擬是指此通道並非實體上有專門的線路連接,乃是利用通訊協定的技術所形成的在兩個網路間,或遠端使用者與內部網路間建立一個虛擬隧道,並得以跨越網際網路。舉例來說,一般使用者家中固網所使用的撥接即是通道技術的一種,它是使用點對點通訊協定(Point-to-Point Protocol, PPP),在乙太網路上進行通訊。

對組織而言,當公司員工在外要跟公司的系統交換資料,若使用網際網路,則無法保證通訊安全。要保護穿越網際網路的VPN連線安全,首先要在網路上兩端設備之間建立一邏輯路徑,就是在網際網路上使用通道及加密建立一個私人、安全的網路。

Android早期版本已支援VPN

Android很早就支援VPN,目前Android 4.0所支援的VPN類型,包括PPTP、L2TP/IPSec PSK、L2TP/IPSec RSA、IPSec Xauth PSK、IPSec Xauth RSA與IPSec Hybrid RSA。可歸類為三大類型,包括點對點通道通訊協定(PPTP)、第二層通道通訊協定(L2TP)和IP加密協定(IPSec)。

PPTP藉由建立橫跨IP資料網路的VPN連線,將資料從遠端電腦安全地傳送到私人伺服器,且會支援公用網路,如網際網路上的指定要求、多重通訊協定及虛擬私人網路;L2TP是標準產業網際網路通道通訊協定,與PPTP的功能大致相同;而IPSec是針對網路層Internet Protocol的安全性協定。

IP中加入安全性協定的最大好處在於確保所有網路通訊的安全。亦即即使位於IP層上層的應用程式或傳輸層沒有提供任何安全性的機制,由於IP層加入安全機制,因此可保護整個網路通訊的內容。

Android VPN設定程序須經繁複下載

若採用Android提供的VPN,須透過瀏覽器或供應商App使用網路管理員下載並安裝安全性憑證,因此先在手機上設定安全憑證的儲存位置,其流程如下:

第一步在主螢幕上,按下MENU,接著點選設定-->安全性,然後點選設定密碼。第二步輸入憑證儲存空間密碼(至少8個字元,不可包含任何空格)。第三步向下捲動並確認密碼,然後點選確定。第四步選取使用安全憑證核取方塊。第五步下載並安裝存取區域網路所需要的憑證後,新增VPN連線。第六步在主螢幕上,按下MENU,然後點選設定-->無線和網路-->VPN設定。第七步點選新增VPN,然後點選想要新增的VPN類型。第八步點選VPN設定,然後依照向網路管理員取得的安全性詳細資料,進行所需要的設定。第九步按下MENU,然後點選儲存,此VPN就會加入VPN設定畫面的VPN區段中。第十步連線到VPN,在主螢幕上,按下MENU,然後點選設定-->無線和網路-->VPN設定。並在VPN區段中,點選想要連線的VPN。第十一步出現提示時,輸入登入憑證,然後點選連線。連線之後,標題列的通知區就會出現VPN圖示。接著就可開啟網頁瀏覽器,存取企業網路上的各項資源,例如企業內部網站等。若要中斷VPN,則從畫面頂端滑動開啟通知面板,點選VPN連線。最後返回VPN設定畫面,然後點選VPN連線,與其中斷連線,手機與VPN中斷連線後,標題列的通知區就會出現已中斷VPN圖示。

由上述步驟可看出,Android系統所提供的VPN設定繁複且冗長,對於首次操作或不熟悉系統的使用者有相當難度,可能會造成無法使用該服務。

Android 4.0開放VPN

由於以上的操作流程對許多使用者造成困擾,所以提供VPN的廠商紛紛推出自行開發App,以減少使用者操作流程,降低錯誤發生機會。不過在Android 4.0前的版本,這樣的解決方案通常須經過越獄才得以進行,讓整個VPN生態蒙上陰影。

所幸Google最後從善如流,在不影響安全及穩定性的前提下,開放VPN功能。

以下開始實作VPN,對於沒有開發過Android程式的讀者可以上http://developer.android.com找到需要的資源,對於一般的開發人員,開發工具及套件甚至是作業系統都是可以完全免費取得,不用擔心費用及授權的問題。

實作Client Activity

圖1 VpnClient.java程式碼
圖1程式主要的功能完全在畫面的配置與設定,跟VPN的主要動作沒有太大的關係。除畫面的配置還加入了一個onClickListener用來監聽按鈕的動作,以下是詳細說明:

第9行選擇要使用的Activity的Layout。第11~13行提供三個輸入方塊,分別給使用者輸入Address、Port number和Password,其中密碼是用來給Server進行驗證用。第15行將clickListener和按鈕做連結,以偵測按鈕行為。第20行使用vpnService.parpare進行VPN物件初始化。第21~25行為若取得intent,就呼叫startActivityForResult執行相對應的程式,如果失敗,就手動建立intent在進行程式的呼叫,而intent用法請參考Android相關書籍以提供更詳盡的資訊。第32行將相關訊息手動設定給intent當參數。第38行正式起始VPN service。

一般來說,要繪製介面通常都是由程式設計師透過一行一行的程式碼將圖形畫在螢幕上,但是介面通常須經不斷的修正和討論,如果每次的小修改都要大幅度的調整程式,不但造成資源浪費,也讓合作關係變得很不好,因此Android將介面的部分獨立成XML檔案,這樣一來就可以交給專業的使用者介面設計人員,利用進入門檻較低的XML進行設計,讓程式設計師專心在處理資料的邏輯。

除一開始寫程式進行整個配置的宣告,XML中定義三個文字方塊提供使用者輸入,並且還加上一個按鈕,讓一開始的vpnClient.java加入畫面中,即使不是一個程式設計師也可看出端倪。

Clint Service的實作程式碼礙於篇幅僅列出部分,對於想自行實作的讀者請參考資料所提的原始碼。

實作Client Service

圖2 Client service程式碼
圖2為在Android手機上主要的Service程式,會在啟動後進入背景執行,不會因為程式的切換而中斷,除非使用者透過上述的Activity中斷或者由系統中斷。執行後會在畫面的左上角出現一個鑰匙的圖案,表示VPN正在執行中。

第1行實作handler和runnable介面,前者作為與系統溝通的橋樑,後者用來作為VPN連線的依據。第2~10行首先宣告一些必要的元件。第15~17行建立handler以便跟系統溝通。第19~21行中斷先前的VPN,如果存在。第23~25行取得必要的參數資訊。第28~29行建立本次的VPN連線session。第35~36行當Android系統關閉本程式時,把連線中斷。第42~43行把訊息通知系統以顯示在畫面上。第53~54行取得網路相關參數,並建立socketServer。

第56~63行嘗試連線十次,若連線失敗就暫停三秒後重新連線,如果連線成功就將連線次數重設為0,每次連線會在畫面上顯示連線訊息。第69~77行斷線後釋放資源,並且在畫面上顯示斷線訊息。第86~92行建立一個UDP的連線並且保護該連線不受到資料轉向的影響,最後連線到先前所指定的伺服器位置。由於建立VPN後,所有的對外封包都會透過VPN連線出去,如果不保護VPN,將其從導向的資料流中隔離,就會造成所有的資料流導向VPN,然後VPN又導向給自己,形成迴路。

第93~97行由於只採用一個thread處理VPN,因此必須將它設定為non-blocking,以做到傳送及接受功能,接著做UDP的handshake,成功之後就將已連線的flag設定為true,並且在畫面上顯示訊息。第99~105行建立對外的輸出以及輸入串流,並且建立緩衝區。第107~122行使用timer和idle作為flag,以避免只傳送不接受或只接收部傳送以及辨識目前是否正在傳送或接收資料,接著將所收到的資料經由輸出串流傳送出去。

第124~136行是進行接收的動作。第138~156行為如果沒有立即的資料必須傳送或接收就暫停0.1秒,接著等待接受一段時間後再傳送,最後如果傳送過後太久沒有接收到訊息則發出timeout。第163~168行為如果有任何問題出現中斷迴圈,就斷線處理。第173~193行這裡的handshake主要是處理簡易的密碼和資訊的交換,一開始會向伺服器傳送密碼,該密碼必須要伺服器設定好,以便做驗證。伺服器收到密碼並且經過驗證後,會向客戶端發送相關的參數,同樣的這邊會發送三次,並且進行等待,每次等待的間隔為0.1秒,最後如果還是無法驗證或得到參數值,則發出timeout。

第196~241行configure主要的功能在組合伺服器傳送過來的參數,作為建立VPN連線使用。一開始會先確認該參數是否跟先前建立的VPN一樣,如果相同,則表示這是第二次建立,那就不用再新增加介面以減少系統負擔,若不是,則對伺服器傳送過來的參數進行分析,並且最後建立一個全新的介面給VPN使用。

VPN Server程式碼實作

圖3 VPN Server程式碼
有Android的客戶端,自然需要一個伺服器端才能做到完整的VPN功能,使用C++作為伺服端的開發語言並且在Linux作業系統上測試,也可使用C改寫。圖3為程式碼礙於篇幅僅列出部分。

第3~15行取得接下來伺服端執行的行前準備中所建立的系統介面。第18~51行從介面中取得所需的串流,準備將來做為資料傳送的標的。第54~80行在接下來的伺服端程式執行時會在命令列附加參數作為將來要傳送給客戶端的訊息。

第87~101行為如果使用者輸入錯誤的格式就顯示提示訊息。第103~107行取得系統介面及相關準備。第109~172行的動作跟客戶端類似,同樣須先把連線設定為non-blocking後開始準備接收。在收到客戶端的連線後首先會檢查傳送過來的代號,確認與本地端相符後傳送參數給客戶端。

伺服器端執行準備不可少

在執行程式以前,必須對系統做一些準備動作。一般的系統預設是不提供VPN的功能,所以必須告訴系統核心所要的東西,才能讓伺服端的程式可正確將封包導向系統介面,達到轉送的目的。

echo 1 > /proc/sys/net/ipv4/ip_forward指令為告訴核心需要封包的轉送功能的支援。iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE指令為告訴系統將防火牆NAT轉送的功能打開,並指定IP範圍。ip tuntap add dev tun0 mode tun指令建立一個虛擬的Tunnel通道介面。ifconfig tun0 10.0.0.1 dstaddr 10.0.0.2 up指令設定該通道的IP。./VpnServer tun0 8000 test -m 1400 -a 10.0.0.2 32 -d 8.8.8.8 -r 0.0.0.0 0指令為經過編譯後,執行伺服端程式,指定密碼為test,port為8000並且給定客戶端IP。

手機與平板VPN需求起

手持行動裝置的普及率已超越筆電,在未來的移動市場中不會只有筆電需要VPN。

Android原生VPN沒有彈性,要達到相當客製化水準所須操作的步驟繁雜,伺服端設定也不容易。使用VPN API所提供的空間來自行開發,不但方便,伺服端的操作人員也擁有最大的控制權,可以第一時間了解情況並做最佳的處理。

(本文作者任職於資策會智通所)

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!