Telnet 缺乏加密，这使得 OpenSSL 成为连接远程系统的更安全的选择。telnet 命令是最受欢迎的网络故障排除工具之一，从系统管理员到网络爱好者都可以使用。在网络计算的早期，telnet 被用来连接到一个远程系统。你可以用 telnet 访问一个远程系统的端口，登录并在该主机上运行命令。由于 telnet 缺乏加密功能，它在很大程度上已经被 OpenSSL 取代了这项工作。然而，作为一种智能的 ping，telnet 的作用仍然存在（甚至在某些情况下至今仍然存在）。虽然 ping 命令是一个探测主机响应的好方法，但这是它能做的 全部。另一方面，telnet 不仅可以确认一个活动端口，而且还可以与该端口的服务进行交互。即便如此，由于大多数现代网络服务都是加密的，telnet 的作用可能要小得多，这取决于你想实现什么。OpenSSL s\_client对于大多数曾经需要 telnet 的任务，我现在使用 OpenSSL 的 s_client 命令。（我在一些任务中使用 curl，但那些情况下我可能无论如何也不会使用 telnet）。大多数人都知道 OpenSSL 是一个加密的库和框架，但不是所有人都意识到它也是一个命令。openssl 命令的 s_client 组件实现了一个通用的 SSL 或 TLS 客户端，帮助你使用 SSL 或 TLS 连接到远程主机。它是用来测试的，至少在内部使用与该库相同的功能。安装 OpenSSLOpenSSL 可能已经安装在你的 Linux 系统上了。如果没有，你可以用你的发行版的软件包管理器安装它：$ 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，你必须连接加密的端口。交互式 OpenSSLWeb 浏览器和 Web 服务器进行交互，可以使指向 80 端口的流量实际上被转发到 443，这是保留给加密 HTTP 流量的端口。知道了这一点，你就可以用 openssl 命令连接到加密的端口，并与在其上运行的任何网络服务进行交互。首先，使用 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 按回车键两次，你会收到 example.com/index.html 的数据：[...] Example Domain This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission. More information... Email 服务器你也可以使用 OpenSSL 的 s_client 来测试一个加密的 Email 服务器。要做到这点，你必须把你的测试用户的用户名和密码用 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 之类的明显的继任者，管理员有时会对它被排除在默认安装之外感到疑惑。答案是，它不再是必不可少的，它的作用越来越小，这 很好。网络安全很重要，所以要适应与加密接口互动的工具，这样你就不必在排除故障时禁用你的保护措施。via: https://opensource.com/article/21/5/drop-telnet-openssl作者：Seth Kenlon 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Telnet 是一种客户端-服务端协议，通过 TCP 的 23 端口连接到远程服务器。Telnet 并不加密数据，因此它被认为是不安全的，因为数据是以明文形式发送的，所以密码很容易被嗅探。但是，仍有老旧系统需要使用它。这就是用到 stunnel 的地方。stunnel 旨在为使用不安全连接协议的程序增加 SSL 加密。本文将以 telnet 为例介绍如何使用它。服务端安装使用 sudo 安装 stunnel 以及 telnet 的服务端和客户端：sudo dnf -y install stunnel telnet-server telnet添加防火墙规则，在提示时输入你的密码：firewall-cmd --add-service=telnet --perm firewall-cmd --reload接下来，生成 RSA 私钥和 SSL 证书：openssl genrsa 2048 > stunnel.key openssl req -new -key stunnel.key -x509 -days 90 -out stunnel.crt系统将一次提示你输入以下信息。当询问 Common Name 时，你必须输入正确的主机名或 IP 地址，但是你可以按回车键跳过其他所有内容。You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]: State or Province Name (full name) []: Locality Name (eg, city) [Default City]: Organization Name (eg, company) [Default Company Ltd]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []: Email Address []将 RSA 密钥和 SSL 证书合并到单个 .pem 文件中，并将其复制到 SSL 证书目录：cat stunnel.crt stunnel.key > stunnel.pem sudo cp stunnel.pem /etc/pki/tls/certs/现在可以定义服务和用于加密连接的端口了。选择尚未使用的端口。此例使用 450 端口进行隧道传输 telnet。编辑或创建 /etc/stunnel/telnet.conf：cert = /etc/pki/tls/certs/stunnel.pem sslVersion = TLSv1 chroot = /var/run/stunnel setuid = nobody setgid = nobody pid = /stunnel.pid socket = l:TCP_NODELAY=1 socket = r:TCP_NODELAY=1 [telnet] accept = 450 connect = 23accept 选项是服务器将监听传入 telnet 请求的接口。connect 选项是 telnet 服务器的内部监听接口。接下来，创建一个 systemd 单元文件的副本来覆盖原来的版本：sudo cp /usr/lib/systemd/system/stunnel.service /etc/systemd/system编辑 /etc/systemd/system/stunnel.service 来添加两行。这些行在启动时为服务创建 chroot 监狱。[Unit] Description=TLS tunnel for network daemons After=syslog.target network.target [Service] ExecStart=/usr/bin/stunnel Type=forking PrivateTmp=true ExecStartPre=-/usr/bin/mkdir /var/run/stunnel ExecStartPre=/usr/bin/chown -R nobody:nobody /var/run/stunnel [Install] WantedBy=multi-user.target接下来，配置 SELinux 以在你刚刚指定的新端口上监听 telnet：sudo semanage port -a -t telnetd_port_t -p tcp 450最后，添加新的防火墙规则：firewall-cmd --add-port=450/tcp --perm firewall-cmd --reload现在你可以启用并启动 telnet 和 stunnel。systemctl enable telnet.socket stunnel@telnet.service --now要注意 systemctl 命令是有顺序的。systemd 和 stunnel 包默认提供额外的模板单元文件。该模板允许你将 stunnel 的多个配置文件放到 /etc/stunnel 中，并使用文件名启动该服务。例如，如果你有一个 foobar.conf 文件，那么可以使用 systemctl start stunnel@foobar.service 启动该 stunnel 实例，而无需自己编写任何单元文件。如果需要，可以将此 stunnel 模板服务设置为在启动时启动：systemctl enable stunnel@telnet.service客户端安装本文的这部分假设你在客户端系统上以普通用户（拥有 sudo 权限）身份登录。安装 stunnel 和 telnet 客户端：dnf -y install stunnel telnet将 stunnel.pem 从远程服务器复制到客户端的 /etc/pki/tls/certs 目录。在此例中，远程 telnet 服务器的 IP 地址为 192.168.1.143。sudo scp myuser@192.168.1.143:/etc/pki/tls/certs/stunnel.pem /etc/pki/tls/certs/创建 /etc/stunnel/telnet.conf：cert = /etc/pki/tls/certs/stunnel.pem client=yes [telnet] accept=450 connect=192.168.1.143:450accept 选项是用于 telnet 会话的端口。connect 选项是你远程服务器的 IP 地址以及监听的端口。接下来，启用并启动 stunnel：systemctl enable stunnel@telnet.service --now测试你的连接。由于有一条已建立的连接，你会 telnet 到 localhost 而不是远程 telnet 服务器的主机名或者 IP 地址。[user@client ~]$ telnet localhost 450 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Kernel 5.0.9-301.fc30.x86_64 on an x86_64 (0) server login: myuser Password: XXXXXXX Last login: Sun May 5 14:28:22 from localhost [myuser@server ~]$via: https://fedoramagazine.org/securing-telnet-connections-with-stunnel/作者：Curt Warfield 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Telnet，是系统管理员登录远程服务器的一种协议和工具。然而，由于所有的通信都没有加密，包括密码，都是明文发送的。Telnet 在 SSH 被开发出来之后就基本弃用了。登录远程服务器，你可能不会也从未考虑过它。但这并不意味着 telnet 命令在调试远程连接问题时不是一个实用的工具。本教程中，我们将探索使用 telnet 解决所有常见问题：“我怎么又连不上啦？”这种讨厌的问题通常会在安装了像 Web服务器、邮件服务器、ssh 服务器、Samba 服务器等诸如此类的事之后遇到，用户无法连接服务器。telnet 不会解决问题但可以很快缩小问题的范围。telnet 用来调试网络问题的简单命令和语法：telnet <hostname or IP> <port> 因为 telnet 最初通过端口建立连接不会发送任何数据，适用于任何协议，包括加密协议。连接问题服务器有四个可能会遇到的主要问题。我们会研究这四个问题，研究它们意味着什么以及如何解决。本教程默认已经在 samba.example.com 安装了 Samba 服务器而且本地客户无法连上服务器。Error 1 - 连接挂起首先，我们需要试着用 telnet 连接 Samba 服务器。使用下列命令 (Samba 监听端口445)：telnet samba.example.com 445 有时连接会莫名停止：telnet samba.example.com 445 Trying 172.31.25.31... 这意味着 telnet 没有收到任何回应来建立连接。有两个可能的原因：你和服务器之间有个路由器宕掉了。防火墙拦截了你的请求。为了排除第 1 点，对服务器上进行一个快速 mtr samba.example.com 。如果服务器是可达的，那么便是防火墙（注意：防火墙总是存在的）。首先用 iptables -L -v -n 命令检查服务器本身有没有防火墙，没有的话你能看到以下内容：iptables -L -v -n Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 如果你看到其他东西那可能就是问题所在了。为了检验，停止 iptables 一下并再次运行 telnet samba.example.com 445 看看你是否能连接。如果你还是不能连接看看你的提供商或企业有没有防火墙拦截你。Error 2 - DNS 问题DNS 问题通常发生在你正使用的主机名没有解析到 IP 地址。错误如下：telnet samba.example.com 445 Server lookup failure: samba.example.com:445, Name or service not known 第一步是把主机名替换成服务器的 IP 地址。如果你可以连上那么就是主机名的问题。有很多发生的原因（以下是我见过的）：域名注册了吗？用 whois 来检验。域名过期了吗？用 whois 来检验。是否使用正确的主机名？用 dig 或 host 来确保你使用的主机名解析到正确的 IP。你的 A 记录正确吗？确保你没有偶然创建类似 smaba.example.com 的 A 记录。一定要多检查几次拼写和主机名是否正确（是 samba.example.com 还是 samba1.example.com）？这些经常会困扰你，特别是比较长、难记或其它国家的主机名。Error 3 - 服务器没有侦听端口这种错误发生在 telnet 可达服务器但是指定端口没有监听。就像这样：telnet samba.example.com 445 Trying 172.31.25.31... telnet: Unable to connect to remote host: Connection refused 有这些原因：你 确定 连接的是正确的服务器？你的应用服务器没有侦听预期的端口。在服务器上运行 netstat -plunt 来查看它究竟在干什么并看哪个端口才是对的，实际正在监听中的。应用服务器没有运行。这可能突然而又悄悄地发生在你启动应用服务器之后。启动服务器运行 ps auxf 或 systemctl status application.service 查看运行。Error 4 - 连接被服务器关闭这种错误发生在连接成功建立但是应用服务器建立的安全措施一连上就将其结束。错误如下：telnet samba.example.com 445 Trying 172.31.25.31... Connected to samba.example.com. Escape character is '^]'. Connection closed by foreign host. 最后一行 Connection closed by foreign host. 意味着连接被服务器主动终止。为了修复这个问题，需要看看应用服务器的安全设置确保你的 IP 或用户允许连接。成功连接成功的 telnet 连接如下：telnet samba.example.com 445 Trying 172.31.25.31... Connected to samba.example.com. Escape character is '^]'. 连接会保持一段时间只要你连接的应用服务器时限没到。输入 CTRL+] 中止连接，然后当你看到 telnet> 提示，输入 quit 并按回车：telnet samba.example.com 445 Trying 172.31.25.31... Connected to samba.example.com. Escape character is '^]'. ^] telnet> quit Connection closed. 总结客户程序连不上服务器的原因有很多。确切原因很难确定，特别是当客户是图形用户界面提供很少或没有错误信息。用 telnet 并观察输出可以让你很快确定问题所在节约很多时间。via: https://bash-prompt.net/guides/telnet/作者：Elliot Cooper 译者：XYenChi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在CentOS/RHEL/Scientific Linux 6 & 7 上安装Telnet
声明：在安装和使用Telnet之前，需要记住以下几点。在公网(WAN)中使用Telnet是非常不好的想法。它会以明文的格式传输登入数据。每个人都可以看到明文。如果你还是需要Telnet，强烈建议你只在局域网内部使用。你可以使用SSH作为替代方法。但是确保不要用root用户登录。Telnet是什么？Telnet 是用于通过TCP/IP网络远程登录计算机的协议。一旦与远程计算机建立了连接，它就会成为一个虚拟终端且允许你与远程计算机通信。在本篇教程中，我们会展示如何安装Telnet并且如何通过Telnet访问远程系统。安装打开终端并输入下面的命令来安装telnet：yum install telnet telnet-server -y 现在telnet已经安装在你的服务器上了。接下来编辑文件/etc/xinetd.d/telnet：vi /etc/xinetd.d/telnet 设置 disable = no:# default: on # description: The telnet server serves telnet sessions; it uses \ # unencrypted username/password pairs for authentication. service telnet { flags = REUSE socket_type = stream wait = no user = root server = /usr/sbin/in.telnetd log_on_failure += USERID disable = no } 保存并退出文件。记住我们不必在CentOS 7做这步。接下来使用下面的命令重启telnet服务：在CentOS 6.x 系统中：service xinetd start 让这个服务在每次重启时都会启动：在CentOS 6上：chkconfig telnet on chkconfig xinetd on 在CentOS 7上：systemctl start telnet.socket systemctl enable telnet.socket 让telnet的默认端口23可以通过防火墙和路由器。要让telnet端口可以通过防火墙，在CentOS 6.x系统中编辑下面的文件：vi /etc/sysconfig/iptables 加入如下行“-A INPUT -p tcp -m state --state NEW --dport 23 -j ACCEPT”：# Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW --dport 23 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT 保存并退出文件。重启iptables服务：service iptables restart 在CentOS 7中，运行下面的命令让telnet服务可以通过防火墙。firewall-cmd --permanent --add-port=23/tcp firewall-cmd --reload 就是这样。现在telnet服务就可以使用了。创建用户创建一个测试用户，比如用户名是“sk”，密码是“centos“:useradd sk passwd sk 客户端配置安装telnet包：yum install telnet 在基于DEB的系统中：sudo apt-get install telnet 现在，打开终端，尝试访问你的服务器（远程主机）。如果你的客户端是Linux系统，打开终端并输入下面的命令来连接到telnet服务器上。telnet 192.168.1.150 输入服务器上已经创建的用户名和密码：示例输出:Trying 192.168.1.150... Connected to 192.168.1.150. Escape character is '^]'. Kernel 3.10.0-123.13.2.el7.x86_64 on an x86_64 server1 login: sk Password: [sk@server1 ~]$ 如你所见，已经成功从本地访问远程主机了。如果你的系统是windows，进入开始 -> 运行 -> 命令提示符。在命令提示符中，输入命令：telnet 192.168.1.150 192.168.1.150是远程主机IP地址。现在你就可以连接到你的服务器上了。就是这样。干杯！via: http://www.unixmen.com/installing-telnet-centosrhelscientific-linux-6-7/作者：SK 译者：geekpi 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出