Telnet 是一种客户端-服务端协议,通过 TCP 的 23 端口连接到远程服务器。Telnet 并不加密数据,因此它被认为是不安全的,因为数据是以明文形式发送的,所以密码很容易被嗅探。但是,仍有老旧系统需要使用它。这就是用到 stunnel 的地方。
stunnel 旨在为使用不安全连接协议的程序增加 SSL 加密。本文将以 telnet 为例介绍如何使用它。
服务端安装 使用 sudo 安装 stunnel 以及 telnet 的服务端和客户端:
1 sudo dnf -y install stunnel telnet-server telnet
添加防火墙规则,在提示时输入你的密码:
接下来,生成 RSA 私钥和 SSL 证书:
1 2 openssl genrsa 2048 > stunnel.key openssl req -new -key stunnel.key -x509 -days 90 -out stunnel.crt
系统将一次提示你输入以下信息。当询问 Common Name
时,你必须输入正确的主机名或 IP 地址,但是你可以按回车键跳过其他所有内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 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 blankFor 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 证书目录:
1 2 cat stunnel.crt stunnel.key > stunnel.pemsudo cp stunnel.pem /etc/pki/tls/certs/
现在可以定义服务和用于加密连接的端口了。选择尚未使用的端口。此例使用 450 端口进行隧道传输 telnet。编辑或创建 /etc/stunnel/telnet.conf
:
1 2 3 4 5 6 7 8 9 10 11 cert = /etc/pki/tls/certs/stunnel.pemsslVersion = TLSv1chroot = /var/run/stunnelsetuid = nobodysetgid = nobodypid = /stunnel.pidsocket = l:TCP_NODELAY=1 socket = r:TCP_NODELAY=1 [telnet] accept = 450 connect = 23
accept
选项是服务器将监听传入 telnet 请求的接口。connect
选项是 telnet 服务器的内部监听接口。
接下来,创建一个 systemd 单元文件的副本来覆盖原来的版本:
1 sudo cp /usr/ lib/systemd/ system/stunnel.service / etc/systemd/ system
编辑 /etc/systemd/system/stunnel.service
来添加两行。这些行在启动时为服务创建 chroot 监狱。
1 2 3 4 5 6 7 8 9 10 11 12 13 [Unit] Description =TLS tunnel for network daemonsAfter =syslog.target network.target[Service] ExecStart =/usr/bin/stunnelType =forkingPrivateTmp =true ExecStartPre =-/usr/bin/mkdir /var/run/stunnelExecStartPre =/usr/bin/chown -R nobody:nobody /var/run/stunnel[Install] WantedBy =multi-user.target
接下来,配置 SELinux 以在你刚刚指定的新端口上监听 telnet:
1 sudo semanage port -a -t telnetd_port_t -p tcp 450
最后,添加新的防火墙规则:
现在你可以启用并启动 telnet 和 stunnel。
1 systemctl enable telnet.socket stunnel@telnet.service --now
要注意 systemctl
命令是有顺序的。systemd 和 stunnel 包默认提供额外的模板单元文件 。该模板允许你将 stunnel 的多个配置文件放到 /etc/stunnel
中,并使用文件名启动该服务。例如,如果你有一个 foobar.conf
文件,那么可以使用 systemctl start stunnel@foobar.service
启动该 stunnel 实例,而无需自己编写任何单元文件。
如果需要,可以将此 stunnel 模板服务设置为在启动时启动:
1 systemctl enable stunnel@telnet .service
客户端安装 本文的这部分假设你在客户端系统上以普通用户(拥有 sudo 权限 )身份登录。安装 stunnel 和 telnet 客户端:
1 dnf -y install stunnel telnet
将 stunnel.pem
从远程服务器复制到客户端的 /etc/pki/tls/certs
目录。在此例中,远程 telnet 服务器的 IP 地址为 192.168.1.143
。
1 2 sudo scp myuser@192 .168.1 .143 :/etc/pki/tls/certs/stunnel .pem /etc/pki/tls/certs/
创建 /etc/stunnel/telnet.conf
:
1 2 3 4 5 cert = /etc/pki/tls/certs/stunnel.pemclient =yes [telnet] accept =450 connect =192.168 .1.143 :450
accept
选项是用于 telnet 会话的端口。connect
选项是你远程服务器的 IP 地址以及监听的端口。
接下来,启用并启动 stunnel:
1 systemctl enable stunnel@telnet.service
测试你的连接。由于有一条已建立的连接,你会 telnet
到 localhost
而不是远程 telnet 服务器的主机名或者 IP 地址。
1 2 3 4 5 6 7 8 9 10 11 12 [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: XXXXXXXLast 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中国 荣誉推出