吳兆芝,曲 波
(南京曉莊學院,江蘇 南京 211171)
隨著Internet技術的不斷發(fā)展與普及,計算機網絡規(guī)模日益龐大,結構越來越復雜,各種信息系統(tǒng)、商務系統(tǒng)都開始在網上運作,越來越多的服務器出現(xiàn)在網絡環(huán)境中.有效地實施對網絡服務器的監(jiān)控、保證服務器上各種服務的正常運轉變得至關重要.當前流行的網絡管理方式主要是靠簡單網絡管理協(xié)議SNMP實現(xiàn).SNMP要求被管理主機支持SNMP協(xié)議并安裝相應的SNMP代理系統(tǒng),其主要的性能優(yōu)勢在于監(jiān)視而不是控制.另一種實現(xiàn)方法就是通過telnet協(xié)議.這種方法要求用戶通過telnet客戶端登錄到遠程服務器主機,然后轉換到超級用戶身份,對遠程服務器進行監(jiān)控管理.由于當前流行的各種網絡操作系統(tǒng)(Windows、Linux、Unix等)都支持TCP/IP協(xié)議,因此都隨機安裝了telnet服務器,為遠程客戶端提供telnet服務.但是整個過程需要網管用戶手工操作,無法自動完成.筆者所設計的遠程監(jiān)控系統(tǒng),為管理用戶提供基于Web的瀏覽器管理界面,避免繁瑣的手工操作,在CGI程序中通過telnet協(xié)議[1]對遠程服務器主機進行監(jiān)控管理,直接利用被監(jiān)控服務器主機telnet服務的強大功能,使用telnet協(xié)議對其進行遠程監(jiān)控管理,不需修改被監(jiān)控主機的軟硬件環(huán)境與配置.總體結構見圖1.本系統(tǒng)在Linux操作系統(tǒng)下用C語言編程實現(xiàn)[2,3].
圖1 網絡安全監(jiān)控系統(tǒng)總體結構
Telnet協(xié)議是TCP/IP協(xié)議族中的一員,是Internet遠程登錄的標準協(xié)議.應用Telnet協(xié)議能夠把本地用戶所使用的計算機變成遠程主機系統(tǒng)的一個終端.
Telnet定義了在用戶終端和遠端服務之間的通信.該協(xié)議規(guī)格說明假定終端是由鍵盤和顯示屏組成的,其中,用戶可用鍵盤來輸入字符、用顯示屏來顯示多行文本.
(4)環(huán)境變量是Web服務器與CGI通信的重要手段,客戶端的特征信息和查詢信息都是通過環(huán)境變量提供給CGI的.嵌入式Web服務器不僅實現(xiàn)了公共網關協(xié)議CGI所要求的環(huán)境變量,還將客戶端請求首部中的各行信息全部轉化為環(huán)境變量,從而為CGI提供了更豐富的客戶端信息.
大多數(shù)Telnet的實現(xiàn)用有限狀態(tài)機FSM(finite state machine)來說明命令序列的確切語法以及對命名序列的解釋.作為一個規(guī)格說明工具,有限狀態(tài)機提供了對協(xié)議的精確描述.它確切地說明了發(fā)送方如何在數(shù)據(jù)流中嵌入命令序列,同時,它也確切說明了接受方如何解釋這種序列.更為重要的是,有限狀態(tài)機可以直接被轉換成遵從該協(xié)議的程序.因此,可以驗證最終的程序是否符合協(xié)議規(guī)格說明.
(1)TCP/IP標準網絡服務一般可有兩種實現(xiàn)方式,一種是利用系統(tǒng)的超級服務器負責接收用戶請求,然后調用相應的服務器程序;一種是創(chuàng)建服務器守護進程,由服務器守護進程直接接收用戶請求.前者適用于訪問頻度較低的網絡服務.筆者采用守護進程方式工作,利用Linux提供的daemon函數(shù)實現(xiàn).
這種對請求的響應為請求的發(fā)送方提供了一個確認,它告訴發(fā)送方接受方是否兌現(xiàn)該請求.例如,啟動時,客戶機和服務器協(xié)商決定哪一方回顯用戶鍵入的字符.通常情況下,客戶機向服務器發(fā)送字符而服務器將其回顯到用戶的終端上.但是,如果網絡的時延會引起一些麻煩時,用戶可能更愿意讓本地系統(tǒng)回顯字符.在客戶機允許本地系統(tǒng)回顯前,它要向服務器發(fā)送以下序列:IAC DONT ECHO.服務器收到請求后,發(fā)出三個字符的響應:IAC WONT ECHO.
一旦客戶機同意處理終端類型選項,服務器就使用選項子協(xié)商來請求終端名.與具有固定長度的正常選項不同,子協(xié)商允許發(fā)送方在數(shù)據(jù)流中插入任意長的字符串.為此,發(fā)送方通過發(fā)送子協(xié)商首部(subnegotiation header)、某個特定選項的子協(xié)商的數(shù)據(jù),以及表示子協(xié)商結束的尾部,來把一個字符串分開.
從客戶機到服務器溝通終端類型需要兩個步驟.首先,服務器詢問客戶機它是否承諾termtype選項.其次,如果客戶機同意承諾終端類型選項,服務器就使用選項子協(xié)商,請求一個識別用戶終端類型的字符串.
Telnet所蘊含的思想是簡單的:無論何時,只要客戶機或服務器要發(fā)送命令序列而非正常的數(shù)據(jù),它就在數(shù)據(jù)流中插入一個特殊的保留字符.該保留字符叫做:“解釋為命令”(IAC,Interpret As Command)字符.當接受方在一個入數(shù)據(jù)流中發(fā)現(xiàn)IAC字符時,它就把后繼的字節(jié)處理為一個命令序列.當要把IAC作為數(shù)據(jù)發(fā)送時,發(fā)送者將在它前加一個額外的IAC字符.一個單獨的命令序列可包含一個可選請求(option request)或可選回答(option reply).一個請求詢問接受方兌現(xiàn)或不兌現(xiàn)某個特殊的Telnet選項;一個應答對請求進行確認,并指明接受方是否兌現(xiàn)該請求.
跟在回顯選項后,服務器會發(fā)送WILL或WONT,用以通知客戶機它愿意回顯字符,或它希望停止字符的回應.
協(xié)議定義了兩個動詞,用于發(fā)送方形成請求:DO或DONT.一般來說,接受方要用動詞WILL或WONT來響應請求.接受方發(fā)送WILL以指明它將兌現(xiàn)所要求的選項,或者用WONT指明它不兌現(xiàn)該選項.
Telnet允許連接的一方在另一方提出請求之前,就提供(offer)某個特定的選項.為了做到這一點,提供執(zhí)行(或不執(zhí)行)這種選項的一方要發(fā)送一個包含動詞WILL或WONT的報文.因此,WILL或WONT要么是對前面的請求的確認,要么是執(zhí)行該選項的供給.
服務器發(fā)送DO或DONT報文,告訴客戶機它應該允許或禁止某個指定的選項.如果客戶機同意承諾該選項,它就通過發(fā)送WILL做出響應;如果它不同意承諾該選項,便發(fā)送WONT.當客戶機不支持某個特定選項時,它就調用相應的過程,發(fā)送WONT告訴服務器它不支持該選項.
由于FSM必須使狀態(tài)和輸入字符的所有可能組合都有一個動作,這樣可定義一個空操作用于不需要任何動作的那些轉移.例如,從狀態(tài)TSDATA到TSIAC的轉移不需要任何動作.
MVC的主要思想體現(xiàn)在,前端View使用Vue的axios發(fā)送異步請求傳遞到Controller,Controller去Model中讀取或者寫入數(shù)據(jù),Model通過EF操作數(shù)據(jù)庫,Controller將邏輯處理后的結果以JSON的格式傳輸給前端。經過該一系列操作后還能得知系統(tǒng)的前后端數(shù)據(jù)是如何進行傳輸?shù)摹?/p>
通過對Telnet協(xié)議及其客戶機原理的分析,筆者設計了一個簡化的有限狀態(tài)機.該狀態(tài)機采用一個while循環(huán),對來自服務器端的字符逐一檢查,并根據(jù)當前所處狀態(tài)進行相應的操作和實現(xiàn)狀態(tài)轉移.
嵌入式Web服務器的目的是以最少的代碼實現(xiàn)Web[4]服務器基本功能:
(3)只處理GET、POST請求.
Telnet是一個面向字符的協(xié)議,在傳送數(shù)據(jù)時使用標準編碼.除了字符數(shù)據(jù)外,Telnet還允許客戶機同服務器交換命令(command)或控制信息(control).因為客戶機和服務器之間的所有通信都是通過一個TCP連接進行的,所以協(xié)議特別安排了對命令或控制信息的編碼,使接受方可以把它們從正常的數(shù)據(jù)中區(qū)分出來.因此,協(xié)議的許多地方都側重于定義發(fā)送方如何對命令解碼,以及接受方如何識別它們.
嵌入式Web服務器通過SSL[4]協(xié)議實現(xiàn)安全Web服務.基于SSL的Web服務器與客戶端建立連接后,需為客戶端提供服務器端的認證證書,以此來證明服務器身份.一般來說該證書應由第三方認證機構提供.但常用的客戶端瀏覽器也允許服務器端使用所謂“自認證證書”,這為SSL服務器應用帶來了很大方便.筆者采用服務器“自認證證書”為客戶端瀏覽器提供認證證書,效果很好.
根據(jù)血型的遺傳規(guī)律,含有高頻抗原抗體的稀有血型患者,在近親和家屬中找到相同稀有血型的概率遠大于在人群中成功匹配血液的概率。據(jù)報道,北京2000—2011年發(fā)現(xiàn)了7例稀有血型患者,其中3例通過親屬互助獻血解決輸血困難[21]。
由于所有的CGI模塊都包含在一個CGI程序中,所以對不同CGI模塊的調用就不能再用CGI文件名,而是使用不同的URL查詢串.例如,關閉或熱啟動遠程主機,可在客戶機瀏覽器中分別使用下列URL:
https://monitor_host/monitor?cgi=shutdown
https://monitor_host/monitor?cgi=reset
目前絕大多數(shù)網絡設備都在內部配置了Telnet服務器,供管理員通過遠程登錄對設備進行管理與配置.本系統(tǒng)通過Telnet協(xié)議訪問受控主機,不需要在受控主機上額外安裝任何軟件,適用于管理各種服務器主機、交換機及路由器等網絡設備.本系統(tǒng)在RedHat Linux 9.0操作系統(tǒng)下,用C語言編程實現(xiàn),由Web服務程序tms.c和Telnet協(xié)議CGI程序tns.c兩個程序模塊構成,源代碼約1500行.由于通過Telnet協(xié)議可最大限度地管理和控制目標主機,本系統(tǒng)的控制能力明顯優(yōu)于采用SNMP協(xié)議的管理系統(tǒng).
盡管Telnet協(xié)議沒有經過加密處理,但在本文系統(tǒng)中Telnet通信是在受控主機與Web服務器之間進行的.用戶客戶端使用SSL安全協(xié)議訪問Web服務器,通過Web服務器控制受控主機,并不直接與受控主機打交道.只要使用簡單的手段保證受控主機與Web服務器之間的通信安全,如二者設為同一網段、共同放在安全區(qū)內等,就不會由于使用Telnet協(xié)議而降低系統(tǒng)的安全性.
參考文獻:
[1][美]Douglas E.Comer & David L.Stevens.Internetworking With TCP/IP Vol.III:Client-Server Programming and Applications[M].Second Edition.北京:清華大學出版社(英文影印版),1998.
[2][美]Marc J.Rochkind.Advanced UNIX Programming[M].北京:清華大學出版社(英文影印版),2006.
[3][美]Love,R.Linux System Programming[M].南京:東南大學出版社(英文影印版),2008.
[4][美]Andrew S.Tanenbaum.Computer Networks[M].Fourth Edition.北京:清華大學出版社(英文影印版),2008.