telnet
是一個很傳統的連線程式,它除了用來上 BBS 之外,也可以用來當做診斷各種伺服器與網路連線問題。
在早期網路剛發展起來的時候,BBS 在台灣非常流行,尤其是在各高中與大學院校,幾乎都有自己的 BBS 站,在台灣應該每個大學生都上過 BBS。
BBS 所使用的通訊協定就是 TELNET,而在 Linux 系統中也有一個小程式叫做 telnet
(其實 Windows 與 Mac OS 中也有),這個程式可以讓你使用 TELNET 通訊協定來跟遠端的伺服器溝通,上 BBS 就是一個最常見的例子。
但是大家可能不知道,
telnet
除了用來上 BBS 之外,它其實也可以做為一個很專業的伺服器與網路診斷工具,早期許多系統管理者都會使用 telnet 來連線到遠端的主機,但是因為 TELNET 未經加密的協定,所以所有的資料都是以明碼在網路上傳遞,後來因為安全性的問題,大家漸漸改用 SSH 這種加密的連線,telnet
現在已經鮮少有人使用,除了那些沒有安全性顧慮的應用。
雖然 telnet
無法確保資料的安全,但是它在伺服器與網路的診斷上還是很有用的,對於系統管理者而言,它其實是一個很方便的網路連線工具,在建立連線之後,還可以利用 telnet
傳送各種指令,找出網路連線的問題所在。對於我個人而言,在一般命令列檢測伺服器與網路狀況時,也常常會使用 telnet
這個好用的小工具。
以下介紹如何使用 telnet
來檢查各種網路連線問題。
測試遠端 Ports
想要測試伺服器的某個 port 是否有正常開啓並且處於傾聽(listening)的狀態有很多方式,例如圖形界面的一些 port 掃描程式、Nmap 或 nc 等,這些工具都很好用,但是這些好用的工具不見得在每個系統中都有安裝,像 Nmap 功能非常強大,但通常一般的系統預設都沒有安裝,而 telnet
則是一個很普遍的工具,幾乎每種系統中都會有 telnet
的存在,甚至一些嵌入式系統中也有,所以學習如何使用 telnet
也是很重要的。
下面示範如何測試 192.168.5.5
這台伺服器的 SMTP port(port 25)是否正常:
telnet 192.168.5.5 25
輸出為
Trying 192.168.5.5…
telnet: Unable to connect to remote host: Connection refused
在這個例子中遠端這台伺服器的 SMTP port 並沒有開啓,所以這時候就需要看看這台伺服器出了什麼問題。
如果這台伺服器的 SMTP port 是有正常開啓服務的,那麼在這個時候你就可以直接輸入 SMTP 的指令了,關於 SMTP 通訊協定請參考 Wiki 的說明。
從上面這個範例你應該會發現 telnet
的用法就是直接指定連線主機的位址(IP address 或 hostname)與連接埠(port),就可以建立連線了,如果沒有指定連接埠,則 telnet
會使用預設的 23
埠(也就是 TELNET 協定的連接埠)。
如果你想測試一台網頁伺服器是否正常運作,就可以直接連線至該伺服器的 80
埠,就像這樣:
telnet www.example.net 80
診斷 Web Servers
當你使用 telnet
連線至伺服器的 80
埠時,你可以直接送出 HTTP 的指令來測試伺服器是否正常。一開始我們會先看看連線是否正常:
telnet www.example.net 80
輸出為
Trying 192.168.5.5…
Connected to www.example.net.
Escape character is ‘^]’.
當成功連線至伺服器之後,就可以送出一般的 HTTP 指令來取得網頁資料,下面是使用 HTTP 協定的 GET
指令的範例,並且指定 host
:
GET / HTTP/1.1 host: www.example.net
這裡的 GET
指令指定了網頁路徑(/
)與協定的版本(HTTP/1.1
)。因為現今的網頁伺服器通常都會以 virtual hosts 的方式同時服務好幾個網站,所以要使用 host
來指定想要連線的網站,如果你想看該網站中其他的網頁,可以在 GET
指令中自行指定網頁的路徑,例如 GET /forum/.
等,如果你的打字速度不夠快,很可能會因此造成連線逾時,然後斷線,你可以事先把指令打好,用複製貼上的方式來避免這個問題。
當你按下最後一個 Enter 鍵送出指令之後,就換看到類似下面這些伺服器送出來的資料:
HTTP/1.1 200 OK
Date: Tue, 10 Jul 2012 04:54:04 GMT
Server: Apache/2.2.14 (Ubuntu)
Last-Modified: Mon, 24 May 2010 21:33:10 GMT
ETag: “38111c-b1-4875dc9938880”
Accept-Ranges: bytes
Content-Length: 177
Vary: Accept-Encoding
Content-Type: text/html
X-Pad: avoid browser bug
<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content
has been added, yet.</p>
</body></html>
這個是 Apache 伺服器預設網頁的內容,下半部就是一般的 HTML 網頁,而上半部則是伺服器傳送給瀏覽器的一些標頭資訊,這些都是除錯時很有用的資訊,像第一行的 HTTP/1.1 200 OK
表示輸入的指令經過網頁伺服器處理之後,結果沒有問題,而 Last-Modified
則是標示該網頁的修改時間。
當獲得這些資訊之後,就可以輸入 Ctrl + ]
回到 telnet
的提示字元環境,然後輸入 quit
離開 telnet
。
telnet
通常只適用於處理一些簡單的伺服器檢測,如果牽涉到使用者認證或重新導向這類複雜的問題,可能就要選擇像 curl
這類的工具,或是找一些更強大的圖形介面瀏覽器來處理了。
傳送 E-mail
telnet
除了可以檢測網頁伺服器是否正常之外,也可以用於處理 E-mail 伺服器的問題,他好用的原因在於你可以很方便的使用一些簡潔的 telnet
指令來傳送一封 E-mail。
檢測 E-mail 伺服器的第一步就是使用 telnet
連線到伺服器的 25
埠:
telnet mail.example.net 25
輸出為
Trying 192.168.5.5…
Connected to mail.example.net.
Escape character is ‘^]’.
220 mail.example.net ESMTP Postfix
這裡的 SMTP 協定與 HTTP 不同,當你建立一個新連線時,伺服器會先送出一行資訊給你,告訴你連線已經建立成功了,而這台 SMTP 伺服器的系統是 Postfix。
這個時候,就可以開始送出 SMTP 的指令了,首先送出一個 HELO
指令,告訴伺服器我們自己的位址資訊:
HELO lappy486.example.net
輸出為
250 mail.example.net
像這種互動式的通訊協定有一個好處,就是當我們輸入錯誤或是碰到一些問題時,伺服器會立即反映出來,而如果都正常的話,伺服器就會回應 250
表示一切正常。
在送出 HELO
指令之後,接著可以使用 MAIL FROM:
指令來指定要顯示的寄件人電子郵件位址(事實上這個寄件人電子郵件位址是可以隨便輸入的,這也是很多廣告信常做的事):
MAIL FROM: <root@example.net>
輸出為
250 Ok
在以前的 Postfix 伺服器上寄信時,電子郵件位址可以不需要加上小於與大於的符號(<>),但是有些比較嚴格的伺服器好像都會要求要加,否則他就會告訴你電子郵件位址的格式錯誤。
當輸入完寄件人的電子郵件之後,接著輸入收件人的電子郵件:
RCPT TO: <postmaster@example.net>
輸出為
250 Ok
這裡伺服器回應 250 的意思就是輸入的資料沒有問題,接著使用 DATA
指令來輸入主要的信件內容:
DATA
輸出為
354 End data with <CR><LF>.<CR><LF>
這裡就開始輸入內容,有一些信件中其他的欄位也可以在這裡一並輸入,像是信件的標題(subject)等,所有的資料都輸入完成後,最後一行要輸入單一個句點,代表資料輸入完畢。
Subject: Give Telnet a Chance 1 Hi, All we are saying is give telnet a chance. .
輸出為
250 Ok: queued as 52A1EE3D117
這樣信件就送出去了。
當我們在使用 telnet
測試 E-mail 伺服器的時候,可以在信件標題上加上一個流水號,這樣就可以比較清楚看出哪幾封信件有正常送出,而哪幾封異常。
當信件送出之後,就可以輸入 quit
指令,中斷與伺服器的連線。
quit
輸出為
221 Bye
Connection closed by foreign host.
現在我們介紹完一些以 telnet
來診斷伺服器與網路的方法,希望大家從此不要直接認為 telnet
不能加密就把它都進垃圾桶,在某些狀況下它其實還是很有用的。
除了這裡介紹的測試範例之外,telnet
也可以用於其他許多的伺服器與網路連線問題的檢測,基本上如果你對於一般的 TCP/IP 通訊協定有一定的瞭解,你應該就能體會到,只要你了解某種協定的指令用法,就可以利用 telnet
來跟該協定的伺服器溝通,所以其實只要是建立在 TCP/IP 的通訊協定,大部分都可以利用這樣的方式來檢測。
參考資料:Linux Journal