放弃 Telnet,选择 OpenSSL

Telnet 缺乏加密,这使得 OpenSSL 成为连接远程系统的更安全选择。
79 位读者喜欢这篇文章。
Lock

JanBaby,通过 Pixabay CC0。

telnet 命令是系统管理员到网络爱好者等任何人都最流行的网络故障排除工具之一。在网络计算的早期,telnet 被用于连接到远程系统。您可以使用 telnet 访问远程系统上的端口、登录并在该主机上运行命令。

由于 telnet 缺乏加密,它在很大程度上已被 OpenSSL 取代。然而,telnet 的相关性仍然存在(并且在某些情况下甚至今天仍然存在),作为一种智能 ping。虽然 ping 命令是探测主机响应能力的好方法,但这是它能做的全部。另一方面,Telnet 不仅可以确认活动端口,还可以与该端口上的服务进行交互。即便如此,由于大多数现代网络服务都是加密的,因此 telnet 的用处可能大大降低,具体取决于您要实现的目标。

OpenSSL s_client

对于曾经需要 telnet 的大多数任务,我现在使用 OpenSSL 的 s_client 命令。(我将 curl 用于某些任务,但这些情况是我可能无论如何都不会使用 telnet 的情况。)大多数人将 OpenSSL 视为加密的库和框架,但并非所有人都意识到它也是一个命令。openssl 命令的 s_client 组件实现了一个通用的 SSL 或 TLS 客户端,帮助您使用 SSL 或 TLS 连接到远程主机。它旨在用于测试,并且至少在内部使用与库相同的功能。

安装 OpenSSL

您的 Linux 系统上可能已安装 OpenSSL。如果未安装,您可以使用发行版的软件包管理器进行安装

$ sudo dnf install openssl

在 Debian 或类似系统上

$ sudo apt install openssl

安装完成后,验证它是否按预期响应

$ openssl version
OpenSSL x.y.z FIPS

验证端口访问

最基本的 telnet 用法是一项看起来像这样的任务

$ telnet mail.example.com 25
Trying 98.76.54.32...
Connected to example.com.
Escape character is '^]'.

这会打开一个与(在本例中)侦听端口 25(可能是邮件服务器)的任何服务的交互式会话。只要您获得访问权限,您就可以与服务进行通信。

如果端口 25 不可访问,则连接将被拒绝。

OpenSSL 类似,但通常交互性较差。要验证端口访问

$ openssl s_client -connect example.com:80
CONNECTED(00000003)
140306897352512:error:1408F10B:SSL [...]

no peer certificate available

No client certificate CA names sent

SSL handshake has read 5 bytes and written 309 bytes
Verification: OK

New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)

这仅仅是一个有针对性的 ping,虽然如此。正如您从输出中看到的那样,没有交换 SSL 证书,因此连接立即终止。要充分利用 openssl s_client,您必须以加密端口为目标。

交互式 OpenSSL

Web 浏览器和 Web 服务器进行交互,使得定向到端口 80 的流量实际上被转发到 443,即为加密 HTTP 流量保留的端口。了解这一点后,您可以使用 openssl 命令导航到加密端口,并与在其上运行的任何 Web 服务进行交互。

首先,使用 SSL 连接到端口。使用 -showcerts 选项会导致 SSL 证书打印到您的终端,从而使初始输出比 telnet 更详细

$ openssl s_client -connect example.com:443 -showcerts
[...]
    0080 - 52 cd bd 95 3d 8a 1e 2d-3f 84 a0 e3 7a c0 8d 87   R...=..-?...z...
    0090 - 62 d0 ae d5 95 8d 82 11-01 bc 97 97 cd 8a 30 c1   b.............0.
    00a0 - 54 78 5c ad 62 5b 77 b9-a6 35 97 67 65 f5 9b 22   Tx\.b[w..5.ge.."
    00b0 - 18 8a 6a 94 a4 d9 7e 2f-f5 33 e8 8a b7 82 bd 94   ..j...~/.3......

    Start Time: 1619661100
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
-
read R BLOCK

您将进入交互式会话。最终,此会话将关闭,但如果您迅速操作,您可以向服务器发送 HTTP 信号

[...]
GET / HTTP/1.1
HOST: example.com

Return 键两次,您将收到 example.com/index.html 的数据

[...]
<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents. You may use this
    domain in literature without prior coordination or asking for permission.</p>
    <p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>

电子邮件服务器

您还可以使用 OpenSSL 的 s_client 来测试加密的电子邮件服务器。为此,您必须将测试用户的用户名和密码以 Base64 编码。

这是一种简单的方法

$ perl -MMIME::Base64 -e 'print encode_base64("username");'
$ perl -MMIME::Base64 -e 'print encode_base64("password");'

记录下这些值后,您可以通过 SSL 连接到邮件服务器,通常在端口 587 上

$ openssl s_client -starttls smtp \
-connect email.example.com:587
> ehlo example.com
> auth login
##paste your user base64 string here##
##paste your password base64 string here##

> mail from: noreply@example.com
> rcpt to: admin@example.com
> data
> Subject: Test 001
This is a test email.
.
> quit

检查您的电子邮件(在本示例代码中为 admin@example.com)中是否有来自 noreply@example.com 的测试消息。

OpenSSL 还是 telnet?

telnet 仍然有一些用途,但它已不再是曾经不可或缺的工具。该命令已在许多发行版中降级为“旧版”网络软件包,但在没有 telnet-ng 或某些明显的后继者的情况下,管理员有时会对为什么默认安装中排除它感到困惑。答案是它不再是必需的,它变得越来越没用——这是好事。网络安全很重要,因此请熟悉与加密接口交互的工具,这样您就不必在故障排除期间禁用您的安全措施。

接下来阅读什么
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D\&D 爱好者。他曾在电影和计算机行业工作,通常同时进行。

6 条评论

我已将 telnet 大部分替换为 netcat,例如 nc -v <host> <port>,作为快速查看主机是否正在端口上侦听的方法。它可能不如 s_client 提供的信息丰富,但我可以看到 s_client 当然更适用于加密连接的故障排除。感谢您提醒我这件事!

作为系统管理员,我发现自己在使用只能使用预安装工具(随操作系统安装)的系统上,我确实需要检查与其他系统的连接。
第一步:`ping`。这表明到达远程系统的路由存在,并且 icmp 没有被任何中间防火墙阻止。

现在我需要检查远程侧端口上的服务是否可用。因此,我需要一个工具,我可以向其提供远程侧和端口号,它会显示另一侧有活动。

给我任何其他可以为我执行此操作的工具,而不是 telnet。请注意:限制包括:操作系统安装后即可使用。

您使用的是哪个发行版在启动时安装了 telnet?我不能指名道姓,因为我没有跟踪数据,但似乎我现在必须自己安装 telnet,而 OpenSSL 默认安装。

话虽如此,您的用例正是我在撰写 telnet 仍然有其用途时想到的那种情况。如果您没有处理加密协议,那么 telnet 非常有用。

回复 ,作者 C. Beerse

Telnet 对于使用某些类型的设备绝对是必不可少的,这些设备被创建为通过串行端口使用,并具有某种以太网到串行适配器,使其连接到网络。在大多数情况下,甚至没有计算机。

例如,我使用 LED 标牌,想想高速公路或加油站上的标牌;其中许多是在 90 年代建造和安装的,在某个时候,它们获得了网络功能,从而无需带着笔记本电脑跑到外面去重新编程雷雨中的标牌。有些程序可以更轻松地发送命令(但仍然不提供任何形式的加密,因为标牌对此一无所知),但归根结底,telnet 是发送和接收有关可能在数百英里外的标牌信息的最多功能工具。

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.