标签 telnet 下的文章

Telnet 缺乏加密,这使得 OpenSSL 成为连接远程系统的更安全的选择。

 title=

telnet 命令是最受欢迎的网络故障排除工具之一,从系统管理员到网络爱好者都可以使用。在网络计算的早期,telnet 被用来连接到一个远程系统。你可以用 telnet 访问一个远程系统的端口,登录并在该主机上运行命令。

由于 telnet 缺乏加密功能,它在很大程度上已经被 OpenSSL 取代了这项工作。然而,作为一种智能的 pingtelnet 的作用仍然存在(甚至在某些情况下至今仍然存在)。虽然 ping 命令是一个探测主机响应的好方法,但这是它能做的 全部。另一方面,telnet 不仅可以确认一个活动端口,而且还可以与该端口的服务进行交互。即便如此,由于大多数现代网络服务都是加密的,telnet 的作用可能要小得多,这取决于你想实现什么。

OpenSSL s\_client

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

安装 OpenSSL

OpenSSL 可能已经安装在你的 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,你必须连接加密的端口。

交互式 OpenSSL

Web 浏览器和 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 的数据:

[...]
<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>

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: [email protected]
> rcpt to: [email protected]
> data
> Subject: Test 001
This is a test email.
.
> quit

检查你的邮件(在这个示例代码中,是 [email protected]),查看来自 [email protected] 的测试邮件。

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 = 23

accept 选项是服务器将监听传入 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 [email protected] --now

要注意 systemctl 命令是有顺序的。systemd 和 stunnel 包默认提供额外的模板单元文件。该模板允许你将 stunnel 的多个配置文件放到 /etc/stunnel 中,并使用文件名启动该服务。例如,如果你有一个 foobar.conf 文件,那么可以使用 systemctl start [email protected] 启动该 stunnel 实例,而无需自己编写任何单元文件。

如果需要,可以将此 stunnel 模板服务设置为在启动时启动:

systemctl enable [email protected]

客户端安装

本文的这部分假设你在客户端系统上以普通用户(拥有 sudo 权限)身份登录。安装 stunnel 和 telnet 客户端:

dnf -y install stunnel telnet

stunnel.pem 从远程服务器复制到客户端的 /etc/pki/tls/certs 目录。在此例中,远程 telnet 服务器的 IP 地址为 192.168.1.143

sudo scp [email protected]:/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:450

accept 选项是用于 telnet 会话的端口。connect 选项是你远程服务器的 IP 地址以及监听的端口。

接下来,启用并启动 stunnel:

systemctl enable [email protected] --now

测试你的连接。由于有一条已建立的连接,你会 telnetlocalhost 而不是远程 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. 你和服务器之间有个路由器宕掉了。
  2. 防火墙拦截了你的请求。

为了排除第 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 地址。如果你可以连上那么就是主机名的问题。

有很多发生的原因(以下是我见过的):

  1. 域名注册了吗?用 whois 来检验。
  2. 域名过期了吗?用 whois 来检验。
  3. 是否使用正确的主机名?用 dighost 来确保你使用的主机名解析到正确的 IP。
  4. 你的 A 记录正确吗?确保你没有偶然创建类似 smaba.example.comA 记录。

一定要多检查几次拼写和主机名是否正确(是 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

有这些原因:

  1. 确定 连接的是正确的服务器?
  2. 你的应用服务器没有侦听预期的端口。在服务器上运行 netstat -plunt 来查看它究竟在干什么并看哪个端口才是对的,实际正在监听中的。
  3. 应用服务器没有运行。这可能突然而又悄悄地发生在你启动应用服务器之后。启动服务器运行 ps auxfsystemctl 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中国 荣誉推出

声明:

在安装和使用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中国 荣誉推出