放弃 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");'

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

$ 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 条评论

我主要用 netcat 替换了 telnet,例如 nc -v <主机> <端口>,作为一种快速查看主机是否正在端口上监听的方法。它可能不如 s_client 提供的信息丰富,但我可以看到 s_client 对于加密连接的故障排除肯定更有用。感谢您提醒我这件事!

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

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

请给我除 telnet 之外的任何其他工具,它可以为我做到这一点。请注意:限制包括:操作系统安装后即可使用。

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

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

回复 ,作者 C. Beerse

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

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

© . All rights reserved.