使用 Telnet 診斷各種伺服器與網路連線問題

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
本站已經搬家了,欲查看最新的文章,請至 G. T. Wang 新網站

沒有留言:

張貼留言