蚊章汇 - telnet
type: channel
link: https://linuxcn.bwsl.wang/tag/telnet/
items: 用 OpenSSL 替代 Telnet
items: 使用 stunnel 保护 telnet 连接
items: Telnet，爱一直在
items: 在CentOS/RHEL/Scientific Linux 6 & 7 上安装Telnet

用 OpenSSL 替代 Telnet
type: item
date: 2021-05-11T20:00:22+08:00
description: 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…

使用 stunnel 保护 telnet 连接
type: item
date: 2019-06-06T21:46:36+08:00
description: 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=-/u…

Telnet，爱一直在
type: item
date: 2018-02-22T18:59:32+08:00
description: 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 …

在CentOS/RHEL/Scientific Linux 6 & 7 上安装Telnet
type: item
date: 2015-02-25T15:28:00+08:00
description: 声明：在安装和使用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 输入服务器上已…