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