使用 Telnet 进行故障排除

作者:Kyle Rankin

可怜的 telnet,它曾经可是个香饽饽。 以前系统管理员需要连接远程服务器时,都指望着它。 可惜 Telnet 不善于保密,所有通信都是明文传输,所以管理员们开始转用 SSH 来进行加密的远程 shell 会话。 当然,随着这种转变,那些还在用 Telnet 的管理员也被人瞧不起了。 最终,Telnet 就成了个被人嫌弃的家伙——只有那些不顾安全、老掉牙的家伙才会用它。

但我个人认为 telnet 并非一无是处。 没错,它不能保密,但它仍然可以在服务器机房中做很多有用的事情。 实际上,telnet 只是为您提供了一种连接到网络端口并发送命令的便捷方式。 Telnet 可以很好地诊断许多仍然在其协议中接受明文命令的服务的故障。 事实上,当进行故障排除时,它是我首选的命令行程序之一。 在本专栏中,我将给 telnet 第二次机会,并描述如何使用它来执行一些常见的故障排除任务。

测试远程端口

有很多不同的方法可以测试系统上是否正在侦听网络端口,包括 GUI 端口扫描器、Nmap 和 nc。 虽然所有这些方法都很好用,甚至我自己也发现自己使用 Nmap 的频率更高,但并非所有机器都安装了 Nmap。 然而,几乎每个系统都包含 telnet,包括许多具有 BusyBox 环境的嵌入式系统。 因此,如果我想测试 SMTP 端口(端口 25)是否正在 IP 为 192.168.5.5 的服务器上侦听,我可以键入


$ telnet 192.168.5.5 25
Trying 192.168.5.5...
telnet: Unable to connect to remote host: Connection refused

在这种情况下,远程端口不可用,因此我将回退到其他一些故障排除方法来查明原因。 如果端口是打开且可用的,我可以直接开始键入 SMTP 命令(稍后会详细介绍)。

从上面的示例中可以看出,语法是键入命令 telnet,要连接的 IP 或主机名,以及远程端口(否则它将默认为端口 23,即 telnet 的默认端口)。 因此,如果我想测试 Web 服务器,我会连接到 HTTP 端口(端口 80)


$ telnet www.example.net 80
Web 服务器故障排除

当您连接到端口 80 时,您不妨实际向其发送一些 HTTP 命令,并测试它是否正常工作。 首先,您要确保您实际上已连接


$ telnet www.example.net 80
Trying 192.168.5.5...
Connected to www.example.net.
Escape character is '^]'.

连接后,您可以传递基本的 HTTP GET 请求,以请求默认索引页,后跟您要连接的主机


GET / HTTP/1.1
host: www.example.net

GET 请求指定要使用哪个页面 (/) 以及要使用的协议 (HTTP/1.1)。 由于现在大多数 Web 服务器最终都从同一个端口托管多个虚拟主机,因此您可以使用 host 命令,以便 Web 服务器知道将您定向到哪个虚拟主机。 如果您想加载其他网页,您可以将 GET / 替换为,例如,GET /forum/。 如果您键入速度不够快,您的连接可能会超时,如果发生这种情况,您始终可以复制并粘贴命令。 键入命令后,最后按一次 Enter 键,您将获得许多通常看不到的标头以及实际的 HTML 内容


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 Web 服务器页面,但在这种情况下,HTML 输出只是等式的一部分。 在此输出中同样有用的是您从 HTTP/1.1 200 OK 回复代码到网页上的修改日期,再到 Apache 服务器版本获得的所有标头。 发送完命令后,只需按 Ctrl-] 和 Enter 即可返回到 telnet 提示符,然后键入 quit 退出 telnet。

我通常只使用 telnet 进行一些基本的 HTTP 故障排除,因为一旦您进入身份验证、跟踪重定向和协议的其他更复杂部分,使用像 curl 这样的命令行工具会简单得多,或者我想如果您必须使用 GUI Web 浏览器也可以。

发送电子邮件

虽然我只是使用 telnet 进行基本的 Web 服务器故障排除,但 telnet 最终成为我首选的电子邮件故障排除工具,主要是因为它只需几个 telnet 命令即可轻松发送完整的电子邮件。

第一步是与要测试的邮件服务器在端口 25 上建立 telnet 连接


$ telnet mail.example.net 25
Trying 192.168.5.5...
Connected to mail.example.net.
Escape character is '^]'.
220 mail.example.net ESMTP Postfix

与连接到 HTTP 服务器时可能获得的空白提示符不同,使用 SMTP,您应该立即收到回复。 在这种情况下,回复告诉我我正在连接到 Postfix 服务器。 一旦我收到 220 提示符,我就可以开始键入 SMTP 命令,首先是 HELO 命令,该命令让我告诉邮件服务器哪个服务器正在连接到它


HELO lappy486.example.net
250 mail.example.net

此处交互式 SMTP 连接的好处是,如果我确实在命令中输入了错误或犯了错误,它应该会让我知道; 否则,我应该收到 250 回复。 在 HELO 之后,您可以使用 MAIL FROM: 命令列出电子邮件应显示的发送电子邮件地址。 我说“应显示为来自”,因为您可以在此处放置几乎任何您想要的电子邮件地址,这也是不盲目信任 FROM 地址的一个很好的理由


MAIL FROM: <root@example.net>
250 Ok

过去,我过去常常直接键入电子邮件地址,而不将其用 <> 包围。 我的个人 Postfix 服务器对此没有问题,但其他邮件服务器更严格,如果您不将电子邮件地址用 <> 包围,它们会回复语法错误。 由于此 FROM 地址已被接受,您可以继续使用 RCPT TO: 并指定电子邮件的收件人


RCPT TO: <postmaster@example.net>
250 Ok

邮件服务器以 250 响应的事实应该意味着它接受了您在此处指定的 TO 地址。 最后,您可以键入 DATA 并键入电子邮件的其余部分,包括您要添加的任何额外标头,如 Subject,然后以单独一行上的单个句点结束


DATA
354 End data with <CR><LF>.<CR><LF>
Subject: Give Telnet a Chance 1
Hi,

All we are saying is give telnet a chance.
.
250 Ok: queued as 52A1EE3D117

当我在使用 telnet 测试电子邮件时,我通常在主题行中放置一个数字,以便我可以为每个测试不断递增它。 这样,如果某些电子邮件未送达,我可以知道哪些已送达,哪些未送达。

完成 DATA 部分并且电子邮件已排队后,您可以键入 quit 退出


quit
221 Bye
Connection closed by foreign host.

现在您有了一些使用 telnet 进行故障排除的方法,希望您不会将 telnet 贬低到 Linux 系统的杂物抽屉中。 当然,您可能不想将其用于远程 shell,但既然几乎每个人都使用 SSH,也许您可以拿出终端上的 telnet 来满足您所有其他明文网络需求,而不会被您的朋友责骂。

计算机网络图像,图片来自 Shutterstock.com

Kyle Rankin 是 Linux Journal 的技术编辑和专栏作家,也是 Purism 的首席安全官。 他是 Linux Hardening in Hostile NetworksDevOps TroubleshootingThe Official Ubuntu Server BookKnoppix HacksKnoppix Pocket ReferenceLinux Multimedia HacksUbuntu Hacks 的作者,也是许多其他 O'Reilly 书籍的撰稿人。 Rankin 经常就安全和开源软件发表演讲,包括在 BsidesLV、O'Reilly Security Conference、OSCON、SCALE、CactusCon、Linux World Expo 和 Penguicon 上。 您可以在 @kylerankin 上关注他。

加载 Disqus 评论